Como desfazer a tabela DROP?

11

Eu acidentalmente derrubei todas as mesas. Posso restaurar de volta? Eu não tenho a cópia de segurança.

Mark Henderson
fonte

Respostas:

12

Se você literalmente não tem backup, tenho 99% de certeza de que não tem sorte.

Se você tem alguma forma de backup, por mais antiga que seja, então você tem o log binário ativado através da opção log-bin no arquivo de configuração do MySQL (my.ini)? Nesse caso, você poderá recuperar desde o último backup.

Mau jeito de começar uma semana cara, desculpe.

Chopper3
fonte
2
Presumivelmente, porque você é inexperiente, todos nós já fizemos esse tipo de coisa, ainda fazemos algumas vezes (me tranquei fora do meu próprio VCenter há menos de uma semana) - tudo o que importa é que você aprende com ele e fica menos provável repetir.
precisa saber é o seguinte
O que eu posso fazer agora?? Eu não posso apenas sentar e esperar !!!!
8
Informe o seu gerente
Chopper3
4
Isso não resolve o problema, mas talvez um de seus desenvolvedores tenha uma cópia que não esteja muito distante da última cópia válida?
Tom O'Connor
3
Tom levanta uma questão muito boa: se seus desenvolvedores costumam tirar instantâneos de dados em tempo real para fins de teste / desenvolvimento, você pode ter sorte e um deles possui uma cópia intacta recente o suficiente para rebaixar sua situação de " desastre completo "apenas" grande inconveniente ".
David Spillett
7

A pergunta é bastante antiga, mas não há uma resposta positiva única, então adicionarei uma.

Após o MySQL soltar uma tabela, os dados ainda estão na mídia por um tempo. Assim, você pode buscar registros e reconstruir uma tabela. Mais tarde, vou postar no blog, mas, por enquanto, um esboço rápido.

Você precisaria ter a estrutura da sua tabela (instrução CREATE TABLE).

Se innodb_file_per_table estiver ativado, a tabela descartada estará na partição do disco. Pare o MySQL e reinstale-o como somente leitura o mais rápido possível. Se o MySQL estava em uma partição raiz (o que não é uma boa idéia), tire uma imagem ou retire o disco e conecte-o a outro servidor. Pare todas as gravações em outras palavras.

Se innodb_file_per_table estiver desativado, basta parar o MySQL.

Em seguida, baixe e compile a ferramenta de remoção da gota do InnoDB em https://github.com/twindb/undrop-for-innodb/ . Verifique a publicação " Compilando o kit de ferramentas de recuperação TwinDB " para obter detalhes.

Em seguida, analise a partição do disco ou o ibdata1 (dependendo da configuração innodb_file_per_table) com stream_parser:

./stream_parser -f /path/to/diskimage_or_ibdata1

Em seguida, recupere o dicionário InnoDB para saber em qual index_id estava a tabela descartada.

Em seguida, pegue a estrutura da tabela e busque os registros

./c_parser -f pages-diskimage_or_ibdata1/FIL_PAGE_INDEX/00000<index_id>.page

Ele produzirá registros para stdout e o comando LOAD DATA para stderr.

akuzminsky
fonte
o senhor salvou minha vida
Buddhi741
2

Aqui está o que eu fiz. No diretório mysql (para Ubuntu é / var / lib / mysql, para Mac usando Homebrew é / usr / local / var / mysql), encontrei alguns arquivos. Primeiro, copiei o diretório myapp_development / que contém o esquema específico no meu diretório mysql local. Depois, fiz backup do meu ibdata1 local e copiei o ibdata1 do servidor no diretório mysql. Mysqld morto. ( ps auxpara encontrar o PID, então kill PID). Reiniciado o mysql, ele começou no modo de recuperação de falhas. Em seguida, iniciei meu cliente mysql local e gerou um despejo completo das tabelas que eu precisava.

E, 15.000 linhas representando semanas de trabalho inserindo metadados que pensávamos que haviam desaparecido para sempre são salvas!

Espero que isso ajude alguém.

Duque
fonte
É um bom esforço, mas com certeza não colocaria muitas esperanças de que essa seja uma técnica confiável. No entanto, +1 para algum pensamento criativo.
John Gardeniers
Sim, você está correto. Acabou funcionando apenas porque removemos acidentalmente todas as permissões do usuário do mysql, portanto o banco de dados estava aparecendo vazio para esse usuário.
Duke
2

Infelizmente, você pode fazer muito pouco, além de tirar uma lição muito valiosa sobre a necessidade de um bom plano de backup.

Dependendo do tipo de tabela, você poderá encontrar um especialista que possa reunir os dados do que sobrou no disco, mas essa análise forense seria muito, muito, muito cara (pois exigiria habilidades relativamente incomuns) e não seria garantida para ser verdadeiramente útil.

David Spillett
fonte
Existe alguma outra opção?
1
Como o FractalizeR sugere, se as tabelas fossem tabelas simples do MyISAM, você poderá recuperar os arquivos associados a elas. Se você tentar, precisará desligar o servidor agora, porque quanto mais tempo o sistema estiver ativo, maior a chance de o espaço usado pelos arquivos ser reutilizado, impossibilitando a exclusão (ou fazendo com que os arquivos não excluídos tenham conteúdo corrompido) ) Como cancelar a exclusão depende do sistema de arquivos usado. ntfsundelete.com é o primeiro link útil em uma pesquisa no Google para recuperar a exclusão no NTFS.
precisa saber é o seguinte
0

Se essa era a tabela MyISAM, você precisa apenas cancelar a exclusão dos arquivos de tabela em / var / log / mysql ou qualquer que seja o diretório de dados. Você pode usar o utilitário ext3grep para isso, por exemplo.

Vladislav Rastrusny
fonte
ext3grep é para sistemas de arquivos ext3. Se você estiver usando o Windows, é improvável que esteja usando um sistema de arquivos ext3 (é provável que esteja usando o NTFS, embora possa ser o FAT32). Para tentar recuperar os arquivos excluídos, é necessário desligar o servidor o mais rápido possível, independentemente de outros serviços, pois quanto mais tempo o servidor estiver ativo, maiores as chances de a exclusão não ser possível. você mesmo.
precisa saber é o seguinte
Se a cópia de sombra estiver ativada no volume que armazenou as tabelas MyISAM, você poderá recuperá-las dessa maneira.
Catherine MacInnes
Para restaurar o arquivo de banco de dados excluído, você pode pesquisar no google por "ntfs undelete". Não sei onde o diretório de dados está localizado no seu PC. Você precisa verificar o my.ini ou procurar arquivos com a extensão MYD, por exemplo.
Vladislav Rastrusny
0

Você não pode "desfazer" a DROP TABLE.

Você pode ver e ver se o MySQL tinha o log binário ativado, talvez você possa extrair alguns dados a partir daí.

Fora isso, você pode esquecer o MySQL e está na mesma classe de problemas de "Excluí acidentalmente alguns arquivos do meu sistema de arquivos". Existem algumas ferramentas que tentam recuperar arquivos e também existem empresas que fazem isso profissionalmente.

Luke404
fonte
-1

Se você tiver o log binário ativado, poderá recriar uma tabela primeiro se tiver o esquema. Certifique-se de criar o esquema enquanto os binlogs estão desativados. Ou você pode simplesmente pular para a sessão. Em seguida, você pode reproduzir os binlogs até a última instrução que era a própria tabela suspensa.

Caso contrário, você pode restaurar usando um despejo de backup, se houver. Se você tiver arquivos csv, poderá carregar o método de infile de dados para recuperar dados. Se você estiver se recuperando do mysqldump, considere restaurar uma única tabela do arquivo de despejo em vez de restaurar o banco de dados completo. Se o tamanho dos dados for muito grande, considere desativar as chaves antes de carregá-lo, isso aumentará significativamente o processo de restauração.

No futuro, você pode querer ter um escravo atrasado, algo em torno de 10 a 24 horas atrás. Você pode criar escravo atrasado usando o percona toolkit (pt-slave-delay)

Roger Moore
fonte