在 NORECOVERY 模式下确定数据库的 LSN

在 NORECOVERY 模式下确定数据库的 LSN

我正在将事务日志还原到数据库,但需要一种方法来知道我应该从哪个事务日志开始。通常我会看到类似以下内容:

此备份集中的日志终止于 LSN 103000001633300001,该时间太早,无法应用于数据库。可以恢复包含 LSN 103000002524300001 的较新的日志备份。

那么我如何以编程方式获取 LSN 103000002524300001?数据库处于 NORECOVERY 模式,因此 DBCC LOG 不起作用。我有事务日志本身的记录,所以我知道它们的第一个和最后一个 LSN 是什么。我只是不知道数据库本身目前位于何处。

答案1

一些 lsn 列位于系统.master_files在服务器级别

“redo_start_lsn”列可能只是一张票。

顺便说一句,我还没有尝试过这个...

答案2

您可以通过如下查询获取此信息:

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

答案3

不确定是否可以通过编程从事务日志文件中获取第一个/最后一个 LSN,但您可以编写恢复脚本以尝试按顺序应用您拥有的每个事务日志 - “太早”的日志(已存在于数据库中)将因此错误而失败。其余的应该可以干净地应用。

希望有人有更好的想法——我可以想象,如果您有大量事务日志,等待会非常痛苦,因为可能需要扫描整个日志才能确定初始和最终的 LSN 是什么。

答案4

RESTORE HEADERONLY返回备份的FirstLSNLastLSN以及DatabaseBackupLSN包含上次完整备份的 LSN 的。从这些您可以重新创建必要的恢复顺序。您永远不需要查看数据库 LSN,必要的顺序可以(并且应该)始终从备份媒体本身重新创建。

相关内容