执行文件还原(完整恢复模式)

本主题仅与在完整恢复模式或大容量恢复模式下包含多个文件或文件组的数据库相关。

文件还原的目标是还原一个或多个损坏的文件,而不是还原整个数据库。SQL Server 的所有版本都支持在数据库处于脱机状态时还原文件(“脱机页面还原”)。SQL Server 2005 Standard、SQL Server 2005 Express Edition、SQL Server 2005 Workgroup 以及更高版本仅支持脱机还原,并且将文件还原至主文件组时始终要求数据库处于脱机状态。如果数据库已经处于脱机状态,则 SQL Server 2005 Enterprise Edition 及更高版本使用脱机还原。

在 SQL Server 2005 Enterprise Edition 及更高版本中,如果在文件还原过程中数据库处于联机状态,则数据库将保持联机状态。数据库处于在线状态时还原和恢复文件称为“在线文件还原”。

这些文件还原方案如下:

  • 脱机文件还原

    在脱机文件还原中,还原已损坏的文件或文件组时,数据库处于脱机状态。还原顺序结束时,数据库将联机。

  • 联机文件还原

    在 SQL Server 2005 Enterprise Edition 及更高版本中,当数据库处于联机状态时将自动执行联机文件还原。不过,任何文件组中如果有文件正在被还原,则该文件组处于离线状态。恢复脱机文件组中的所有文件之后,该文件组将自动变为联机状态。有关联机还原的详细信息,请参阅执行联机还原

    注意注意

    只能查询或更新联机的文件组。尝试访问处于脱机状态的文件组(包括其中包含正在还原或恢复的文件的文件组)会导致出现错误。

如果正在还原的文件组为读/写文件组,则在还原上一次数据备份或差异备份以后必须应用连续的日志备份链。这样才会使文件组记录到日志文件的当前活动日志记录中。恢复点通常靠近日志的末端,但并非总是如此。

如果正在还原的文件组为只读文件组,则通常不需要应用日志备份,并且会跳过该操作。如果在文件变成只读后进行了备份,则该备份为要还原的最后备份。前滚在目标点停止。

还原文件或文件组

从文件备份和差异文件备份中还原一个或多个受损文件

  1. 创建活动事务日志的结尾日志备份。

    如果因为日志已损坏而无法执行此操作,则必须还原整个数据库。有关如何备份事务日志的信息,请参阅创建事务日志备份

    重要说明重要提示

    对于脱机文件还原,在文件还原之前必须始终先进行一次结尾日志备份。对于联机文件还原,在文件还原之后必须始终先进行一次日志备份。此日志备份对于将文件恢复到与数据库的其余部分一致的状态至关重要。

  2. 从每个损坏的文件的最新文件备份还原相应文件。

  3. 针对每个还原的文件,还原最近的差异文件备份(如果有)。

  4. 按顺序还原事务日志备份,从覆盖最早还原文件的备份开始,到在步骤 1 中创建的结尾日志备份结束。

    必须还原在文件备份后创建的事务日志备份才能使数据库处于一致状态。事务日志备份可以快速前滚,因为仅应用了对还原文件所做的更改。与还原整个数据库相比,更好的方式是还原单个文件,因为并不会复制并随后前滚未损坏的文件。但是,仍需要读取整个日志备份链。

  5. 恢复数据库。

注意注意

文件备份可用于将数据库还原到早期时间点。必须还原一组完整的文件备份,然后依次将事务日志备份还原到目标点(目标点是结束最近还原的文件备份后的时间点),才能执行此操作。有关时点恢复的详细信息,请参阅将数据库还原到备份中的某个时间点

还原文件和文件组

高级主题

脱机文件还原的 Transact-SQL 还原顺序(完整恢复模式)

文件还原方案由复制、前滚和恢复相应数据的单一还原顺序组成。

下列 Transact-SQL 代码显示了文件还原方案的还原顺序中的关键 RESTORE 选项。将省略与此目的不相关的语法和详细信息。

该示例说明了如何使用 NORECOVERY 脱机还原两个辅助文件 A 和 B。随后,对两个日志备份应用 NORECOVERY,然后是结尾日志备份(用 RECOVERY 还原)。该示例从让文件脱机开始,说明了脱机文件还原的过程。

--Take the file offline.
ALTER DATABASE database_name MODIFY FILE SET OFFLINE
-- Back up the currently active transaction log.
BACKUP LOG database_name
   TO <tail_log_backup>
   WITH NORECOVERY
GO 
-- Restore the files.
RESTORE DATABASE database_name FILE=<name> 
   FROM <file_backup_of_file_A> 
   WITH NORECOVERY
RESTORE DATABASE database_name FILE=<name> ......
   FROM <file_backup_of_file_B> 
   WITH NORECOVERY
-- Restore the log backups.
RESTORE LOG database_name FROM <log_backup> 
   WITH NORECOVERY
RESTORE LOG database_name FROM <log_backup> 
   WITH NORECOVERY
RESTORE LOG database_name FROM <tail_log_backup> 
   WITH RECOVERY