Como recupero alguns registros excluídos?

49

Excluí por engano cerca de 2.000.000 registros de uma tabela remota do SQL Server 2008. O servidor não está me concedendo acesso aos arquivos de backup no lado do servidor.

Existe alguma maneira de recuperar esses registros?

Nick Chammas
fonte
18
Quando foi a última vez que você testou seus backups?
Joe
20
Quando foi a última vez que você testou uma RESTORE de seus backups?
datagod

Respostas:

116

Seu banco de dados está no modo de recuperação completa?

  • Se sim, você está fazendo backups de log de transações?

    • Se sim, você possui um utilitário de backup como o Quest LiteSpeed, o Red Gate SQL Backup ou o Idera SQLSafe?
      • Se sim, esses utilitários podem recuperar objetos dos arquivos de backup (incluindo os logs completos e de transação) - mas explicar como usá-los está além do escopo do que posso fazer aqui. Entre em contato com o fornecedor para obter instruções.
      • Se não, restaure os logs completos de backup e transação como um banco de dados com um nome diferente. (Não substitua o banco de dados existente.) Você poderá obter uma cópia atualizada do objeto antes da exclusão, mas precisará usar a parte stopat do comando restore para especificar quando parar de restaurar os comandos. Você precisa parar antes que a exclusão ocorra.
    • Se não, pegue uma cópia de um utilitário de leitura de logs como o Quest LiteSpeed ​​ou o Apex SQL Log. Esses utilitários podem se conectar ao servidor de banco de dados, examinar o arquivo de log e ajudá-lo a desfazer transações. Não tenho certeza se as versões demo funcionarão, mas as pagas definitivamente funcionarão.
  • Se não (não no modo de recuperação completa), restaure o último backup completo como um banco de dados com um nome diferente. (Não substitua o banco de dados que você já possui.) A partir daí, você poderá restaurar quaisquer registros online no momento do backup, mas perderá todas as alterações desde então.

Brent Ozar
fonte
4
Ótima resposta, acrescentarei que, se você tiver auditoria ou rastreamento de alterações, geralmente é mais fácil recuperar os dados dessas tabelas quando apenas uma tabela foi afetada. E, é claro, se sua resposta foi negativa para algumas ou todas as opções acima, depois de restaurar os registros o máximo possível, corrija o processo de backup e, possivelmente, quem tem acesso aos dados de produção.
HLGEM
Se você estiver no modo simples, as linhas ainda poderão estar fisicamente presentes em algumas páginas. Talvez alguns deles possam ser recuperados (a um tempo muito alto e / ou custo monetário).
usr
PARA SUA INFORMAÇÃO. ApexSQL Recover além da limitação de tempo, a versão de avaliação recupera apenas 1 em cada 10 linhas do total de linhas disponíveis para recuperação ( apexsql.com/faqs/faqs_recover.aspx )
Sameer
30

O SQL Server mantém logs para cada registro excluído. Você pode consultar esses logs através da fn_dblogfunção SQL Server.

SELECT [RowLog Contents 0] 
FROM   sys.fn_dblog(NULL, NULL) 
WHERE  
       AllocUnitName = 'dbo.TableName'        
   AND Context IN ( 'LCX_MARK_AS_GHOST', 'LCX_HEAP' )        
   AND Operation in ( 'LOP_DELETE_ROWS' )   
;

Mas esse log está no formato hexadecimal e você precisa converter esse formato hexadecimal em seus dados reais.

O artigo abaixo o ajudará a recuperar os registros excluídos da maneira definida acima:

http://raresql.com/2011/10/22/how-to-recover-deleted-data-from-sql-sever/

user1059637
fonte
3
Isso é bem legal. Sob quais condições essa abordagem funciona (ou não funciona)?
precisa
3
@NickChammas - Ele só pode recuperar o que está no log ativo; portanto, para um modelo de recuperação simples, um ponto de verificação não deve ter ocorrido. Além disso, atualmente parece que não funciona corretamente em bancos de dados com isolamento de instantâneo, mas isso deve ser uma solução fácil. @user1059637- Qual sua atitude em relação às pessoas que adicionam funcionalidade ao seu código?
Martin Smith
@ MartinSmith, Agora está funcionando perfeitamente com o isolamento de instantâneos também.
user1059637
22

Infelizmente, não poderemos ajudá-lo sem muito mais informações. Mas, com a sua pergunta, vejo que você excluiu o que parece ser 2 milhões de registros do seu banco de dados. Provavelmente você não pode recuperar essas informações, a menos que tenha log completo no banco de dados e adquira algumas ferramentas muito específicas.

Se você pode descrever com mais detalhes exatamente o que acha que fez e por que sente que não pode recuperar os registros e pode descrever a organização do seu banco de dados, podemos ajudá-lo um pouco mais.

Alguns conselhos gerais: se você acha que excluiu 2 milhões de registros, provavelmente está um pouco assustado agora. Portanto, você deve fazer uma pausa de cinco minutos, se acalmar e revisitar o problema. Além disso, você deve informar o seu chefe imediatamente se for razoável (não acorde alguém às duas da manhã para dizer a ele) e que você está trabalhando em uma solução. Melhor admitir o que aconteceu do que tentar freneticamente recuperar-se e potencialmente piorar as coisas e ocultar os detalhes. Saber que seu chefe pode ajudar de alguma forma ajuda a resolver o problema. Como eu disse, apenas alguns conselhos gerais.

jcolebrand
fonte
10
boa ideia com o intervalo de 5 minutos. Sempre funciona. Ajuda a se concentrar. :-) Já fiz isso.
John aka hot2use