Em um servidor de produção, alterei "innodb_file_per_table=ON" e posso ver arquivos de tablespace separados para cada tabela em meu servidor. Eu usei o particionamento para tabelas, portanto, para cada partição, há um arquivo .ibd separado.
Mas posso ver o arquivo "ibdata1" anterior de tamanho 10 Gb. Estou um pouco curioso se devo excluí-lo ou não?
O MySQL ainda usa o antigo arquivo "ibdata" do espaço de tabela compartilhado?
Se eu excluir o arquivo de espaço de tabela compartilhado "ibdata1", haverá algum impacto no servidor? Será que vai causar algum problema?
Ótima pergunta e um problema muito comum.
Quando você alterou a configuração do servidor para
innodb_file_per_table = 1
, as tabelas ainda residiam no tablespace comum. Você ainda tinha que recriar aqueles usandoALTER TABLE ENGINE=InnoDB
(ou qualquer outra operação que forçasse uma recriação de tablespace).Depois de fazer isso, por que o MySQL ainda tem um enorme ib_data1? A verdade é que o InnoDB não pode realmente encolher (desfragmentar) seus arquivos de tablespace.
innodb_file_per_table
Isso não é um grande problema na maioria dos casos, porque o espaço livre dentro de cada arquivo pode ser usado por outros dados, índices, etc.No entanto, o tablespace comum é especial. Mesmo que não contenha nenhuma tabela ou informação de índice, é sempre obrigatório, pois armazena dados comuns como o dicionário de dados, buffer de alteração, etc. Portanto, se você excluí-lo, acabará com uma instalação mysql totalmente inutilizável. Respondendo suas perguntas: 1) Sim, ainda está sendo usado e 2) você não poderá reiniciar o mysql novamente se excluí-lo. Mas, obviamente, a maior parte do arquivo ibdata1 estará vazia, só que é muito difícil mover os endereços das páginas.
Aqui está uma representação pictórica da arquitetura InnoDB para que você possa ver o conteúdo de ibdata1
Então, você tem que viver com o arquivo de 10 GB para sempre? Bom, com certeza é uma possibilidade, mas existem formas de se livrar dela, dependendo da versão do servidor e da sua necessidade de disponibilidade:
Esta é uma operação muito comum sobre a qual me perguntaram e executei um MySQL DBA. Espero que isto ajude.