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.
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):
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 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.
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.
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.
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.
Respostas:
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.
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:
Agora você precisa obter registros das tabelas de dicionário do InnoDB SYS_TABLES e SYS_INDEXES (digamos que sua tabela seja sakila.actor):
158 é table_id, lembre-se.
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 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:
fonte
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.
fonte
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
fonte