Qual é o arquivo ibdata1 no meu diretório / var / lib / mysql?


32

Ao fazer login no painel de controle do Webmin, notei que praticamente todo o espaço em disco está cheio. Procurei nos dez maiores arquivos / diretórios do meu sistema e descobri que um arquivo chamado ibdata1 ocupa cerca de 94 GB de espaço. Ele reside no meu diretório / var / lib / mysql.

O que ibdata1 faz? Estou seguro para removê-lo? Minha suposição é que é algum tipo de despejo, mas isso é apenas um palpite.

Respostas:


38

O arquivo ibdata1 é o espaço de tabela do sistema para a infraestrutura do InnoDB.

Ele contém várias classes de informações vitais para o InnoDB

  • Páginas de dados da tabela
  • Páginas de índice da tabela
  • Dicionário de dados
  • Dados de controle do MVCC
    • Desfazer espaço
    • Segmentos de reversão
  • Buffer de gravação dupla (páginas gravadas em segundo plano para evitar o cache do SO)
  • Inserir buffer (alterações nos índices secundários)

Observe o lugar de ibdata1 no universo InnoDB (no lado direito)

Arquitetura InnoDB

Você pode separar as páginas de dados e de índice ibdata1ativando innodb_file_per_table . Isso fará com que qualquer tabela InnoDB recém-criada armazene dados e páginas de índice em um .ibdarquivo externo .

Exemplo

  • datadir é / var / lib / mysql
  • CREATE TABLE mydb.mytable (...) ENGINE=InnoDB;cria /var/lib/mysql/mydb/mytable.frm
    • innodb_file_per_table ativado, páginas de dados / índice armazenadas em /var/lib/mysql/mydb/mytable.ibd
    • innodb_file_per_table desativado, páginas de dados / índice armazenadas no ibdata1

Não importa onde a tabela do InnoDB esteja armazenada, a funcionalidade do InnoDB exige a procura de metadados da tabela e o armazenamento e recuperação de informações do MVCC para dar suporte à conformidade com ACID e ao isolamento da transação .

Aqui estão meus artigos anteriores sobre a separação de dados e índices de tabela do ibdata1

O QUE FAZER A SEGUIR

Você pode continuar tendo o ibdata1 armazenado tudo, mas isso faz com que os instantâneos do LVM sejam uma verdadeira chatice (minha opinião pessoal).

Você precisa usar a postagem My StackOverflow e reduzir esse arquivo permanentemente.

Por favor, execute esta consulta:

SELECT 
    ((POWER(1024,3)*94 - InnoDBDiskDataAndIndexes))/POWER(1024,3) SpaceToReclaim
FROM
(SELECT SUM(data_length+index_length) InnoDBDiskDataAndIndexes
FROM information_schema.tables WHERE engine='InnoDB') A;

Isso informará quanto espaço desperdiçado pode ser recuperado após a aplicação da Limpeza do InnoDB.


Obrigado pela sua contribuição. Desde então, minha cota de disco foi totalmente preenchida - antes de agir de acordo com algum conselho de suas postagens, precisarei de espaço livre? Observo que sua postagem original no SO menciona fazer um despejo de SQL, mas isso provavelmente criaria um arquivo de ~ 90 GB sem ter para onde ir.
James

O mysqldump exibirá apenas a representação lógica das páginas de dados, não os índices. Você precisará de outra montagem em disco, talvez um servidor remoto, para despejar os dados.
RolandoMySQLDBA 14/03

9
Ele retorna 91.25350952148438 para mim como SpaceToReclaim. Isso está em megabytes? por cento? bytes?
Isaac

Eu sei que isso é muito antigo. Mas para quem vem aqui com o problema, é necessário substituir o número 94pelo tamanho do seu ibdata1arquivo em GB e SpaceToReclaimele fornecerá o tamanho em GB.
anupsabraham


2

Se você usar o innodb como mecanismo MySQL por padrão, armazenará todos os seus bancos de dados no ibdata1. Também existem arquivos de log ib_logfile0 e ib_logfile1. Não exclua esses arquivos.


O que é excluir esse arquivo no meu servidor?
19718 Frank
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.