Como recuperar dados das tabelas InnoDB no MySQL a partir dos arquivos ibdata e .frm

 Uma das razões para isso ocorrer acontece quando uma tabela é corrompida.

Nesse cenário particular, a partir do momento que você conectar no database não poderá visualizar uma ou mais tabelas, pois as mesmas irão estar ausentes.

Como exemplo, o arquivo de log do MySQL conterá algo parecido com as informações abaixo:

InnoDB: Error: log file ./ib_logfile0 is of different size 0 50331648 bytes
InnoDB: than specified in the .cnf file 0 5242880 bytes!
[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
[ERROR] Unknown/unsupported storage engine: InnoDB
[ERROR] Aborting
O método explicado abaixo irá funcionar somente para banco da dados do tipo InnoDB.

Obs: Antes de fazer qualquer coisa, faça antes um backup de todos os arquivos MySQL e dos bancos de dados, mantendo sempre em um lugar seguro.

Para restaurar os dados da tabela tenha certeza que o diretório dos dados e seu conteúdo estejam intactos useful content.

drwx------ 2 mysql mysql     4096 Oct 11  2012 performance_schema
drwx------ 2 mysql mysql     4096 Dec 10  2012 ndbinfo
drwx--x--x 2 mysql mysql     4096 Dec 10  2012 mysql
-rw-rw---- 1 mysql mysql       56 Dec 19  2012 auto.cnf
drwx------ 2 mysql mysql     4096 Jul 30  2013 bugs
-rw-r----- 1 mysql mysql 50331648 Mar 18 10:35 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Apr 22  2013 ib_logfile1
-rw-r----- 1 mysql mysql 35651584 Mar 18 10:35 ibdata1
..
  • Ibdata1 – Esse arquivo é o table space InnoDB do sistema, no qual contém várias tabelas InnoDB e índices associados.
  • *.frm – Mantém as informações de metadados para todas tabelas do MySQL. Esses arquivos estão localizados dentro da pasta correspondente da base de dados MySQL.
  • ib_logfile* – Toda alteração de dado é escrita nesses arquivos de log. É similar ao conceito de archive logs do Oracle.

Copiar os arquivos

Para restaurar os dados dos arquivos abaixo, primeiro pare o MySQL server.
# service mysqld stop

Copie os arquivos ibdata e a pasta do schema do database para outro diretório. Essa pasta será utilizada para restaurar o Mysql database. Nesse exemplo, copiei todo conteúdo parao diretório /tmp.

# cp –r ibdata* ib_logfile* /tmp
# cp –r schema_name/  /tmp/schema_name/

 

Start the MySQL server:

# service mysqld start

Para backup e restore da base MySQL você deve utilizar o comando mysqldump.

Restaurar os dados

Restaure a tabela conforme explicado abaixo.

No arquivo de configuração my.cnf, coloque o valor do seguinte parâmetro, correspondente ao tamanho atual do arquivo ib_logfile0 (Para saber o tamanho execute: “ls -lh ib_logfile0″).
No exemplo, coloquei para 48M:

innodb_log_file_size=48M

Perceba que os tamanhos dos arquivos ib_logfile0 e ib_logfile1 são iguais.

Copie o arquivo ibdata anterior para o respectivo diretório de dados do mysql.

# cp –r /tmp/ibdata* /var/lib/mysql/

Crie uma pasta vazia dentro desse diretório, com o mesmo nome do schema do database que vocês esta tentando restaurar. Copie também os arquivos .frm dentro desse arquivo conforme abaixo:

# cp –r /tmp/ib_logfile* /var/lib/mysql/

# cp –r /tmp/schema_name/*.frm /var/lib/mysql/schema_name/

Por último, restarte o MySQL server.

# service mysqld restart