本主题仅适用于在计划 SQL Server 数据库的段落恢复时数据库包含多个文件组的情况(在简单模式,则仅涉及只读文件组)。
如果还原顺序中的某个文件处于还原、恢复挂起或离线状态,则可以在不还原其数据的情况下恢复文件。在确定是必须还原文件的完整备份,还是可以只恢复文件时,可以使用 sys.database_files 和 sys.master_files 目录视图中存储的元数据来帮助判断。
重做 LSN
第一步是检查包含“重做 LSN**”的目录视图列:redo_start_lsn、redo_start_fork_guid、redo_target_lsn 和 redo_target_fork_guid。下表介绍了重做 LSN 以及应如何对其进行解释。
列
说明
redo_start_lsn 和 redo_start_fork_guid
这些列一起构成表示文件时点的 (lsn,guid) 对。这些列的值随着文件的前滚而发生更改。前滚将从此点继续进行。
重要提示:
如果 redo_start_lsn = NULL,则文件在磁盘上的状态未知,这种情况下必须从完整备份还原文件。
redo_target_lsn 和 redo_target_fork_guid
这些列一起构成一个 (lsn,guid) 对,它定义了一个恢复点(“目标恢复点**”)。必须将文件还原到此恢复点,才能保证与在线数据库保持一致。
决定是使用 sys.database_files 还是使用 sys.master_files
sys.database_files 和 sys.master_files 目录视图都包含重做 LSN 列,但这两个视图并不总是一致的。通常,如果数据库处于在线状态,则 sys.database_files 和 sys.master_files 的值是一致的。但是,在下面的情况下,它们的值会不一致:
- 如果数据库为只读,则不会用备份所导致的更改来更新 sys.database_files,因此只有 sys.master_files 包含最新的信息。
注意:
若要确定文件是否为只读,请检查 is_read_only 和 read_only_lsn 列。is_read_only 指出了文件是否为只读。如果是只读的,read_only_lsn 就是该文件变为只读的点。 - 如果数据库处于离线状态(例如,正在对数据库进行还原),则不能访问数据库目录。对于离线数据库,必须使用 sys.master_files 来获取信息。
- 如果还原操作目前正在影响文件,则会更新文件的重做 LSN,且重做 LSN 将变得不一致。因此,应该仅在两次还原之间检查重做 LSN 列。
有关这些列的说明
![]() |
---|
本部分假定您熟悉恢复路径和恢复分叉概念。有关详细信息,请参阅恢复路径。 |
本部分仅适用于您已执行时点恢复并且您仍有来自某个失效恢复路径的备份这一情况。在还原处于还原、恢复挂起或离线状态的文件时,与恢复分叉有关。通过分析恢复分叉,可以标识潜在的恢复路径。通常,只有一条恢复路径是恢复数据库的最佳途径。
若要标识最佳恢复路径,必须确定文件是位于目标恢复分叉还是位于其他恢复分叉:
该文件在其他恢复分叉上。
如果 redo_start_fork_guid!=redo_target_fork_guid,并且不是 redo_target_fork_guid 的祖先,则该文件位于目标分叉之外的其他恢复分叉上。注意:
若要定位祖先分叉,请按照日志链向后查找。有关详细信息,请参阅恢复路径。 在这种情况下,必须从完整备份还原该文件。还原操作会将该文件置于某个点,该点是数据库当前恢复点的有效祖先。
注意:
若要还原任何文件,文件备份必须是数据库恢复点的祖先。始终查找文件的最新完整备份。数据必须前滚到目标点。唯一例外的情况是只读文件,在备份之前,如果文件已经为只读,则不必前滚只读文件的文件备份。如有必要,在还原文件备份之后可还原差异文件备份(如果有)和日志备份,使文件到达目标恢复点。 文件位于当前(目标)恢复分叉上,或者是目标分叉的祖先。
注意:
如果恢复数据库后已经执行了文件备份,则文件位于目标恢复分叉上。 在这些情况下,是否必须还原文件取决于 redo_start_lsn 与 redo_target_lsn 的关系,如下表所述。
操作
![]() |
---|
恢复了某个恢复路径的备份之后,备用恢复路径便不再有效。这些无效恢复路径所对应的备份也将失效。最佳方法是删除失效备份,或者保留这些备份,并将其清晰地标记为失效。 |
请参阅
概念
恢复路径
计划和执行还原顺序(完整恢复模式)
确定恢复文件或文件组的下一步
日志序列号简介
执行在线还原
执行段落还原
执行文件还原(完整恢复模式)
执行文件还原(简单恢复模式)