我正在将事务日志还原到数据库,但需要一种方法来知道我应该从哪个事务日志开始。通常我会看到类似以下内容:
此备份集中的日志终止于 LSN 103000001633300001,该时间太早,无法应用于数据库。可以恢复包含 LSN 103000002524300001 的较新的日志备份。
那么我如何以编程方式获取 LSN 103000002524300001?数据库处于 NORECOVERY 模式,因此 DBCC LOG 不起作用。我有事务日志本身的记录,所以我知道它们的第一个和最后一个 LSN 是什么。我只是不知道数据库本身目前位于何处。
答案1
答案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
返回备份的FirstLSN
和LastLSN
以及DatabaseBackupLSN
包含上次完整备份的 LSN 的。从这些您可以重新创建必要的恢复顺序。您永远不需要查看数据库 LSN,必要的顺序可以(并且应该)始终从备份媒体本身重新创建。