Tenho alguns servidores de produção cujos ibdata
arquivos aumentam de tamanho dia a dia.
Já consumiu 290 GB de espaço.
As tabelas nos servidores são principalmente InnoDB e há altas solicitações de leitura e gravação.
O tamanho do arquivo de log também está aumentando. Há uma enorme quantidade de dados nas tabelas.
Como posso controlar o tamanho crescente de ambos?
não estou usando innodb_file_per_table
.
Tenha em mente que o arquivo mais ocupado na infraestrutura do InnoDB é /var/lib/mysql/ibdata1
Este arquivo normalmente abriga muitas classes de informações (quando innodb_file_per_table é 0)
Muitas pessoas criam vários arquivos ibdata esperando um melhor gerenciamento e desempenho do espaço em disco. Isso não ajuda.
Infelizmente, OPTIMIZE TABLE contra uma tabela InnoDB armazenada em ibdata1 faz duas coisas:
Você pode separar dados de tabela e índices de tabela de ibdata1 e gerenciá-los de forma independente usando innodb_file_per_table . Para reduzir o ibdata1 de uma vez por todas, você deve fazer o seguinte
Etapa 01) MySQLDump todos os bancos de dados em um arquivo de texto SQL (chame-o SQLData.sql) ( mais detalhes aqui )
Etapa 02) Elimine todos os bancos de dados (exceto
mysql
,performance_schema
einformation_schema
)Etapa 03) Desligar o mysql
Etapa 04) Adicione as seguintes linhas ao /etc/my.cnf
Nota: Seja qual for o seu conjunto para innodb_buffer_pool_size, certifique-se de que innodb_log_file_size seja 25% de innodb_buffer_pool_size.
Etapa 05) Excluir ibdata1, ib_logfile0 e ib_logfile1
Neste ponto, deve haver apenas o esquema mysql em /var/lib/mysql
Passo 06) Reinicie o mysql
Isso recriará ibdata1 em 10 MB, ib_logfile0 e ib_logfile1 em 1 G cada
Etapa 07) Recarregue 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, verá dois arquivos representando a tabela
ibdata1 nunca mais conterá dados e índices do 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
será reduzido.Eu fiz isso muitas vezes na minha carreira como DBA MySQL
Na verdade, na primeira vez que fiz isso, reduzi um arquivo ibdata1 de 50 GB em 500 MB.
De uma chance. Se você tiver mais dúvidas sobre isso, envie-me um e-mail. Confie em mim. Isso funcionará no curto prazo e no longo prazo. !!!
Se você quiser ver quantos dados reais estão armazenados no MyISAM e no InnoDB, execute esta consulta: