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.
innodb_fast_shutdown=0
deve ser definida no MySQL, antes de desligá-la para excluir os arquivos de log! (ib_logfile0
eib_logfile1
) Caso contrário, você poderá perder dados!Veja bug .
Eu sempre uso innodb_file_per_table em bancos de dados grandes.
fonte
ibdata1
, a alternativa ao arquivo-per-mesa. Pelo menos, é possível reduzir um .ibd usandooptimize table
, o que é trivial em comparação com o ibdata1.innodb_file_per_table é ativado por padrão no MariaDB.
fonte
A razão pela qual optei por não usar
innodb_file_per_table
é que cada tabela é colocada em seu próprio arquivo, o que significa que cada tabela recebe sua própria sobrecarga separada (assinaturas de arquivo etc.), que faz com que o tamanho total e total doMySQL
diretório seja maior do que se estivesse usando um espaço de tabela compartilhado. Além disso, há mais espaço desperdiçado devido à folga do cluster ao ter vários arquivos pequenos em vez de um único e grande.É verdade que a sobrecarga adicional não é uma quantia enorme no grande esquema, especialmente se você estiver usando uma unidade grande ou tiver um banco de dados gigante, mas para mim (e provavelmente muitos "usuários domésticos"), tudo foi adicionado e ainda era demais para a pequena unidade com clusters grandes onde eu mantinha minha loja MySQL.
Por exemplo, meu armazenamento de banco de dados com meus bancos de dados WordPress e alguns outros bancos de dados pequenos (phpBB, dev, alguns testes de AMP etc.), convertendo para tabela, alterou de 32 MB para 50 MB, e isso nem sequer inclui o
ibdata1
que ainda requer um mínimo de 10 MB , para um total de pelo menos 60 MB .Como eu disse, isso pode não ser muito problemático para algumas pessoas, especialmente para as empresas, mas se você é um usuário doméstico que hospeda apenas seu site, blog etc., pode ser um fator importante em coisas como escolher um provedor de host porque muitos hosts limitam o tamanho do seu banco de dados, além do uso total do disco.
fonte
IBDATA1
). Passou de 30 MB para ~ 85 MB. Excluindo tudo e importando um despejo do zero, acabei com 69 MB em vez dos 30 MB anteriores (um palpite sobre qual banco de dados ocupava mais da metade dele ☺). Por alguma razão, apesar de usar por tabela, o meuibdata1
ainda tem 18 MB. ☹Só para adicionar um pouco mais de informação
Como o mysql 5.6.6 está ativado por padrão
fonte
com innodb_file_per_table = 1, a tabela suspensa pode ficar mais lenta, veja aqui
fonte