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_MB
coluna (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?
[!!] Total fragmented tables: 2314
que eu tenho certeza que indica um problema (com as marcas duplas de exclamação vermelho)Respostas:
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.
fonte
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
.ibd
arquivo 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
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
Oct 29, 2010
: Como limpar um mecanismo de armazenamento mysql InnoDB?Jul 05, 2012
: Mova ibdata1, configure innodb_data_file_pathATUALIZAÇÃ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)
fonte
innodb_file_per_table
ao 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 executarinnodb_force_recovery
no 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