Restauração da página online, atingindo o limite de 1000

13

Fui encarregado de tentar recuperar um banco de dados que sofria corrupção (devido a falha de E / S, que foi corrigida desde então). Não estou familiarizado com o banco de dados ou o que ele contém.

Recebi um backup completo antigo (~ 3 semanas) e uma série de logs de transações ... no entanto, há logs de transações ausentes, portanto só posso recuperar até uma certa data. Faltam 2,5 semanas de dados (e há muitos dados sendo adicionados a esse banco de dados constantemente).

Também recebi uma cópia do banco de dados corrompido (acessível, mas com muitas páginas corrompidas / ausentes).

Eu tentei os DBCC CHECKDBcomandos típicos (ainda não repair_allow_data_loss, esse será meu último recurso se nada mais funcionar).

Depois que muitos chegam e vão para o banco de dados (o banco de dados é um monstrinho de 1,5 terabyte e tudo o que faço é lento e leva um tempo), tentei fazer uma restauração de página on-line a partir do último backup válido para as páginas corrompidas.

Para fazer isso, eu criei um script que cria muitos RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'comandos a partir da DBCC CHECKDBsaída (basicamente um regex e um distinto) ... até agora tudo bem, isso funcionou até um ponto em que dizia que havia atingido o limite de 1000 páginas por arquivo (existem 8 arquivos neste banco de dados) por comando de restauração.

Portanto, ele me pede para "concluir a restauração online", mas não sei como fazer isso ... Não tenho um registro de cauda nem nada mais completo do que o backup completo com o qual estou começando, então Basicamente, não sei como concluir a restauração para continuar tentando com o restante das páginas.

Eu tentei um RESTORE DATABASE <foo> WITH RECOVERYmas que também não funcionou, ele me pede um log que eu não tenho.

Alguém tem alguma dica de como eu poderia tentar recuperar alguma coisa daqui? Ou como "concluir" a restauração online para que eu possa continuar tentando recuperar mais páginas? Eu teria o mesmo problema se tentasse uma restauração offline (basicamente adicionando WITH NORECOVERYa tudo e tente trazê-la de volta no final?)

Trabalhar com o banco de dados manualmente é basicamente impossível de desfazer ... existem centenas de tabelas com milhões de linhas e não há um significado claro do que seja. O banco de dados corrompido falhará nas SELECTconsultas após milhões de linhas, mas não tenho certeza de que posso descobrir onde. Tentei reconstruir todos os índices não agrupados em cluster, mas há páginas corrompidas com dados de linha, portanto, isso também não funcionou.

Alguma perda de dados seria aceitável, mas a consistência no banco de dados deveria pelo menos tentar ser alcançada.

O banco de dados corrompido ainda está on-line e os clientes estão trabalhando nele (para que continue obtendo novos dados); portanto, qualquer processo que eu faça na bancada do laboratório deve ser reproduzível no banco de dados de produção posteriormente (o tempo de inatividade será difícil para ele).

Este é o SQL Server 2014 Enterprise

PS: Eu não sou DBA ... sou programador, mas o cliente tentou alguns serviços de recuperação de desastre sql "especializados" e eles desistiram, por isso me pediram que olhasse para ver se conseguia faça qualquer coisa.


Atualização : após muitos testes, a restauração de página por página não era possível, então abandonamos a ideia. Estamos buscando uma recuperação manual (selecionando manualmente os registros ausentes das tabelas corrompidas e inserindo-os no último backup válido), executando algumas ferramentas automatizadas (novamente, existem centenas e centenas de tabelas).

Jcl
fonte

Respostas:

16

O procedimento padrão seria:

  1. Obtenha os IDs da página que precisam ser restaurados.
  2. Inicie uma restauração de página com um banco de dados completo.
  3. Aplique o backup diferencial mais recente.
  4. Aplique backups de log subsequentes.
  5. Crie um novo backup de log.
  6. Restaure o novo backup lob.

Após a aplicação do novo backup de log, a restauração da página é concluída e as páginas são então utilizáveis.

Restauração de exemplo

RESTORE DATABASE <database> PAGE='1:57, 1:202, 1:916, 1:1016'  
   FROM <file_backup_of_file_B>   
   WITH NORECOVERY;  
RESTORE LOG <database> FROM <log_backup>   
   WITH NORECOVERY;  
RESTORE LOG <database> FROM <log_backup>   
   WITH NORECOVERY;   
BACKUP LOG <database> TO <new_log_backup>;   
RESTORE LOG <database> FROM <new_log_backup> WITH RECOVERY;  
GO  

Referência: Restaurar Páginas (SQL Server) (Microsoft Docs) Referência: Instruções RESTORE (Transact-SQL) (Microsoft Docs)

No entanto, você possui falhas nos backups do TLOG, e a restauração com o procedimento acima pode trazer seu banco de dados de volta a um estado que você não deseja.


Você está em uma situação complicada.

  1. Seu banco de dados possui páginas corrompidas e sua empresa está constantemente adicionando novos dados a um banco de dados com problemas. Isso pode resultar em um tempo de inatividade total do banco de dados. Faça você quer correr o risco de que?

  2. Alguém será responsabilizado e, quanto mais você tentar consertá-lo, mais a gerência poderá se inclinar a decidir que você pode ser essa pessoa no final. Faça você quer correr o risco de que?

  3. Você está se colocando em uma situação difícil, assumindo um papel para o qual não estava empregado. Você está tentando alcançar algo que nem os DBAs da sua empresa nem seu consultor externo foram capazes. Embora possa parecer um gesto nobre, você está se colocando em risco. Você pode ter "prometido implicitamente" algo que nunca será capaz de cumprir. Faça você quer correr o risco de que?

  4. Quando alguém que trabalha com o banco de dados consulta dados corrompidos, possivelmente receberá uma mensagem de erro. O trabalho diário já está sendo impactado. Quanto mais você esperar com o inevitável, mais produtividade será afetada. Faça você quer correr o risco de que? (Esta questão também pode ser levantada com a gerência)

  5. O procedimento de backup da sua empresa parece estar com defeito (caso contrário, como os backups do TLOG estariam faltando?) E você ainda está executando o banco de dados de produção como se não houvesse problemas. Faça você quer correr o risco de que?

A melhor recomendação que posso dar é interromper a produção e ligar para a Microsoft! Ou pelo menos ligue para a Microsoft e possivelmente interrompa a produção.

Embora minha redação possa parecer excessivamente cautelosa e levemente dramatizada da sua perspectiva, eu pessoalmente posso me relacionar com uma experiência como DBA, na qual os dados foram perdidos em uma situação semelhante. Perdemos apenas meio dia de dados, mas tivemos que sincronizar novamente muitos dados com os sistemas vizinhos .

Quanto mais você esperar, a recuperação mais cara poderá se tornar.


Quanto à limitação na página restaura, aqui uma citação da documentação oficial:

O número máximo de páginas que podem ser restauradas em qualquer arquivo único em uma sequência de restauração é 1000 . No entanto, se você tiver mais de um pequeno número de páginas danificadas em um arquivo, considere restaurar o arquivo inteiro em vez das páginas.

( ênfase minha)

Referência: instruções RESTORE - argumentos (Transact-SQL) (Microsoft Docs)


Quando tudo voltar ao normal, os DBAs e / ou consultores externos podem considerar a implementação de uma política / procedimento de backup / restauração diferente para o seu banco de dados. Como precisa ser 7x24, você não pode arriscar ter um procedimento de backup que não forneça recursos de restauração adequados para qualquer situação.

John aka hot2use
fonte
2
Muitas das suas preocupações já foram levantadas e tratadas (certamente não sou responsável se algo der errado, a produção deve ser interrompida etc.). Eu me tornei muito claro a esse respeito, mas não tenho controle ou decisão lá. Não acho que seja excessivamente cauteloso ou dramatizado ... Acho que eles estão basicamente fazendo errado, e só estou tentando ajudar aqui, mas sem compromisso. Entendo o limite de 1000 páginas, mas esperava que fosse um único comando de restauração (já que estou fazendo online, esperava não estar em uma sequência ... não consegui esclarecer os documentos) .
Jcl
1

Vejo que você tentou métodos diferentes, incluindo o trabalho com "especialistas" em recuperação de dados, para reparar esse banco de dados corrompido, especialmente com tamanho superior a 1 TB. Isso torna o processo muito mais difícil e uma corrida contra o tempo. Como um DBA experiente, deparei-me com situações semelhantes, nas quais na maioria das vezes existem bons backups disponíveis para restauração. No caso de herdar backups ruins e bancos de dados corrompidos, contei bastante com uma ferramenta de terceiros chamada Stellar Phoenix SQL Database Repair Tool . Essa ferramenta é bem conhecida por reparar bancos de dados corrompidos (.mdf e .ndf). Abaixo estão as poucas funcionalidades da ferramenta:

  • Repara arquivos corrompidos do banco de dados SQL (.mdf & .ndf)
  • Recupera tabelas, gatilhos, índices, chaves, regras e procedimentos armazenados
  • Executa a recuperação de registros excluídos do banco de dados SQL

  • Salva o resultado da verificação do banco de dados para executar a recuperação posteriormente

  • Permite salvar arquivos reparados nos formatos MSSQL, HTML, XLS e CSV
  • Suporta MS SQL Server 2016, 2014, 2012,2008 e versões anteriores

A ferramenta requer que os arquivos .mdf e .ndf estejam offline, portanto, é ótimo que você tenha uma cópia do banco de dados PROD corrompido e não precise interromper os serviços do SQL Server.

A melhor parte é que a versão de avaliação fornece a funcionalidade completa da ferramenta, exceto que o banco de dados reparado não pode ser exportado / salvo. Você ainda poderá visualizar todos os objetos de banco de dados recuperados e o extenso arquivo de log de reparo que fornece detalhes sobre os diferentes estágios do processo de reparo.

Sinta-se livre para baixar e ver se isso ajuda. Baixe aqui

Também escrevi um blog sobre como a ferramenta funciona neste site: samosql blogs

Obrigado e HTH para torná-lo o herói do dia!

PS. Quando essa tempestade terminar, lembre-se de informar ao gerenciamento que é necessário que haja uma grande revisão de seus procedimentos de backup, especialmente para esse banco de dados. Uma repetição desse cenário é totalmente inaceitável! :)

samosql
fonte