MySQL InnoDB perdeu tabelas mas existem arquivos

28

Eu tenho um MySQL InnoDB que tem todos os arquivos da tabela de banco de dados, mas o MySQL não os vê e não os carrega.

O problema aconteceu porque eu deletei esses três arquivos: ibdata1 , ib_logfile0 e ib_logfile1

porque eu estava tendo problemas com o mysql iniciando, e o que eu li foi para removê-los porque o MySQL irá apenas regenerá-los (eu sei que deveria ter feito o backup deles, mas não o fiz).

O que posso fazer para que o MySQL veja as tabelas novamente?

about_member.frm                              site_stories.frm
about_member.ibd                              site_stories.ibd
db.opt                                        stories.frm
FTS_00000000000000bb_BEING_DELETED_CACHE.ibd  stories.ibd
FTS_00000000000000bb_BEING_DELETED.ibd        story_comments.frm
FTS_00000000000000bb_CONFIG.ibd               story_comments.ibd
FTS_00000000000000bb_DELETED_CACHE.ibd        story_likes.frm
FTS_00000000000000bb_DELETED.ibd              story_likes.ibd
FTS_00000000000000f5_BEING_DELETED_CACHE.ibd  story_tags.frm
FTS_00000000000000f5_BEING_DELETED.ibd        story_tags.ibd
FTS_00000000000000f5_CONFIG.ibd               story_views.frm
FTS_00000000000000f5_DELETED_CACHE.ibd        story_views.ibd
FTS_00000000000000f5_DELETED.ibd              story_view_totals.frm
member_favorites.frm                          story_view_totals.ibd
member_favorites.ibd                          tags.frm
members.frm                                   tags.ibd
members.ibd
    
por Get Off My Lawn 13.11.2013 / 15:52

2 respostas

30

Eis por que o MySQL não pode ver esses arquivos: O espaço de tabelas do sistema (ibdata1) possui um dicionário de dados específico do Storage Engine que permite ao InnoDB mapear o possível uso da tabela:

MovertabelasInnoDBdeumlugarparaoutrorequercomandoscomo

ALTERTABLEtblnameDISCARDTABLESPACE;ALTERTABLEtblnameIMPORTTABLESPACE;

Aquiestáumaparteda Documentação do MySQL 5.5 explicando o que precisa ser considerado

Portability Considerations for .ibd Files

You cannot freely move .ibd files between database directories as you can with MyISAM table files. The table definition stored in the InnoDB shared tablespace includes the database name. The transaction IDs and log sequence numbers stored in the tablespace files also differ between databases.

To move an .ibd file and the associated table from one database to another, use a RENAME TABLE statement:

RENAME TABLE db1.tbl_name TO db2.tbl_name; If you have a “clean” backup of an .ibd file, you can restore it to the MySQL installation from which it originated as follows:

The table must not have been dropped or truncated since you copied the .ibd file, because doing so changes the table ID stored inside the tablespace.

Issue this ALTER TABLE statement to delete the current .ibd file:

ALTER TABLE tbl_name DISCARD TABLESPACE; Copy the backup .ibd file to the proper database directory.

Issue this ALTER TABLE statement to tell InnoDB to use the new .ibd file for the table:

ALTER TABLE tbl_name IMPORT TABLESPACE; In this context, a “clean” .ibd file backup is one for which the following requirements are satisfied:

There are no uncommitted modifications by transactions in the .ibd file.

There are no unmerged insert buffer entries in the .ibd file.

Purge has removed all delete-marked index records from the .ibd file.

mysqld has flushed all modified pages of the .ibd file from the buffer pool to the file.

Dadas estas ressalvas e protocolos, aqui está uma sugestão de ação

Para este exemplo, vamos tentar restaurar a tabela tags para o banco de dados mydb

PASSO # 1

Verifique se você tem backups desses arquivos .frm e .ibd em /tmp/innodb_data

PASSO # 2

Obtenha a instrução CREATE TABLE tags e execute-a como CREATE TABLE mydb.tags ... . Certifique-se de que é exatamente a mesma estrutura que o original tags.frm

PASSO # 3

Exclua o tags.ibd vazio usando o MySQL

ALTER TABLE mydb.tags DISCARD TABLESPACE;

PASSO # 4

Coloque a cópia de backup de tags.ibd

cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd

PASSO # 5

Adicione tags table ao Dicionário de Dados InnoDB

ALTER TABLE mydb.tags IMPORT TABLESPACE;

PASSO 6

Teste a acessibilidade da tabela

SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;

Se você obtiver resultados normais, parabéns por importar uma tabela InnoDB.

PASSO 7

No futuro, por favor, não apague ibdata1 e seus logs

Experimente!

Eu já discuti coisas assim antes

CAVEAT

E se você não souber a estrutura da tabela do tags ?

Existem ferramentas para obter a instrução CREATE TABLE usando apenas o arquivo .frm . Eu escrevi um post sobre isso também: Como pode extrair o esquema da tabela apenas do arquivo .frm? . Naquela postagem, copiei um arquivo .frm para uma máquina Windows de uma caixa do Linux, executei a ferramenta Windows e obtive a instrução CREATE TABLE .

    
por 14.11.2013 / 16:34
9

Eu tenho a mesma situação, não posso largar ou criar um nome de ficheiro específico. Meu procedimento de correção é:

  1. Pare o MySQL.

    service mysql stop
    
  2. Remova o ib_logfile0 e o ib_logfile1.

    cd /var/lib/mysql;
    rm ib_logfile0 ib_logfile1
    
  3. Remova os arquivos tblname. AVISO: ISTO APAGARÁ SEUS DADOS PERMANENTEMENTE

    cd /var/lib/mysql/dbname;
    rm tblname*
    
  4. Inicie o MySQL.

    service mysql start
    
por 28.01.2014 / 03:08

Tags