将数据库恢复到特定恢复点的最佳方法
本主题仅与使用完整恢复模式或大容量日志恢复模式的 SQL Server 数据库有关。本主题介绍用于将数据库还原到特定恢复点(时间点、标记的事务或日志序列号 (LSN))的一些最佳做法。
使用 STANDBY 来查找未知的时间点
有时候,您想要将数据库还原到某一特定的时间点,但并不确切知道最适合您的恢复目标的时间点(也就是说,您的最佳恢复点)。若要找到此恢复点,您可以将 RESTORE … WITH STANDBY **=**standby_file_name 与 STOPAT 子句(其目标时间在您正查找的恢复点之前)一起使用。STANDBY 还原操作恢复只读访问的数据库,使您可以检查数据库以便找到您的最佳恢复点。
通过使用一系列的 STANDBY 还原操作,您可以在主数据文件(也可以是其他数据文件)中渐次向前滚动,直到找到您的最佳恢复点。在您确定了最佳恢复点后,可以再次向前滚动数据库,并且指定 WITH STOPAT 以便将您的最佳恢复点指定为目标时间点。到达此目标时间点时,使用 WITH RECOVERY 选项还原部分数据库。
然后,可以还原剩余文件(如果有)并将其恢复到与数据库一致的状态。还原完最后一个完整日志后,应还原在目标恢复点之后获取的第一个日志备份。
有关 STANDBY 选项的详细信息,请参阅 RESTORE 参数 (Transact-SQL)。
在还原顺序中尽早指定时点
还原顺序由通过一个或多个还原阶段来移动数据的一个或多个还原操作组成。您提供的有关该还原顺序意向的信息越多,遇到那些可能需要重新开始的错误的几率就越小。对于时点还原,SQL Server 数据库引擎使用在还原顺序开始时(或过程中)指定的信息来确定还原操作的目标时点。如果在顺序中等待时间过长,则该顺序将失败。必须在还原顺序中尽早提供停止信息,以确保还原不会超过您的时点目标。
如果希望在特定恢复点停止,则应将此意向与 RECOVERY 选项一起传达给每个 RESTORE LOG 语句(通过使用 STOPAT、STOPBEFOREMARK 或 STOPATMARK)。当 RECOVERY 和 STOPAT 选项同时使用时,如果事务日志备份不包含要求的时间(例如,如果指定的时间超出了事务日志所包含的时间范围),则会生成警告,并且不会恢复数据库。到达恢复点时,会恢复数据库,而试图还原其他日志备份的操作将失败。如果在还原日志备份时同时使用 RECOVERY 和 STOPAT 选项,可确保任何日志还原都不会超过停止时间。
重要提示 |
---|
如果部分还原顺序不包括任何 FILESTREAM 文件组,则不支持时点还原。可以强制继续执行还原顺序。但在 RESTORE 语句中省略的 FILESTREAM 文件组将永远无法还原。若要强制执行时点还原,请指定 CONTINUE_AFTER_ERROR 选项以及 STOPAT、STOPATMARK 或 STOPBEFOREMARK 选项,还必须在随后的 RESTORE LOG 语句中指定后面的三个选项。如果指定 CONTINUE_AFTER_ERROR,则部分还原顺序将成功,但 FILESTREAM 文件组将不可恢复。 |
示例:时点还原
在以下示例中,还原顺序开始声明在特定时间停止应用第一个日志备份的意向。在该示例中,停止时间出现在差异备份后的第一个日志备份中。
RESTORE DATABASE database_name FROM full_backup
WITH NORECOVERY;
RESTORE DATABASE database_name FROM full_differential_backup
WITH NORECOVERY;
RESTORE LOG database_name FROM log_backup
WITH STOPAT = time, RECOVERY;
RESTORE LOG database_name FROM log_backup
WITH STOPAT = time, RECOVERY;
指定的日志还原能否成功取决于 time 是否在日志备份所捕获的时间间隔中(如下表中所述)。
time 与日志备份所捕获的间隔之间的关系: |
结果 |
---|---|
time 在间隔之前。 |
还原失败,不会进行前滚。 |
time 在间隔中。 |
上一次还原成功,数据库被恢复。 |
time 在间隔之后。 |
前滚成功,但数据库未恢复,因为尚未到 time。 |
在每个后续 RESTORE 语句中声明停止点
只有指定了 STOPAT、STOPBEFOREMARK 或 STOPATMARK 选项的语句才能声明停止点。如果在 RESTORE 语句中忽略该选项,则将还原完整备份。
当时点还原顺序正在进行中时,可以通过为 time 指定新值来更改恢复点(假定数据库尚未超过指定的新 time)。
注意 |
---|
STOPBEFOREMARK 和 STOPATMARK 选项有两个参数:mark_name 和 lsn_number。只有 RESTORE LOG 语句支持 mark_name 参数,该参数在日志备份中标识一个事务标记。RESTORE DATABASE 语句和 RESTORE LOG 语句均支持 lsn_number 参数,该参数指定一个日志序列号。 |
更改历史记录
更新的内容 |
---|
更正了“使用 STANDBY 来查找未知的时间点”部分,以便阐明 WITH STANDBY 仅使您能够撤消恢复过程的影响。 |