Por que todas as tabelas do MySQL InnoDB estão fragmentadas?

10

Por alguma razão, todas as tabelas do InnoDB no meu servidor MySQL estão sendo listadas como fragmentadas quando executo o mysqltuner. Eu instalei o servidor apenas algumas horas atrás (no OSX Lion) e ele possui um monte de dados novos importados de arquivos em lote.

Tentei converter todas as tabelas em um banco de dados para MYISAM e, com certeza, o número de tabelas fragmentadas diminuiu. Estranhamente, assim que converti essas tabelas para o InnoDB, a contagem de tabelas fragmentadas voltou a subir. Isso é contrário à minha pesquisa até agora, que sugere que a corrida ALTER TABLE table_name ENGINE=INNODB;deve corrigir a fragmentação.

Depois de pesquisar um pouco no Google, corri:

SELECT table_schema, table_name, data_free/1024/1024 AS data_free_MB 
FROM information_schema.tables
WHERE engine LIKE 'InnoDB' AND data_free > 0

Que supostamente lista todas as tabelas fragmentadas (na verdade, retorna o mesmo número de resultados que as saídas do mysqltuner para a contagem de tabelas fragmentadas). Cada entrada possui exatamente o mesmo número na data_free_MBcoluna (atualmente 7.00000000).

Isso é realmente um problema real ou algo que o mysqltuner está fazendo de errado? Se for um problema, como corrigi-lo?

EDITAR

Estou cada vez mais desconfiado de que sou um idiota e que a fragmentação de 7 MB é para todo o arquivo, não para cada tabela. Alguém pode confirmar se esse seria o caso?

Clive
fonte
Você realmente acha que 7 MB grátis são um problema?
David Schwartz
@DavidSchwartz Não faço idéia, foi por isso que perguntei;) Existem 2314 tabelas, cada uma com 7 MB de espaço livre, e não sei o que isso significa. Não sei por que o mysqltuner me mostraria esse número se não fosse um motivo potencial de preocupação. Eu esperava que alguém aqui fosse capaz de me dizer o quão preocupado seria com os números e o que posso fazer para atenuar o problema, já que os métodos "padrão" não funcionam
Clive
Migrando esta pergunta conforme a solicitação do usuário em um sinalizador.
Daniel Beck
A maioria dos detalhes que o mysqltuner mostra é apenas informativa. Nem tudo é um problema. Se for um problema, será dito claramente. Isso foi indicado como um problema?
John Gardeniers 15/08/2012
@JohnGardeniers Eu acredito que sim, a mensagem é: [!!] Total fragmented tables: 2314que eu tenho certeza que indica um problema (com as marcas duplas de exclamação vermelho)
Clive

Respostas:

5

Conforme meus comentários acima, nem toda a saída do sqltuner indica erros. A menos que o script indique claramente que é um problema, geralmente na próxima linha, seguido de sugestões de correção, então é apenas um item informativo.

John Gardeniers
fonte
3

Quando você ativou innodb_file_per_table , tudo o que você fez foi configurar um protocolo para fazer com que quaisquer novas tabelas do InnoDB fossem criadas em um .ibdarquivo externo . Todas as tabelas do InnoDB que você criou antes disso ainda estão incorporadas no ibdata1.

Com innodb_file_per_table desativado, sempre que você executar

ALTER TABLE table_name ENGINE=INNODB;

tudo o que faz é anexar os dados da tabela e as páginas de índice ao ibdata1. Isso fará com que a tabela exista em páginas contíguas e remova a fragmentação. A desvantagem é que o ibdata1 cresce rapidamente.

RECOMENDAÇÃO

Você precisará exportar todos os dados, remover ibdata1, ib_logfile0, ib_logfile1 e recarregar.

Eu escrevi como e por que fazer isso

ATUALIZAÇÃO 15-08-2012 12:05 EDT

Você pode procurar no próprio script mysqltuner.pl. IMHO Acho que está usando uma fórmula antiga para medir a fragmentação. Verifique se você possui a versão mais recente do mysqltuner.

Quanto à medição da fragmentação das tabelas do InnoDB armazenadas externamente, escrevi um post sobre isso em 11 de abril de 2012 (Veja a atualização na parte inferior de 19 de abril de 2012)

RolandoMySQLDBA
fonte
1
Ahhh ok, as coisas fazem muito mais sentido agora, obrigado. Acabei exportando os dados, limpando completamente o MySQL e depois reinstalando (mas adicionando innodb_file_per_tableao arquivo conf antes de iniciar o servidor e reimportar). Antes disso, eu estava recebendo todos os tipos de erros do InnoDB (os tipos realmente ruins ... aqueles que significavam que eu tinha que executar innodb_force_recoveryno nível 6 apenas para obter os dados!), E todos os tipos de 'data do arquivo de log o futuro!' erros. Essas parecem ter parado agora, mas ainda tenho algumas tabelas fragmentadas. Vou ficar de olho nele, obrigado novamente pela contribuição
Clive
impressionante! isso é muito informativo. Obrigado @RolandoMySQLDBA!
Sudhi 6/03/2013