数据库快照不是冗余存储,因此,不针对磁盘错误或其他类型的损坏提供任何保护功能。但是,如果在联机数据库中发生用户错误,则可以将数据库恢复到发生错误之前的数据库快照。
重要提示 |
---|
为了保护数据库,非常有必要定期执行备份并测试还原计划。如果必须将源数据库还原到创建数据库快照的时间点,请实施允许您执行该操作的备份策略。 |
恢复的数据库会覆盖原来的源数据库。恢复到快照将删除所有全文目录。
重要提示 |
---|
在执行恢复之前,应熟悉恢复到数据库快照中的信息。 |
将数据库恢复到数据库快照
-
标识要将数据库恢复到的数据库快照。您可以在 SQL Server Management Studio 中查看数据库快照(请参阅如何查看数据库快照 (SQL Server Management Studio))。此外,您还可以在 sys.databases (Transact-SQL) 目录视图的 source_database_id 列中找到某个视图的源数据库。
-
删除其他任何数据库快照。
有关删除快照的信息,请参阅如何删除数据库快照 (Transact-SQL)。如果数据库使用完整恢复模式,则在执行恢复之前,应先备份日志。有关详细信息,请参阅如何备份事务日志 (SQL Server Management Studio) 或如何在数据库损坏时备份事务日志 (Transact-SQL)。
-
执行恢复操作。
恢复操作要求对源数据库具有 RESTORE DATABASE 权限。若要恢复数据库,请使用下列 Transact-SQL 语句:
RESTORE DATABASE <数据库名称> FROM DATABASE_SNAPSHOT =<数据库快照名称>
其中,<数据库名称> 是源数据库的名称,<数据库快照名称> 是要将数据库恢复到的快照的名称。注意,必须在此语句中指定快照名称而非备份设备。
有关详细信息,请参阅 RESTORE (Transact-SQL)。
注意 在恢复操作过程中,快照和源数据库都不可用。源数据库和快照都标记为“还原中”。如果在恢复操作期间发生错误,则数据库在重新启动后,将尝试完成恢复操作。
-
如果创建数据库快照后数据库所有者发生了变化,您可能希望更新恢复的数据库的数据库所有者。
注意 已恢复的数据库将保留数据库快照的权限和配置(例如,数据库所有者和恢复模式)。
-
启动数据库。
-
尤其在使用完整(或大容量日志)恢复模式时,可以选择备份已恢复的数据库。有关备份数据库的信息,请参阅如何备份数据库 (SQL Server Management Studio) 或如何创建完整数据库备份 (Transact-SQL)。
本节包含将数据库恢复到数据库快照的示例。
A. 恢复 AdventureWorks2008R2 数据库的快照
此示例假定 AdventureWorks2008R2 数据库当前只存在一个快照。有关在此创建数据库要恢复到的快照的示例,请参阅如何创建数据库快照 (Transact-SQL)。
USE master; -- Reverting AdventureWorks2008R2 to AdventureWorks2008R2_dbss1800 RESTORE DATABASE AdventureWorks2008R2 from DATABASE_SNAPSHOT = 'AdventureWorks2008R2_dbss1800'; GO
B. 恢复 Sales 数据库的快照
此示例假定 Sales 数据库当前存在两个快照:sales_snapshot0600 和 sales_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_snapshot1200 USE master; RESTORE DATABASE Sales FROM DATABASE_SNAPSHOT = 'sales_snapshot1200'; GO