如何将数据库恢复到数据库快照 (Transact-SQL)

来源:互联网 发布:c语言编译器win10下载 编辑:程序博客网 时间:2024/05/22 00:40

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

重要说明重要提示

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

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

重要说明重要提示

在执行恢复之前,应熟悉恢复到数据库快照中的信息。

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

  1. 标识要将数据库恢复到的数据库快照。您可以在 SQL Server Management Studio 中查看数据库快照(请参阅如何查看数据库快照 (SQL Server Management Studio))。此外,您还可以在 sys.databases (Transact-SQL) 目录视图的 source_database_id 列中找到某个视图的源数据库。

  2. 删除其他任何数据库快照。

    有关删除快照的信息,请参阅如何删除数据库快照 (Transact-SQL)。如果数据库使用完整恢复模式,则在执行恢复之前,应先备份日志。有关详细信息,请参阅如何备份事务日志 (SQL Server Management Studio)如何在数据库损坏时备份事务日志 (Transact-SQL)

  3. 执行恢复操作。

    恢复操作要求对源数据库具有 RESTORE DATABASE 权限。若要恢复数据库,请使用下列 Transact-SQL 语句:

    RESTORE DATABASE <数据库名称> FROM DATABASE_SNAPSHOT =<数据库快照名称>

    其中,<数据库名称> 是源数据库的名称,<数据库快照名称> 是要将数据库恢复到的快照的名称。注意,必须在此语句中指定快照名称而非备份设备。

    有关详细信息,请参阅 RESTORE (Transact-SQL)

    注意注意

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

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

    注意注意

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

  5. 启动数据库。

  6. 尤其在使用完整(或大容量日志)恢复模式时,可以选择备份已恢复的数据库。有关备份数据库的信息,请参阅如何备份数据库 (SQL Server Management Studio)如何创建完整数据库备份 (Transact-SQL)

本节包含将数据库恢复到数据库快照的示例。

A. 恢复 AdventureWorks2008R2 数据库的快照

此示例假定 AdventureWorks2008R2 数据库当前只存在一个快照。有关在此创建数据库要恢复到的快照的示例,请参阅如何创建数据库快照 (Transact-SQL)

复制代码
USE master;-- Reverting AdventureWorks2008R2 to AdventureWorks2008R2_dbss1800RESTORE DATABASE AdventureWorks2008R2 from DATABASE_SNAPSHOT = 'AdventureWorks2008R2_dbss1800';GO

B. 恢复 Sales 数据库的快照

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

有关用于创建此示例所基于的示例数据库和快照的代码,请参阅:

  • 有关 Sales 数据库和 sales_snapshot0600 快照,请参阅 CREATE DATABASE (Transact-SQL) 中的“使用文件组创建数据库”和“创建数据库快照”。

  • 有关 sales_snapshot1200 快照,请参阅如何创建数据库快照 (Transact-SQL) 中的“创建 Sales 数据库的快照”。

复制代码
--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_snapshot1200USE master;RESTORE DATABASE Sales FROM DATABASE_SNAPSHOT = 'sales_snapshot1200';GO

原创粉丝点击