Recuperando dados deletados do SQL Server sem Backup Full – Parte 3

Post 3/6. Este post é parte da série: Recuperando dados deletados sem Backup Full
Tempo de leitura estimado: 3 minutos

Nos últimos dois posts desta série eu mostrei uma situação onde você deletou “sem querer” 10 mil registros de uma tabela e não tinha backup FULL para recuperar. Então, eu te mostrei uma arma secreta chamada fn_dump_dblog e aparentemente, conseguimos recuperar essas linhas do BACKUP do log de transação! Neste post, vou mostrar como extrair os dados a partir do que pegamos do backup de log. Aqui começa a escovação de bit!

A coluna [RowLog Contents 0] (a qual eu inseri na tabela LogDelete com o nome Registro), no caso das operações de DELETE, contém o registro que estava na página quando ele foi deletado, porém em formato binário. De novo, se você aprendeu direitinho a anatomia de um registro, vai conseguir decodificar tranquilamente.

Lembre-se: Este post mostra exemplos com registros sem compressão! Caso haja compressão, você deve compreender a estrutura de um registro comprimido que é diferente!

Já que vamos decodificar um registro, a informação crucial que precisamos aqui é da estrutura da tabela, especialmente os tipos de dados de cada coluna, pois é baseado nisso que as colunas são dispostas neste binário todo! Você pode consultar a estrutura direto no seu banco de produção e caso não tenha disponível (o que eu acho difícil, pois estamos falando de um DELETE FROM), pode tentar um backup FULL mais antigo ou uma cópia da tabela que você saiba que exista. O desafio é achar qual era a bendita estrutura da tabela no momento do DELETE.

Um jeito rápido é utilizar sp_help:

Informações das colunas relevantes ao processo de recuperação

As informações principais que preciso são estas dentro do quadro vermelho!

  • O nome;
  • Tipo de dados (e a quantidade de bytes usados);
  • Se aceita nulo, ou não;
  • O collation é importante também, mas para este exemplo, vou omitir o uso dele, para deixarm mais simples;

É muito importante que consiga todas essas informações, exatamente como eram no momento no DELETE, pois sem isso, seu trabalho vai ganhar um grau de dificuldade altíssimo e suas chances vão cair bastante.

Pronto! Agora temos tudo que precisamos para começar a remontar nossas colunas. No post anterior, mostrei um script que gera uma tabela chamada LogDeletes. Ela tem uma coluna chamada “Registro” que é a nossa [RowLog Contents 0]. Cada uma dessas linhas equivalem às linhas que foram deletadas, por isso o total é exatamente dez mil.

Esta coluna é o nosso registro e você está olhando para os valores das colunas de algumas das linhas que foram deletadas, porém na representação binária. A fn_dump_dblog me retorna na coluna [RowLog Contents 0] (coluna Registro na tabela LogDeletes) um tipo varbinary . Por isso começa com 0x. Se tudo isso estivesse numa página de dados, esses binários estariam um seguido do outro.

Você consegue escrever uma query que faça as extrações utilizando algumas funções que trabalhem com dados binários, como SUBSTRING, REVERSE e algumas conversões que são necessárias, usando a função CONVERT. O script abaixo está no git.

E aí estão as minhas 10 mil linhas de volta!

No próximo post eu vou explicar cada um desses trechos. Então, se ainda não leu sobre anatomia do registro, ainda dá tempo!

Até lá!

Navegue na série << Recuperando dados deletados do SQL Server sem Backup Full – Parte 2Recuperando dados deletados do SQL Server sem Backup Full – Parte 4 >>
Compartilhe este post!

Leave a Reply