innodb A tabela está cheia e autoexpand

2

Oi eu uso o bacula e uma das tabelas está cheia:

JobId 8946: Fatal error: sql_create.c:860 Fill File table Query failed: INSERT INTO File (FileIndex, JobId, PathId, FilenameId, LStat, MD5, DeltaSeq) SELECT batch.FileIndex, batch.JobId, Path.PathId, Filename.FilenameId,batch.LStat, batch.MD5, batch.DeltaSeq FROM batch JOIN Path ON (batch.Path = Path.Path) JOIN Filename ON (batch.Name = Filename.Name): ERR=The table 'File' is full

Então eu corro:

mysql> show table status from current_bacula like 'File';
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows     | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free  | Auto_increment | Create_time         | Update_time | Check_time | Collation         | Checksum | Create_options | Comment |
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| File | InnoDB |      10 | Compact    | 52153488 |            142 |  7419723776 |               0 |   2593128448 | 2605711360 |      569929045 | 2013-04-15 21:03:59 | NULL        | NULL       | latin1_swedish_ci |     NULL |                |         |
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
1 row in set (0.31 sec)

O arquivo my.cnf possui:

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:12800M

Pelo que entendi o comando:

ALTER TABLE tbl_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;

funciona apenas para o mecanismo MyISAM não funciona? (Por favor me corrija se eu estiver errado)

Então, minha pergunta é: Posso modificar somente o autotextend: max por exemplo, algo assim:

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M

Devo realizar outra ação além de reiniciar o serviço. é seguro? Eu sei que posso definir outro arquivo ibdataN, mas gostaria de impactar o mínimo possível os outros bancos de dados atualmente em execução no servidor.

O que você me recomenda?

Eu tenho o mysql-5.1.67-1.el6_3.x86_64 no CentOS 6.4

Obrigado antecipadamente!

    
por sebelk 20.12.2013 / 15:57

1 resposta

1

Você pode iniciar outro arquivo ibdata

No entanto, antes disso, você precisa saber o que ocupa o ibdata1 e o ibdata2 .

  • Dados da tabela (se innodb_file_per_table estiver desativado)
  • Índices de tabela (se innodb_file_per_table estiver desativado)
  • Dados do MVCC (Controle de Concorrência Multiversionada)
  • Metadados de tabela
  • Segmentos de reversão
  • Anular Registos
  • Buffer de gravação dupla

Arquitetura InnoDB

Eutinhalidadocomaadiçãodeibdata3nopassadocomumdosclientesdomeuantigoempregador(VejameupostdoDBAStackExchange Como resolver" A tabela… está cheia "com" innodb_file_per_table "? ). Foi necessário porque o ibdata2 atingiu o limite ext3 de 2,196,875,759,616 bytes. Você não tem essa situação.

Você poderia seguir com sua ideia

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M

mas é melhor remover totalmente o max

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend

CAVEAT

O motivo pelo qual você ficou sem espaço tem que desfazer os logs. O arquivo ibdata contém 1023 logs de desfazer. Esses registros exigem espaço de manobra para operar. Sem essa sala de manobra interna, as informações do MVCC não podem conter instantâneos de dados no caso de uma reversão. Sua sala de manobra interna é 2605711360 ou cerca de 2.5G , o que aparentemente não é suficiente. Com o cliente do meu empregador anterior, eles tinham 106G de espaço de manobra e não era suficiente para eles .

SUGESTÃO

Se você quiser deixar todos os seus dados dentro de ibdata1 e ibdata2 , mude a configuração para

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M

você precisa monitorar a sala de manobra.

Você poderia monitorar isso assim

IBDATA_FILESIZE=8187281408
#
# 8187281408 is 7680M + 128M
#
SQL="SELECT SUM(data_length+index_length)"
SQL="${SQL} FROM information_schema.tables WHERE ENGINE='InnoDB'"
IBDATA_DATAINDEX='mysql -uroot -p... -ANe"${SQL}"'
(( WIGGLE_ROOM = IBDATA_FILESIZE - IBDATA_DATAINDEX )))
echo ${WIGGLE_ROOM}

Toda vez que você executar isso, você saberá quanto espaço livre. Você não precisará saber qual tabela está envolvida porque qualquer tabela InnoDB tem o potencial de reclamar que está cheia quando a sala de manobra (espaço para desfazer a informação) não está lá.

    
por 22.12.2013 / 06:36

Tags