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

10

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

Eu tentei converter todas as tabelas em um banco de dados para o MYISAM, e com certeza o número de tabelas fragmentadas caiu. Estranhamente, porém, assim que eu converti essas tabelas de volta para o InnoDB, a contagem de tabelas fragmentadas voltou a ser disparada. Isso é contrário à minha pesquisa até agora, o que sugere que executar ALTER TABLE table_name ENGINE=INNODB; deve corrigir a fragmentação.

Depois de pesquisar um pouco, eu 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 (ele realmente retorna o mesmo número de resultados que as saídas do mysqltuner para a contagem de tabela fragmentada). Cada entrada individual tem exatamente o mesmo número na coluna data_free_MB (atualmente 7.00000000).

Isso é realmente um problema real ou algo que o mysqltuner está fazendo errado? Se é um problema, como conserto?

EDITAR

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

    
por Clive 15.08.2012 / 11:10

2 respostas

5

De acordo com meus comentários acima, nem todas as saídas do sqltuner indicam erros. A menos que o script afirme claramente que é um problema, geralmente na próxima linha, seguido por sugestões de correção, trata-se apenas de um item informativo.

    
por 15.08.2012 / 14:58
3

Quando você ativou innodb_file_per_table , tudo que você fez foi configurar um protocolo para fazer qualquer nova tabela InnoDB ser criada em um arquivo .ibd externo. Todas as tabelas InnoDB que você criou antes disso ainda estão embutidas no ibdata1.

Com innodb_file_per_table desativado, sempre que você executar

ALTER TABLE table_name ENGINE=INNODB;

tudo o que ele faz é anexar os dados e as páginas de índice da tabela 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 2012-08-15 12:05 EDT

Você pode querer olhar para o próprio script mysqltuner.pl. IMHO eu acho que está usando uma fórmula antiga para medir a fragmentação. Certifique-se de ter a última versão do mysqltuner.

Quanto a medir a fragmentação de tabelas InnoDB armazenadas externamente, Eu escrevi um post sobre isso em 11 de abril de 2012 (Veja a Atualização na parte inferior para 19 de abril de 2012)

    
por 15.08.2012 / 17:37

Tags