恢复到数据库快照

4月 2nd, 2011

如何恢复到快照结果,说明恢复操作的限制,并提供指向恢复过程的链接.作为从备份中还原联机数据库的替代方法,任何对源数据库具有 RESTORE DATABASE 权限的用户均可将该数据库恢复到创建数据库快照时的状态.当联机源数据库中的数据损坏时,恢复到最近的快照可能比较合适.但是,请确保该快照是在发生错误之前创建的,并且数据库尚未损坏.例如,恢复操作可以恢复最近出现的严重用户错误,如删除表.

通过从稀疏文件中将写入时复制的页复制回源数据库,恢复操作将覆盖自快照创建以来对源数据库进行的更新.只有更新过的页才会被覆盖.恢复操作随后会覆盖旧的日志文件,并重建日志.因此,以后无法将恢复后的数据库前滚到出现用户错误时的状态,并且自快照创建以来对数据库进行的更改将丢失.恢复后的数据库的元数据与创建快照时的元数据相同.

恢复到某个快照还会删除所有全文目录.

对恢复的限制

下列情况不支持恢复:

  • 源数据库包含任何只读或压缩的文件组.
  • 某些在创建快照时处于联机状态的文件已脱机.
  • 当前存在多个数据库快照.
    只有要恢复的快照才可存在.

在恢复数据库之前,注意下列事项:

  • 从数据库快照恢复不适用于媒体恢复.与定期备份集不同,数据库快照并非数据库文件的完整副本.如果数据库或数据库快照已损坏,则可能无法从快照恢复.另外,如果损坏的话,即便可以恢复,也可能无法更正该问题.
  • 在恢复操作期间,快照和源数据库都不可用.源数据库和快照都将被标记为”正在还原”.如果在恢复操作期间出现错误,则当数据库再次启动时,恢复操作将会尝试完成恢复.
  • 由于成功的恢复操作会自动重建日志,因此 Microsoft 建议在恢复数据库之前备份日志.虽然不能还原原始日志以便将数据库前滚,但是可以使用原始日志文件中的信息来重新构造丢失的数据.
  • 恢复操作会打断日志备份链.因此,必须先对恢复的数据库进行完整数据库备份或文件备份,然后才能进行日志备份.Microsoft 建议进行完整数据库备份.

将数据库恢复到数据库快照

数据库快照不是冗余存储,因此,不针对磁盘错误或其他类型的损坏提供任何保护功能.但是,如果在联机数据库中发生用户错误,则可以将数据库恢复到发生错误之前的数据库快照.

重要提示:为了保护数据库,非常有必要定期执行备份并测试还原计划.如果必须将源数据库还原到创建数据库快照的时间点,请实施允许您执行该操作的备份策略.

恢复的数据库会覆盖原来的源数据库.恢复到快照将删除所有全文目录.

  1. 标识要将数据库恢复到的数据库快照.此外,您还可以在 sys.databases 目录视图的source_database_id 列中找到某个视图的源数据库.
  2. 删除其他任何数据库快照.
    有关删除快照的信息.如果数据库使用完整恢复模式,则在执行恢复之前,应先备份日志
  3. 执行恢复操作.
    恢复操作要求对源数据库具有 RESTORE DATABASE 权限.若要恢复数据库,请使用下列 Transact-SQL语句
    :
    RESTORE DATABASE 
    <数据库名称> FROM DATABASE_SNAPSHOT =<数据库快照名称
    >
    其中,<数据库名称> 是源数据库的名称,<数据库快照名称> 是要将数据库恢复到的快照的名称.注意,必须在此语句中指定快照名称而非备份设备.

注意:在恢复操作过程中,快照和源数据库都不可用.源数据库和快照都标记为”还原中”.如果在恢复操作期间发生错误,则数据库在重新启动后,将尝试完成恢复操作.

  1. 如果创建数据库快照后数据库所有者发生了变化,您可能希望更新恢复的数据库的数据库所有者.

注意:已恢复的数据库将保留数据库快照的权限和配置(例如,数据库所有者和恢复模式).

  1. 启动数据库.
  2. 尤其在使用完整(或大容量日志)恢复模式时,可以选择备份已恢复的数据库.本节包含将数据库恢复到数据库快照的示例.

A. 恢复 AdventureWorks2008R2 数据库的快照

此示例假定 AdventureWorks2008R2 数据库当前只存在一个快照.

USE master;

— Reverting AdventureWorks2008R2 to AdventureWorks2008R2_dbss1800

RESTORE DATABASE AdventureWorks2008R2 FROM

DATABASE_SNAPSHOT = ‘AdventureWorks2008R2_dbss1800’;

GO

B. 恢复 Sales 数据库的快照

此示例假定 Sales 数据库当前存在两个快照:sales_snapshot0600  sales_snapshot1200.此示例删除了较旧的快照并将数据库恢复到较新的快照.

–Test to see if sales_snapshot0600 exists and if it

— does, delete it.

IF EXISTS (SELECT dbid FROM sys.databases

    WHERE NAME=’sales_snapshot0600′)

    DROP DATABASE SalesSnapshot0600;

GO

— Reverting Sales to sales_snapshot1200

USE master;

RESTORE DATABASE Sales FROM DATABASE_SNAPSHOT = ‘sales_snapshot1200’;

GO

标签:
目前还没有任何评论.