Existe uma maneira de recuperar um banco de dados mysql descartado?

8

Soltei acidentalmente um banco de dados MySQL no meu servidor. Existem maneiras de recuperar um banco de dados descartado?

kewl
fonte
Em qual plataforma seu banco de dados MySQL está sendo executado?
Jack diz que tente topanswers.xyz 28/08/12
Existe alguma chance de o backup da unidade em que o banco de dados está sendo feito e o administrador do servidor pode salvá-lo?
Kenneth Fisher
Existem várias ferramentas no mercado para reparar bancos de dados MySQL corrompidos, mas para obter os melhores e testados resultados, você sempre pode confiar nas ferramentas Stellar para reparar seu banco de dados. A ferramenta pode reparar tabelas InnoDB e MyISAM do banco de dados MySQL. Você também pode obter uma visualização dos objetos de banco de dados reparados, que o ajudarão a fornecer uma visão geral dos dados que estão sendo recuperados. A versão de demonstração do software está disponível gratuitamente para reparar o banco de dados com total integridade e formatação original, garantindo a perda de dados.
Mitchel

Respostas:

16

Se você agir rápido, há uma grande chance de recuperar seu banco de dados. A chance é maior para o InnoDB, para o MyISAM é diferente de zero, mas próximo.

O problema é quando o MySQL executa DROP TABLE ou DROP DATABASE (que é essencialmente o mesmo) O InnoDB não apaga os dados. As páginas com os dados ainda estão no disco.

Dependendo da configuração innodb_file_per_table, o processo de recuperação é diferente. Se innodb_file_per_table estiver desativado (padrão até 5.5), a tabela descartada permanecerá em ibdata1. Se innodb_file_per_table estiver LIGADO (padrão a partir de 5.5), a tabela descartada estava no respectivo arquivo .ibd. O MySQL remove esse arquivo quando solta a tabela.

A primeira coisa a fazer é interromper qualquer possível gravação para que sua tabela não seja substituída. Se innodb_file_per_table estiver desativado, basta parar o MySQL (kill -9 é ainda melhor, mas certifique-se de matar o safe_mysqld primeiro). Se innodb_file_per_table estiver ativado, desmonte uma partição onde o MySQL armazena seus dados. Se o datadir estiver na partição raiz, recomendo desligar o servidor ou, pelo menos, tirar uma imagem do disco. Deixe-me repetir, o objetivo é evitar a substituição da tabela descartada pelo MySQL ou pelo sistema operacional.

Existe uma ferramenta que permite trabalhar com páginas do InnoDB em baixo nível, kit de ferramentas de recuperação de dados TwinDB . Vou usá-lo para ilustrar a recuperação de recuperação.

Você precisa levar a mídia com a tabela descartada (ibdata1 ou imagem de disco) e encontrar as páginas do InnoDB nela. A ferramenta stream_parser do kit de ferramentas faz isso.

./stream_parser -f /path/to/disk/image

Ele examinará o arquivo, encontrará as páginas do InnoDB e as classificará por tipo e index_id. index_id é um identificador que o InnoDB usa para se referir a um índice. Uma tabela é armazenada no índice PRIMARY. Para encontrar qual index_id é sua tabela eliminada, você precisa recuperar o dicionário InnoDB .

O dicionário InnoDB é armazenado no arquivo ibdat1. Você precisa digitalizar o arquivo ibdata1 da mesma maneira que acima:

./stream_parser -f /var/lib/mysql/ibdata1

Agora você precisa obter registros das tabelas de dicionário do InnoDB SYS_TABLES e SYS_INDEXES (digamos que sua tabela seja sakila.actor):

./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql | grep sakila/actor
000000000B28  2A000001430D4D  SYS_TABLES  "sakila/actor"  158  4  1 0   0   ""  0

158 é table_id, lembre-se.

./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 158
000000000B28    2A000001430BCA  SYS_INDEXES     158     376     "PRIMARY"       1       3       0       4294967295
000000000B28    2A000001430C3C  SYS_INDEXES     158     377     "idx\_actor\_last\_name"        1       0       0       4294967295

Portanto, index_id da sua tabela descartada (sakila.actor) é 376.

Agora você pode buscar registros da tabela eliminada no InnoDB index_id 376. Você precisa ter a estrutura da tabela eliminada, exatamente a instrução CREATE TABLE com a qual a tabela foi criada. Onde você pode conseguir isso? Do backup antigo ou de outro lugar. Também é possível recuperar a estrutura do dicionário InnoDB, mas não a abordarei nesta resposta. Vamos apenas assumir que você o possui.

./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000000000376.page -t actor.sql > dump.tsv 2> load_cmd.sql

c_parser gera registros como despejo separado por tabulação para stdout. O dump pode ser carregado com o comando LOAD DATA. c_parser imprime no stderr.

Veja mais detalhes nas postagens:

akuzminsky
fonte
ainda é recuperável se, após a queda da tabela, criar uma nova tabela e inserir novos registros?
Oki Erie Rinaldi
Nesse caso, você perde index_id porque CREATE substitui o valor original. Você precisa encontrá-lo de alguma forma. Geralmente eu grep cordas conhecidas. Os seguintes INSERTs podem ou não substituir os dados. Caso contrário, é recuperável. Você tem que tentar, não há nenhuma maneira de saber de antemão
akuzminsky
Este link dá um 404 !!
Nevermore
@akuzminsky Eu fiz até a parte "dictionary / SYS_INDEXES.sql | grep 158". E isso me fornece algum index_id para minha tabela, mas diz que não há arquivo de página com meu index_id. ex: 0000000000000376.page (quando executo este c_parser -6f) #
Sampath Sri Anuradha
@SampathSriAnuradha deve ser ruim quando a Fortune não está do seu lado. Eu sinto Muito.
Akuzminsky
11

Não há maneira fácil de quebrar isso para você. Não importa se você eliminou um banco de dados via phpmyadmin ou pela linha de comando. Já se foi.

O erro humano é um dos motivos para ter um bom regime de backup.

Eu não sou religioso, mas vou fazer uma oração esperando que não seja nada muito importante.

atxdba
fonte
era muito importante, cargas de transação vai perder
kewl
8
O melhor que eu poderia recomendar nesse caso é desmontar o sistema de arquivos em que seu datadir estava. Desligue o servidor, se necessário. Chamar um serviço de recuperação de dados e estar preparado para desembolsar milhares, se não dezenas de, ao mesmo tempo, pagar por um negócio arriscado sem garauntees: - \
atxdba
3
Se alguém em uma situação semelhante ler isso no futuro, acho que vale a pena sugerir também que é importante desmontar o sistema de arquivos ou somente leitura o mais rápido possível, se você for contratar uma empresa de recuperação de dados. Quanto mais tempo a gravação continuar no sistema de arquivos, maior a probabilidade de que os clusters que contêm seus arquivos excluídos sejam substituídos.
James L
2

Depende da sua configuração. É possível restaurar se você configurar seu sistema corretamente. Se você tiver um backup, poderá restaurá-lo. e aplique os logs binários até o ponto imediatamente antes de você soltar a tabela.

http://dev.mysql.com/doc/refman/5.5/en/mysqlbinlog.html

Eu sugiro que você faça isso em outro servidor, depois de restaurar a tabela, você poderá usar o mysqldump para extraí-lo e importá-lo novamente para o servidor de produção. Isso não será uma restauração rápida, mas você pode recuperar os dados.

Se você não sabe o que está fazendo, sugiro abrir um contrato de suporte com uma das empresas de consultoria mysql (pythian, percona, palamino são provavelmente as melhores) e pedir que elas o ajudem com isso.

te desejo muita sorte

Allen Kinnard
fonte