Determinar el LSN de la base de datos en modo NORECOVERY

3

Estoy restaurando los registros de transacciones a una base de datos, pero necesito una manera de saber con qué registro de transacciones debo comenzar. Normalmente veré algo como esto:

El registro en este conjunto de copia de seguridad termina en LSN 103000001633300001, que es demasiado pronto para aplicarlo a la base de datos. Se puede restaurar una copia de seguridad de registro más reciente que incluye LSN 103000002524300001.

Entonces, ¿cómo obtengo el LSN 103000002524300001 programáticamente? La base de datos está en modo NORECOVERY, por lo que DBCC LOG no funciona. Tengo registros de los registros de transacciones, así que sé cuáles son sus primeros y últimos LSN. Simplemente no sé dónde se encuentra actualmente la base de datos.

Clyde
fuente

Respuestas:

3

Algunas columnas lsn están en sys.master_files que a nivel del servidor

La columna "redo_start_lsn" puede ser solo el ticket.

No he probado esto por cierto ...

gbn
fuente
redo_start_lsn se ve bien! No tengo idea de cómo se vería esto si mi base de datos tuviera más de un archivo, pero todas mis bases de datos tienen un solo archivo, por lo que no me preocuparé.
Clyde
Acabo de probar esto con el envío de registros, SQL 10.50.6220.0, norecovery. last_lsn en msdb.dbo.backupset en las coincidencias primarias redo_start_lsn en msdb.sys.master_files en las secundarias / secundarias. Si consulta ambos servidores varias veces en el transcurso de [insertar un período de tiempo entre las copias de seguridad del registro], puede ver cómo se realizan las copias de seguridad en el primario y el redo_start_lsn se mueve para coincidir en el secundario (s) después de la restauración.
Jeremy
3

Puede obtener esta información con una consulta como:

SELECT TOP 1 b.type, b.first_lsn, b.last_lsn, b.checkpoint_lsn, b.database_backup_lsn
FROM msdb..restorehistory a
INNER JOIN msdb..backupset b ON a.backup_set_id = b.backup_set_id
WHERE a.destination_database_name = 'AV_PROD'
ORDER BY restore_date DESC
Elijah W. Gagne
fuente
0

No estoy seguro acerca de cómo obtener el primer / último LSN de un archivo de registro de transacciones mediante programación, pero puede simplemente escribir la recuperación para intentar aplicar cada registro de transacciones que tiene en orden, los que son "demasiado pronto" (ya existen en la base de datos) ) fallará con este error. El resto debe aplicarse limpiamente.

Sin embargo, es de esperar que alguien tenga una mejor idea: me imagino que es bastante doloroso esperar si tiene muchos registros de transacciones, ya que probablemente se deba escanear todo el registro para determinar cuáles son los LSN iniciales y finales.

voretaq7
fuente
correcto, y para mí no es tanto la espera, sino la incapacidad de saber si hubo un error real.
Clyde
0

El hecho de que tenga una base de datos en norecovery significa que ya ha restaurado una copia de seguridad de algún tipo. Esa copia de seguridad tiene un encabezado. Usa eso.

Ben Thul
fuente
0

RESTORE HEADERONLYdevuelve el FirstLSNy LastLSNde la copia de seguridad, así como el que DatabaseBackupLSNcontiene el LSN de la última copia de seguridad completa. A partir de estos, puede recrear el orden necesario de restauración. Nunca necesita mirar el LSN de la base de datos, el orden necesario siempre puede (y debe) recrearse desde el medio de respaldo en sí.

Remus Rusanu
fuente
Ya sé el primer y último lsn del archivo de copia de seguridad. Es la base de datos en sí, no sé el estado actual.
Clyde
Typo - debe ser HEADERONLY (no HEADERSONLY). No puedo editar la publicación.
Greg Sansom