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 CHECKDB
comandos 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 CHECKDB
saí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 RECOVERY
mas 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 NORECOVERY
a 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 SELECT
consultas 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).