Recupere o banco de dados MySQL da pasta de dados sem ibdata1 dos arquivos ibd

15

Meu diretório WAMP foi acidentalmente excluído por outro usuário. Somente a pasta de dados no MySQL está disponível. E, apenas as pastas de banco de dados (pastas em "\ bin \ mysql \ mysql5.6.12 \ data \" com nome dos bancos de dados) estão disponíveis. Todos os arquivos, incluindo " ibdata1 " na raiz de "\ bin \ mysql \ mysql5.6.12 \ data \", também são excluídos.

As pastas do banco de dados contêm arquivos apenas com as extensões abaixo.

* .frm, * .ibd

e arquivo "db.opt".

Como os bancos de dados podem ser recuperados?

Eu já tentei recuperar o bdata1. Mas, incapaz de recuperá-lo. E, algum banco de dados também contém MYISAM.

cyberwani
fonte

Respostas:

16

MyISAM

Para uma tabela MyISAM mydb.mytable, você deve ter três arquivos

  • \bin\mysql\mysql5.6.12\data\mydb\mytable.frm
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYD
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYI

Eles já devem estar acessíveis como uma tabela, pois cada arquivo contém dados, metadados e informações de índice necessários. Coletivamente, eles formam a mesa. Não há mecanismos de mecanismo de armazenamento externo para acessar.

InnoDB

Dê uma olhada nesta Representação pictórica do InnoDB

Arquitetura InnoDB

A única coisa que anexa ibdata1 aos .ibdarquivos é o dicionário de dados.

Sua missão, caso você decida aceitá-la, é criar cada tabela e trocar as .ibd

Antes de fazer qualquer coisa, faça uma cópia completa de "\ bin \ mysql \ mysql5.6.12 \ data" para outra

Aqui está uma amostra

Suponha que você tenha um banco de dados mydbcom a tabela mytable. Isso significa

  • Você tem a pasta \bin\mysql\mysql5.6.12\data\mydb
  • Dentro dessa pasta, você tem
    • mytable.frm
    • mytable.ibd

Você precisa do .frm. Se você olhar para o meu post Como extrair o esquema da tabela apenas do arquivo .frm? , você pode baixar um utilitário MySQL que pode gerar o SQL necessário para criar a tabela.

Agora você deve fazer o seguinte

  • Mover mytable.ibdpara\bin\mysql\mysql5.6.12\data
  • Execute o SQL para criar a tabela InnoDB
  • Entre no mysql e execute ALTER TABLE mydb.mytable DISCARD TABLESPACE;(Isso será excluído \bin\mysql\mysql5.6.12\data\mydb\mytable.ibd)
  • Copiar \bin\mysql\mysql5.6.12\data\mytable.ibdpara\bin\mysql\mysql5.6.12\data\mydb
  • Entre no mysql e execute ALTER TABLE mydb.mytable IMPORT TABLESPACE;(Isso será registrado \bin\mysql\mysql5.6.12\data\mydb\mytable.ibdno dicionário de dados)

Depois disso, a tabela mydb.mytabledeve estar totalmente acessível. Você pode testar essa acessibilidade simplesmente executando:

SELECT * FROM mydb.mytable LIMIT 10;

De uma chance !!!

BEBIDA (Recuperação de Dados Incorpora o Conhecimento Necessário)

RolandoMySQLDBA
fonte
Para concluir esta ótima resposta, para o innodb, você precisará remover qualquer restrição FK que faça referência à tabela antes de descartar seu espaço de tabela. Após a importação, você deve recriar o FK.
SebaGra 12/09
após a importação do espaço de tabela, information_schema.key_column_usage(provavelmente também outras tabelas) não retornará dados na primeira, selectportanto você deverá executar pelo menos uma consulta e aguardar alguns segundos antes que a próxima consulta possa funcionar. (mysql Ver 14.14 Distrib 5.7.19, para linux-glibc2.12 (x86_64) usando o wrapper EditLine))
user3338098