为处于还原、恢复挂起或离线状态的文件计划段落还原顺序

 本主题仅与在您计划数据库的段落恢复时包含多个文件组的 SQL Server 数据库相关(并且在简单模式下,仅与只读文件组有关)。

如果还原顺序中的某个文件处于还原、恢复挂起或脱机状态,则可以在不还原其数据的情况下恢复文件。在确定是必须还原文件的完整备份,还是可以只恢复文件时,可以使用 sys.database_filessys.master_files 目录视图中存储的元数据来帮助判断。

重做 LSN

第一步是检查包含“重做 LSN”的目录视图列:redo_start_lsnredo_start_fork_guidredo_target_lsnredo_target_fork_guid。下表介绍了重做 LSN 以及应如何对其进行解释。

说明

redo_start_lsnredo_start_fork_guid

这些列一起构成表示文件时点的 (lsn,guid) 对。这些列的值随着文件的前滚而发生更改。前滚将从此点继续进行。

重要说明重要提示
如果 redo_start_lsn = NULL,则文件在磁盘上的状态未知,这种情况下必须从完整备份还原文件。

redo_target_lsnredo_target_fork_guid

这些列一起构成一个 (lsn,guid) 对,它定义了一个恢复点(“目标恢复点”)。必须将文件还原到此恢复点,才能保证与联机数据库保持一致。

决定是使用 sys.database_files 还是使用 sys.master_files

sys.database_filessys.master_files 目录视图都包含重做 LSN 列,但这两个视图并不总是一致的。通常,如果数据库处于联机状态,则 sys.database_filessys.master_files 的值是一致的。但是,在下面的情况下,它们的值会不一致:

  • 如果数据库为只读,则不会用备份所导致的更改来更新 sys.database_files,因此只有 sys.master_files 包含最新的信息。

    注意注意

    若要确定文件是否为只读,请检查 is_read_onlyread_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_lsnredo_target_lsn 的关系,如下表所述。

    操作

    结果

    redo_start_lsn=redo_target_lsn

    文件不必还原。

    该文件与数据库保持一致,不使用 RESTORE DATABASE database_name WITH RECOVERY 即可使其联机。

    redo_start_lsn <redo_target_lsn

    在使文件联机之前,前滚必须到达 redo_target_lsn

    redo_start_lsn >redo_target_lsn

    数据库早于文件。必须从完整备份还原文件(否则数据库可以使用另一个部分还原顺序重新还原到一个较晚的时点)。

    注意注意
    这种情况仅可能在脱机还原时出现,因为一旦恢复主文件组,就会生成新的恢复分叉。所有未恢复的辅助文件组将不再与主文件组位于同一个恢复路径中。
注意注意

恢复了某个恢复路径的备份之后,备用恢复路径便不再有效。这些无效恢复路径所对应的备份也将失效。最佳方法是删除失效备份,或者保留这些备份,并将其清晰地标记为失效。