Restaurando tabelas MySQL dos arquivos .ibd, .frm e mysqllogbin

10

Por alguma razão, quando eu tento abrir meus tabelas que estão armazenadas no .frme .ibdarquivos (seja em MySQL ou phpmyadmin) dá-me um erro de sintaxe, ou ele diz que não existe.

Eu li o outro post que teve um problema semelhante a este, mas não sei como verificar se innodb_file_per_tableestá ativado, e no geral estou realmente muito confuso. Também converti uma cópia do meu mysql-bin.000002arquivo em um arquivo txt, para ver que os dados do meu banco de dados não estão completamente perdidos.

O banco de dados foi criado no ano passado. Eu tenho 6 desses mysql-bin.00000arquivos, mas por algum motivo o .000002é o maior. No momento, tenho os arquivos .ibde .frmpara todos os meus bancos de dados, mas não sei como restaurá-lo no MySQL, ou pelo menos em algo que possa ler.

Estou usando o WampServer 2.4 e o MySQL 5.6.12 no Windows 2003 Server. Além disso, devo baixar um plugin no InnoDB?

carment
fonte
Não, foi criado no ano passado. Eu tenho 6 desses arquivos mysql-bin.00000, mas por algum motivo o .000002 é o maior. No momento, tenho os arquivos .ibd e .frm para todos os meus bancos de dados, mas não sei como posso restaurá-lo no MySQL, ou pelo menos em algo que eu possa ler.
carment

Respostas:

19

Finalmente descobri e resolvi meu problema através de várias tentativas e erros. Para aqueles que não possuem o arquivo ibdata1 original e apenas os arquivos .frm e .ibd, veja como restaurei meus dados.

  1. Faça o download e instale os utilitários do MySQL em -> http://dev.mysql.com/downloads/utilities .
  2. Entre em seu comando / terminal para abrir o utilitário MySQL, mysqlfrm, e use-o para encontrar a estrutura da sua tabela que você precisa restaurar. Como fiz isso, fui transferido para o local do arquivo mysqlfrm e digitei "mysqlfrm --server = user: pwd @ localhost --port = 3307" path_to_.frm_file "> table_name.txt". O arquivo .txt deve ser salvo na mesma pasta em que os utilitários são salvos, se você não especificar para onde deseja ir.
  3. No arquivo de texto, você verá as instruções CREATE TABLE, que incluem todas as colunas e informações (basicamente a estrutura original) da sua tabela. Copie essa instrução CREATE com todas essas informações.
  4. No seu comando MySQL, crie um novo banco de dados (CREATE DATABASE database_name). Crie o mesmo nome que o nome do banco de dados original.
  5. Crie uma nova tabela dentro do novo banco de dados - ele não precisa ter o mesmo nome que a pasta. Você pode criar a nova tabela dentro do prompt de comando, mas eu criei minha tabela no PhpMyAdmin, uma ferramenta de software livre que lida com a administração do MySQL pela web. Eu simplesmente cliquei no banco de dados no PhpMyAdmin, depois na tabela SQL e colei a estrutura da tabela no # 3. (Como observação lateral, sempre recebi erros se eu nomeasse minhas tabelas "tabela" no prompt de comando, portanto, tente evitar esse nome).
  6. No seu comando MySQL, entre no banco de dados e digite "ALTER TABLE table_name DISCARD TABLESPACE", que basicamente removerá o arquivo .ibd dessa tabela.
  7. Copie o arquivo .ibd da tabela original (a tabela que você deseja restaurar) na tabela recém-criada para substituir o arquivo .ibd que você acabou de remover. Altere seu arquivo .ibd inicial para o nome da tabela recém-criada. Isso imitará o arquivo .ibd antigo que você acabou de excluir. Você pode encontrar esta pasta na pasta de dados do MySQL, na pasta de banco de dados recém-criada no seu computador.
  8. Volte ao seu comando MySQL, entre no banco de dados e digite "ALTER TABLE table_Name IMPORT TABLESPACE". Você receberá uma instrução do tipo "aviso" (1) de erro, mas ignore isso.
  9. E feito! se você tentar acessar sua nova tabela, ela deverá conter todos os dados da sua tabela antiga.

Espero que isso tenha ajudado e deixe-me saber se você tiver quaisquer perguntas ou comentários! Além disso, consulte http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file para obter mais detalhes.

carment
fonte
Ótimas instruções, mas só funciona com o MySQL 5.6 ! Na versão 5.5, você receberá o erro Got error -1 from storage engineao executar IMPORT TABLESPACE. Mas, para mim, o MySQL 5.6 funcionou para tabelas criadas com o MySQL 5.5, então tudo é bom;). Se você está com o 5.5, siga as instruções no link chriscalender que você colocou.
Ostrokach 31/08/2015
@carment Eu segui suas instruções, mas enfrento o ERRPR: tentando acessar o número da página 1767006713 no espaço 13635, nome do espaço <dbname> / <tblname>, que está fora do espaço de tabela vinculado. Você pode me orientar o que posso ter feito?
Mohit Mehta
Isso me salvou muito tempo recriando uma mesa. O método ainda funciona em 2016, no MySQL 5.7.17
Andy Mercer
@ostrokach parece que é porque você não innodb_file_per_tableativou.
quer
Você acabou de me salvar depois de uma longa jornada, obrigado!
Amr SubZero
4

O principal arquivo de dados do InnoDB - geralmente chamado ibdata- é essencial para que o MySQL possa entender seus arquivos .ibd.

Se você precisar mover dados entre servidores usando os arquivos binários, pare o MySQL de maneira limpa e depois mova todos os arquivos de dados, incluindo o (s) arquivo (s) ibdata , entre os diretórios.

Um mecanismo mais confiável de mover dados entre servidores no Windows seria usar ( mysqldump) ou uma exportação de banco de dados do PHPMyAdmin (ou uma ferramenta semelhante).

Se o log binário tiver sido ativado o tempo todo em que o servidor estiver em execução (com base nos comentários, isso pode não ser o caso), você também poderá mysqlbinlogrecuperar todas as instruções SQL executadas no servidor a partir dos arquivos mysql-bin e recrie o banco de dados dessa maneira. Deve haver registros de data e hora unix nos arquivos mysql-bin que ajudam a determinar até que ponto eles voltam.

Se você perdeu os arquivos originais do banco de dados e tudo o que resta são os arquivos .ibd individuais, pode ser necessário recorrer à recuperação dos dados conforme as sugestões de akuzminsky nos comentários.

O MySQL 5.6 possui alguns novos recursos para mover arquivos de dados .ibd do InnoDB ( espaços de tabela transportáveis ), mas isso exige algum esforço e, para um banco de dados suficientemente pequeno, será muito mais fácil transferir dados usando mysqldump.

Nathan Jolly
fonte
0

Resposta do Wiki gerada a partir de comentários de perguntas de akuzminsky


Se você ver *.ibdos arquivos, em seguida, innodb_file_per_tableé ON, caso contrário, todas as tabelas estaria em ibdata1.

Se indicar que uma tabela não existe, ela estará ausente no dicionário InnoDB. Tente despejar todas as tabelas em despejos sql separados (uma tabela - um arquivo). As tabelas que você não pode despejar, podem restaurar com o kit de ferramentas de recuperação TwinDB .

Ainda não há pacotes binários. Você precisa obter o código fonte do GitHub e compilá-lo. Veja as instruções no dicionário Recuperar InnoDB . É bem direto:

git clone [email protected]:twindb/undrop-for-innodb.git

e depois

make all
Paul White
fonte