Eu escrevi um procedimento de limpeza para o InnoDB no StackOverflow
link (29 de outubro de 2010)
Aqui está
Para encolher o ibdata1 de uma vez por todas, você deve fazer o seguinte:
1) MySQLDump todos os bancos de dados em um arquivo de texto SQL (chamá-lo SQLData.sql)
2) Solte todos os bancos de dados (exceto o esquema mysql)
3) Desligamento do mysql
4) Adicione as seguintes linhas ao /etc/my.cnf
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
Sidenote: Seja qual for o seu conjunto para innodb_buffer_pool_size, certifique-se de innodb_log_file_size é 25% de innodb_buffer_pool_size.
5) Exclua ibdata1, ib_logfile0 e ib_logfile1
Neste ponto, deve haver apenas o esquema mysql em / var / lib / mysql
6) Reinicie o mysql
Isso irá recriar ibdata1 em 10MB, ib_logfile0 e ib_logfile1 em 1G cada
7) Recarregue o SQLData.sql no mysql
ibdata1 crescerá, mas conterá apenas metadados de tabela
Cada tabela InnoDB existirá fora do ibdata1
Suponha que você tenha uma tabela InnoDB chamada mydb.mytable. Se você entrar em / var / lib / mysql / mydb, você verá dois arquivos representando a tabela
- mytable.frm (cabeçalho do mecanismo de armazenamento)
- mytable.ibd (Início de dados de tabela e índices de tabela para mydb.mytable)
ibdata1 nunca mais conterá dados e índices InnoDB.
Com a opção innodb_file_per_table em /etc/my.cnf, você pode executar OPTIMIZE TABLE mydb.mytable e o arquivo /var/lib/mysql/mydb/mytable.ibd irá encolher.
Eu fiz isso muitas vezes na minha carreira como DBA MySQL
Na verdade, na primeira vez que fiz isso, recolhi um arquivo ibdata1 de 50 GB em 500 MB.
Experimente. Se você tiver mais dúvidas sobre isso, envie-me um email. Confie em mim. Isso funcionará no curto prazo e no longo prazo. !!!