Temos um banco de dados muito grande (~6 TB), cujo arquivo de log de transações foi excluído (enquanto o SQL Server foi desligado. Tentamos:
- Desanexando e reconectando o banco de dados; e
- Recuperando o arquivo de log de transações
... mas nada funcionou até agora.
Atualmente estamos executando:
ALTER DATABASE <dbname> REBUILD
LOG ON (NAME=<dbname>,FILENAME='<logfilepath>')
... mas dado o tamanho do banco de dados, isso provavelmente levará alguns dias para ser concluído.
Perguntas
Existe alguma diferença entre o comando acima e o seguinte?
DBCC CHECKDB ('<dbname>', REPAIR_ALLOW_DATA_LOSS)
Devemos estar executando
REPAIR_ALLOW_DATA_LOSS
em vez disso?
Vale a pena notar que os dados são derivados de outras fontes para que o banco de dados possa ser reconstruído, mas suspeitamos que será muito mais rápido reparar o banco de dados do que reinserir todos os dados novamente.
Atualizar
Para aqueles que mantêm a pontuação: o ALTER DATABASE/REBUILD LOG
comando foi concluído após cerca de 36 horas e relatou:
Aviso: O log do banco de dados 'dbname' foi reconstruído. A consistência transacional foi perdida. A cadeia RESTORE foi interrompida e o servidor não tem mais contexto nos arquivos de log anteriores, portanto, você precisará saber quais eram.
Você deve executar o DBCC CHECKDB para validar a consistência física. O banco de dados foi colocado no modo somente dbo. Quando estiver pronto para disponibilizar o banco de dados para uso, será necessário redefinir as opções do banco de dados e excluir quaisquer arquivos de log extras.
Em seguida, executamos um DBCC CHECKDB
(levou cerca de 13 horas) que foi bem-sucedido. Vamos apenas dizer que todos nós aprendemos a importância dos backups de banco de dados (e conceder aos gerentes de projeto acesso ao servidor...).
Nunca desconecte um banco de dados suspeito. De qualquer forma, como você anexou o banco de dados depois de desanexá-lo? Você usou
CREATE DATABASE
comFOR ATTACH_REBUILD_LOG
opção?Esses comandos devem ter feito o truque:
Eu escrevi um post para esta situação:
Procedimento de recuperação de banco de dados SQL 2005/2008 - Arquivo de log excluído (Parte 3)
Você perguntou sobre a diferença entre:
DBCC CHECKDB ('<dbname>', REPAIR_ALLOW_DATA_LOSS)
eALTER DATABASE <dbname> REBUILD LOG ON (NAME=<dbname>,FILENAME='<logfilepath>')
O problema é que você pode executar ambos para reconstruir o arquivo de log, mas com
CHECKDB
você reconstruir o log e verificar se há erros de integridade no banco de dados também.Além disso, o segundo (alter database) não funcionará se houver transações ativas (não gravadas no disco) quando o arquivo de log for perdido. Na inicialização ou anexação, o SQL Server desejará realizar a recuperação (reversão e reversão) do arquivo de log que não está lá. Isso acontece quando um disco trava ou ocorre um desligamento inesperado do servidor e o banco de dados não é desligado corretamente. Acho que não foi o seu caso e tudo se resolveu bem para você.
DBCC CHECKDB (DBNAME, REPAIR_ALLOW_DATA_LOSS)
executado em um banco de dados em estado de emergência verifica o banco de dados quanto a erros de inconsistência, tenta primeiro usar o arquivo de log para recuperar quaisquer inconsistências. Se isso estiver ausente, o log de transações será reconstruído.ALTER DATABASE REBUILD LOG ON...
é um procedimento não documentado e requer um posteriorDBCC CHECKDB
para corrigir quaisquer erros.Sim, essas são duas declarações diferentes, cada uma fazendo coisas muito diferentes.
Dependendo do estado do banco de dados quando o arquivo foi excluído, você poderá iniciar e executar anexando o banco de dados e reconstruindo o log usando:
Consulte sp_attach_single_file_db (Transact-SQL) na documentação do produto.
Veja também esta postagem no blog de Paul S. Randal :
Reparação em modo EMERGÊNCIA: o último recurso