Eu tenho um banco de dados MySQL que contém uma grande quantidade de dados (100-200 GB - um monte de medições científicas). A grande maioria dos dados é armazenada em uma tabela Sample
. Agora estou criando uma réplica escrava do banco de dados e queria aproveitar as vantagens innodb_file_per_table
durante o processo. Então configurei innodb_file_per_table
na minha configuração slave e importei o dump do banco de dados. Para minha surpresa, falhou com
ERRO 1114 (HY000) na linha 5602: A tabela 'Sample' está cheia
Atualmente, o arquivo Sample.ibd
tem cerca de 93 GB, com mais de 600 GB de espaço livre disponível na partição, portanto, não é um problema de espaço livre em disco. Nem parece estar atingindo qualquer tipo de limite do sistema de arquivos (estou usando ext4).
Eu ficaria grato por qualquer idéia do que poderia ser a causa, ou o que investigar.
Atualização: estou usando mysql Ver 14.14 Distrib 5.1.66, for debian-linux-gnu (x86_64)
.
SELECT @@datadir; -- returns `/home/var/lib/mysql/`
SHOW VARIABLES LIKE '%innodb_data_file_path%'; -- ibdata1:10M:autoextend
df -h /home/var/lib/mysql/
768G 31G 699G 5% /home
FATOS
Você disse que está usando
ext4
. O limite de tamanho do arquivo é 16 TB. Assim,Sample.ibd
não deve ser cheio.Você disse que o seu
innodb_data_file_path
éibdata1:10M:autoextend
. Assim, o próprio arquivo ibdata1 não tem limite de tamanho, exceto do sistema operacional.Por que esta mensagem está chegando? Observe que a mensagem é "A tabela ... está cheia", não "O disco ... está cheio". Esta condição de tabela cheia é do ponto de vista lógico . Pense no InnoDB. Que interações estão acontecendo?
Meu palpite é que o InnoDB está tentando carregar 93 GB de dados como uma única transação. De onde
Table is Full
emanaria a mensagem? Eu olharia para o ibdata1, não em termos de seu tamanho físico (que você já descartou), mas em termos de quais limites de transação estão sendo atingidos.O que está dentro de ibdata1 quando innodb_file_per_table está habilitado e você carrega novos dados no MySQL?
ibdata1
Minhas suspeitas me dizem que os Undo Logs e/ou Redo Logs são os culpados.
O que são esses registros? De acordo com o livro
Capítulo 10: "Motores de armazenamento" Página 203 Os parágrafos 3,4 dizem o seguinte:
ANÁLISE
Existem 1023 logs de desfazer dentro de ibdata1 (consulte Segmentos de reversão e espaço de desfazer) . Como os logs de desfazer mantêm cópias dos dados como eles apareceram antes do recarregamento, todos os 1.023 logs de desfazer atingiram seu limite. De outra perspectiva, todos os 1023 Undo Logs podem ser dedicados à única transação que carrega a
Sample
tabela.MAS ESPERE...
Você provavelmente está dizendo "Estou carregando uma
Sample
tabela vazia". Como os logs de desfazer estão envolvidos? Antes de aSample
tabela ser carregada com 93 GB de dados, ela estava vazia. A representação de cada linha que não existia deve ocupar algum espaço de limpeza nos logs de desfazer. Preencher 1.023 logs de desfazer parece trivial, dada a quantidade de dados despejados em arquivosibdata1
. Não sou a primeira pessoa a suspeitar disso:Na documentação do MySQL 4.1, observe
Posted by Chris Calender on September 4 2009 4:25pm
:Aqui está o relatório de bug para MySQL 5.0: http://bugs.mysql.com/bug.php?id=18828
SUGESTÕES
Quando você cria o mysqldump da
Sample
tabela, por favor use --no-autocommitIsso colocará um explícito
COMMIT;
após cada arquivoINSERT
. Em seguida, recarregue a tabela.Se isso não funcionar ( você não vai gostar disso ), faça isso
Isso fará com que cada INSERT tenha apenas uma linha. O mysqldump será muito maior (10+ vezes maior) e pode levar de 10 a 100 vezes mais para recarregar.
Em ambos os casos, isso evitará que os logs de desfazer sejam inundados.
De uma chance !!!
ATUALIZAÇÃO 2013-06-03 13:05 EDT
SUGESTÃO ADICIONAL
Se a tabela do sistema InnoDB (também conhecida como ibdata1) atingir um limite de tamanho de arquivo e os logs de desfazer não puderem ser usados, você poderá simplesmente adicionar outro tablespace do sistema (ibdata2).
Acabei de encontrar esta situação há apenas dois dias. Atualizei meu post antigo com o que fiz: Veja Design de banco de dados - Criando vários bancos de dados para evitar a dor de cabeça do limite no tamanho da tabela
Em essência, você precisa alterar innodb_data_file_path para acomodar um novo arquivo de tablespace do sistema. Deixe-me explicar como:
CENÁRIO
No disco (ext3), o servidor do meu cliente tinha o seguinte:
A configuração foi
Observe que
ibdata2
cresceu para 2196875759616, que é2145386484M
.Eu tive que incorporar o tamanho do arquivo
ibdata2
no innodb_data_file_path e adicionaribdata3
Quando reiniciei o mysqld, funcionou:
Em 40 horas,
ibdata3
cresceu para 31G. MySQL estava mais uma vez funcionando.Eu tive o mesmo problema e fiz apenas uma coisa e funcionou.
Você parece ter um tamanho máximo muito baixo para o
innodb_data_file_path
seumy.cnf
arquivo de configuração. Basta alterar o código abaixo -Observação importante Você não pode hospedar mais
512MB
de dados em todas asInnoDB
tabelas combinadas.Você também pode alternar para um esquema innodb por tabela usando
innodb_file_per_table
.