Este é um dos tópicos mais controversos que já lidei ao longo dos anos como um DBA do MySQL e no DBA StackExchange.
Para dizer o mínimo, simplesmente não há outra maneira de reduzir o ibdata1 . Com innodb_file_per_table desativado, toda vez que você executa OPTIMIZE TABLE
uma tabela do InnoDB, o ibdata1 cresce rapidamente. Dados que são descartados usando DROP TABLE
e DROP DATABASE
não podem ser revertidos porque são DDL, não DML. Acredito que Oracle e MSSQL podem reverter DDL. O MySQL não pode fazer isso.
Existem várias classes de informações que residem no ibdata1
- Dados da tabela
- Índices de tabela
- Tabela MetaData
- Dados de controle do MVCC
- Buffer de gravação dupla (gravação em segundo plano para evitar a dependência do cache do SO)
- Inserir buffer (gerenciamento de alterações em índices secundários não exclusivos)
O uso innodb_file_per_table=1
permitirá criar novas tabelas com dados e índices de tabela sendo criados fora do ibdata1. Você pode extrair quaisquer tabelas ainda dentro do ibdata1 usando ALTER TABLE ... ENGINE=InnoDB;
ou OPTIMIZE TABLE
mas isso deixará esse grande espaço não utilizado no ibdata1.
Não obstante, você deve limpar a infraestrutura do InnoDB. Eu já escrevi postagens do StackExchange sobre como e por que fazer isso:
Boas notícias
Você só precisa despejar os dados, recarregar mais uma vez e nunca revisar esse problema novamente . A execução OPTIMIZE TABLE
posterior reduzirá o .ibd
arquivo do espaço de tabela para qualquer tabela do InnoDB.