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 TABLEuma tabela do InnoDB, o ibdata1 cresce rapidamente. Dados que são descartados usando DROP TABLEe DROP DATABASEnã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=1permitirá 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 TABLEmas 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 TABLEposterior reduzirá o .ibdarquivo do espaço de tabela para qualquer tabela do InnoDB.