Estamos usando o SQL Server com o modo de recuperação completa. Dado um backup completo e uma série de backups de log, gostaríamos de poder verificar se a cadeia de logs está completa desde o último backup completo até o log de cauda atual. (Sem realmente restaurar esses backups; o objetivo aqui é testar a consistência dos backups.)
Eu já sei como fazer isso para os backups existentes: usando RESTORE HEADERONLY, obtenho o FirstLSN e LastLSN de todos os arquivos, que podem ser comparados com arquivos consecutivos, para determinar se são compatíveis.
No entanto, não sei como verificar se o log de cauda segue o último backup de log.
Se eu tivesse o FirstLSN do log de cauda, poderia compará-lo ao LastLSN do último backup de log. Mas como posso obter o FirstLSN do registro de cauda?
Preciso de uma solução que funcione a partir do SQL Server 2005 (idealmente usando t-sql). Até agora, pesquisei no Google sem sucesso. Btw. A primeira vez que publiquei isso no stackoverflow; mas migrou para aqui, pois foi sinalizado como fora de tópico.
EDITAR
Tentei as duas soluções fornecidas em um pequeno exemplo (SQL Server 2005, 9.0.5057):
BACKUP DATABASE TestDb TO DISK = 'C:\temp\backup test\Full.bak'
-- fire some update queries
BACKUP LOG TestDb TO DISK = 'C:\temp\backup test\Log1.bak'
-- fire both queries from the provided answers:
-- Martin Smith's answer yields: 838886656088920652852608
-- Shawn Melton's answer yields: 46000000267600001
RESTORE HEADERONLY FROM DISK = 'C:\temp\backup test\Log1.bak'
-- yields: 46000000267600001
Então parece que o primeiro está desligado por várias ordens de magnitude.
Fiz o mesmo teste no SQL 2008 SP1 (10.00.2531), em que ambas as consultas renderam a resposta correta.
fonte
Respostas:
Virei para minha cópia do SQL Server 2008 Internals e o DMV sys.database_recovery_status foi indicado para encontrar o primeiro LSN do próximo backup de log. Na coluna BOL, a coluna
last_log_backup_lsn
fornece:Apenas para mencionar também que o Kalen também menciona que você obterá um valor NULL se o banco de dados estiver no modo de recuperação SIMPLES (modo de truncamento automático) ou se não houver backup de log.
Sem realmente fazer o backup do log de cauda de um banco de dados (não tenha uma instância de teste para testar isso), você poderia concluir logicamente que o valor retornado na coluna mencionada seria o primeiro LSN do próximo backup de log, no seu caso o rabo.
Portanto, a execução do seguinte retornará o valor que acredito estar procurando:
Este DMV está disponível a partir do SQL 2005.
EDITAR
A menos que você leia o link BOL, observe que este DMV retornará apenas valores para bancos de dados que estão online ou abertos como BOL faz referência a ele. Se ocorrer uma falha que exija que você faça um backup do log de cauda de um banco de dados, não poderá verificar esse valor através do código acima, a menos que o banco de dados esteja acessível; que em um fracasso provavelmente não seria.
fonte
Algo como o seguinte deve fazê-lo.
Usando o código de conversão para decimal deste artigo .
A
ORDER BY [Current LSN]
sobrecarga pode ser completamente desnecessária. Não tenho certeza. O resultado dessa função sempre parece estar na ordem do LSN e acho que apenas lê o log sequencialmente, mas apenas no caso ...fonte
fn_dblog
não parece estar muito bem documentado. Presumo que seus resultados sempre sejam válidos para o banco de dados atual (já que não háWHERE DbName = 'XXX'
no snippet)?CONVERT
parâmetro with style2
pode ser o problema.