Estamos usando SQL Server con modo de recuperación completa. Dada una copia de seguridad completa y una serie de copias de seguridad de registros, nos gustaría poder verificar si la cadena de registros está completa desde la última copia de seguridad completa hasta el registro de cola actual. (Sin realmente restaurar estas copias de seguridad; el propósito aquí es probar la consistencia de las copias de seguridad).
Ya sé cómo hacer esto para las copias de seguridad existentes: usando RESTORE HEADERONLY obtengo FirstLSN y LastLSN de cada archivo, que se pueden comparar para archivos consecutivos, para determinar si son compatibles.
Sin embargo, no sé cómo verificar si el registro de cola sigue a la última copia de seguridad del registro.
Si tuviera el FirstLSN del registro de cola, podría compararlo con el LastLSN de la última copia de seguridad del registro. Pero, ¿cómo puedo obtener el FirstLSN del registro de cola?
Necesito una solución que funcione desde SQL Server 2005 en adelante (idealmente usando t-sql). Hasta ahora, he buscado en Google en vano. Por cierto. Primero publiqué esto en stackoverflow; pero lo migró aquí porque se marcó fuera de tema allí.
EDITAR
Probé las dos soluciones proporcionadas en un pequeño ejemplo (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
Entonces parece que el primero está apagado por varios órdenes de magnitud.
Luego hice la misma prueba en SQL 2008 SP1 (10.00.2531), donde ambas consultas arrojaron la respuesta correcta.
fuente
Respuestas:
Me dirigí a mi copia de SQL Server 2008 Internals y se indicó al DMV sys.database_recovery_status para encontrar el primer LSN de la siguiente copia de seguridad de registro. Que por BOL la columna le
last_log_backup_lsn
proporciona:Solo para mencionar también que Kalen también trae a colación el punto de que obtendrá un valor NULL si la base de datos está en modo de recuperación SIMPLE (modo de autotruncamiento) o si no existe una copia de seguridad de registro.
Sin realmente hacer una copia de seguridad del registro de cola de una base de datos (no tengo una instancia de prueba para probar esto), podría concluir lógicamente que el valor devuelto en la columna mencionada sería el primer LSN de la siguiente copia de seguridad de registro, en su caso el cola.
Por lo tanto, ejecutar lo siguiente devolverá el valor que creo que está buscando:
Este DMV está disponible a partir de SQL 2005.
EDITAR
A menos que lea el enlace de BOL, tenga en cuenta que este DMV solo devolverá valores a las bases de datos que están en línea, o se abrirán cuando BOL lo haga referencia. Si ocurre una falla que requiere que realice una copia de seguridad del registro de cola de una base de datos, no podrá verificar este valor a través del código anterior a menos que la base de datos sea accesible; que en un fracaso probablemente no lo sería.
fuente
Algo como lo siguiente debería hacerlo.
Usando el código de conversión a decimal de este artículo .
El
ORDER BY [Current LSN]
bien puede ser una sobrecarga completamente innecesaria. No estoy seguro. El resultado de esta función siempre parece estar en orden LSN y supongo que solo lee el registro secuencialmente, pero por si acaso ...fuente
fn_dblog
no parece estar muy bien documentado. Supongo que sus resultados siempre se mantienen para la base de datos actual (ya que no hayWHERE DbName = 'XXX'
en el fragmento).CONVERT
parámetro con estilo2
podría ser el problema.