将数据库恢复到特定恢复点的最佳方法
本主题仅适用于那些使用完整或大容量日志恢复模式的数据库。
本主题介绍了将数据库还原到特定恢复点的几种最佳方法。
使用 STANDBY 来查找未知的时间点
有时,需要将数据库恢复到特定恢复点,但却不知道目标时间、LSN 或标记的事务(如果有)。一种解决方案是增量前滚主数据文件。也可以通过指定 WITH STANDBY **=**standby_file_name(而不是指定 WITH RECOVERY)增量前滚其他数据文件。使用 STANDBY 选项可恢复数据库以对其进行只读访问。这使您能够读取数据库并查找所需的时点信息。通过备用文件,您可以在数据库的前滚已超出目标时点的情况下消除恢复过程的影响。如果数据库尚未到达目标时点,则可以使用 WITH STANDBY 还原后续的日志备份,并在每个还原语句中指定相同的备用文件。
一旦确定了目标恢复点,则可以再次前滚到该时点。到达目标时间点时,使用 RECOVERY 选项还原部分数据库。然后,可以还原剩余文件(如果有的话)并将其恢复到与数据库一致的状态。还原完最后一个完整日志后,应还原在目标恢复点之后获取的第一个日志备份。
有关 STANDBY 选项的详细信息,请参阅 RESTORE 参数 (Transact-SQL)。
在还原顺序中尽早指定时点
还原顺序由通过一个或多个还原阶段来移动数据的一个或多个还原操作组成。您提供的有关该还原顺序意向的信息越多,遇到那些可能需要重新开始的错误的几率就越小。对于时点还原,SQL Server 数据库引擎使用在还原顺序开始时(或过程中)指定的信息来确定还原操作的目标时点。如果在顺序中等待时间过长,则该顺序将失败。必须在还原顺序中尽早提供停止信息,以确保还原不会超过您的时点目标。
如果希望在特定恢复点停止,则应将此意向与 RECOVERY 选项一起传达给每个 RESTORE LOG 语句(通过使用 STOPAT、STOPBEFOREMARK 或 STOPATMARK)。当 RECOVERY 和 STOPAT 选项同时使用时,如果事务日志备份不包含要求的时间(例如,如果指定的时间超出了事务日志所包含的时间范围),则会生成警告,并且不会恢复数据库。到达恢复点时,会恢复数据库,而试图还原其他日志备份的操作将失败。如果在还原日志备份时同时使用 RECOVERY 和 STOPAT 选项,可确保任何日志还原都不会超过停止时间。
示例:时点还原
在以下示例中,还原顺序开始声明在特定时间停止应用第一个日志备份的意向。在该示例中,停止时间出现在差异备份后的第一个日志备份中。
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 参数,该参数指定一个日志序列号。 |
请参阅
概念
应用事务日志备份
恢复到日志序列号 (LSN)
恢复到标记的事务
其他资源
RESTORE (Transact-SQL)
将数据库还原到备份中的某个时间点