Como reduzo o arquivo innodb ibdata1 sem descarregar todos os bancos de dados?

24

O InnoDB armazena todas as tabelas em um arquivo grande ibdata1.

Depois de soltar uma tabela grande, o arquivo mantém seu tamanho, independentemente do tamanho da tabela. Como posso reduzir esse arquivo sem precisar despejar e reimportar todo o banco de dados (que possui várias centenas de GB no total)?

Eu acho que o motivo é porque você ainda é capaz de reverter a queda. No meu caso, não preciso.

rubo77
fonte

Respostas:

30

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.

RolandoMySQLDBA
fonte
11
Correção menor: MSSQL e PostgreSQL podem reverter DDL. Oracle não pode. De fato, a Oracle emite uma confirmação implícita quando vê DDL!
Chris Travers #
11
@RolandoMySQLDBA desde que versão do MySQL essas "boas notícias" de encolhimento automático funcionam?
Gavriel 23/09
@ Gavriel - Eu acho que você interpretou mal. Você ainda precisa despejar; remova ibdata1; reiniciar; e recarregar. No-autoshrink de ibdata1. (Mudar * iblog é agora mais simples.)
Rick James
2

O InnoDB armazena apenas todas as suas tabelas do InnoDB no ibdata1 se você não usar a seguinte configuração no arquivo de padrões my.cnf:

innodb_file_per_table = 1

DROP TABLE (e DROP DATABASE) não podem ser revertidos.

Essa não é a razão pela qual você não pode reduzir o ibdata1.

Esta é uma explicação abreviada, mas ibdata1 contém informações internas do InnoDB, além dos dados da tabela. Pelo que entendi, para reduzi-lo seria necessário desfragmentá-lo, o que não é uma operação suportada.

Michael - sqlbot
fonte