Eu tenho a resposta completa para este.
Uma vez que innodb_file_per_table seja instalado, e novas tabelas do InnoDB possam ser reduzidas usando ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
Isso reduzirá os novos .ibd
arquivos GARANTIDOS.
Se você executar ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
em uma tabela do InnoDB criada antes de usar o innodb_file_per_table, ele retirará os dados e índices dessa tabela do arquivo ibdata1 e os armazenará em um .ibd
arquivo. Isso deixará um pombo permanente inteiro no ibdata1 que nunca poderá ser reutilizado .
O ibdata1
arquivo normalmente abriga quatro tipos de informações
Aqui está a maneira garantida de reduzir o arquivo ibdata1 praticamente para sempre ...
PASSO 01) MySQLDump todos os bancos de dados em um arquivo de texto SQL (chame-o SQLData.sql)
PASSO 02) Solte todos os bancos de dados (exceto esquemas mysql, information_schema e performance_schema)
PASSO 03) Shutdown mysql
PASSO 04) 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
innodb_data_file_path=ibdata1:10M:autoextend
Nota: Qualquer que seja o seu conjunto para innodb_buffer_pool_size, verifique se innodb_log_file_size é 25% de innodb_buffer_pool_size.
- PASSO 05) Exclua ibdata1, ib_logfile0 e ib_logfile1 ( consulte a atualização abaixo antes de excluir! )
Neste ponto, deve haver apenas o esquema mysql em / var / lib / mysql
- PASSO 06) Reinicie o mysql
Isso recriará ibdata1 em 10 MB (não configure a opção), ib_logfile0 e ib_logfile1 em 1G cada
- PASSO 07) Recarregar SQLData.sql no mysql
ibdata1
crescerá, mas conterá apenas metadados da tabela e dados intermitentes do MVCC.
Cada tabela do InnoDB existirá fora do ibdata1
Suponha que você tenha uma tabela do InnoDB chamada mydb.mytable. Se você entrar /var/lib/mysql/mydb
, verá dois arquivos representando a tabela
mytable.frm
(Cabeçalho do mecanismo de armazenamento)
mytable.ibd
(Página inicial dos dados e índices da tabela para mydb.mytable
)
ibdata1
nunca mais conterá dados e índices do InnoDB.
Com a opção innodb_file_per_table/etc/my.cnf
, você pode executar o OPTIMIZE TABLE mydb.mytable
OR ALTER TABLE mydb.mytable ENGINE=InnoDB;
e o arquivo /var/lib/mysql/mydb/mytable.ibd
diminuirá.
Eu fiz isso várias vezes na minha carreira como um DBA do MySQL sem nem um único problema depois disso. De fato, na primeira vez em que fiz isso, reduzi um arquivo ibdata1 de 50 GB em 50 MB.
De uma chance. Se você tiver outras dúvidas, envie-me um e-mail. Confie em mim. Isso funcionará a curto prazo e a longo prazo.
UPDATE 2013-07-02 15:08 EDT
Há uma ressalva que tenho a esse respeito que atualizei em outros posts meus, mas perdi isso: estou atualizando minha resposta um pouco mais com innodb_fast_shutdown porque eu costumava reiniciar o mysql e parar o mysql para fazer isso. Agora, essa etapa é vital porque todas as transações não confirmadas podem ter outras partes móveis dentro e fora dos logs de transações do InnoDB ( consulte Infra-estrutura do InnoDB ).
Observe que definir innodb_fast_shutdown como 2 também limparia os logs, mas ainda existem mais partes móveis e são selecionadas no Crash Recovery durante a inicialização do mysqld. Configuração de 0 é melhor.