Eu acidentalmente derrubei todas as mesas. Posso restaurar de volta? Eu não tenho a cópia de segurança.
Eu acidentalmente derrubei todas as mesas. Posso restaurar de volta? Eu não tenho a cópia de segurança.
Respostas:
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.
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.
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 aux
para 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.
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.
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.
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.
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)