将数据库恢复到数据库快照
如果联机数据库中的数据损坏,在某些情况下,将数据库恢复到发生损坏之前的数据库快照可能是一种合适的替代方案,替代从备份中还原数据库。 例如,通过恢复数据库可能会恢复最近出现的严重用户错误,如删除表。 但是,在该快照创建以后进行的所有更改都会丢失。
**开始之前: **
限制和局限
先决条件
安全性
**将数据库恢复到数据库快照,使用:**Transact-SQL
开始之前
限制和局限
下列情况不支持恢复:
数据库当前肯定只有一个数据库快照,并且您计划恢复到该快照。
数据库中存在任何只读或压缩的文件组。
数据库中有快照创建时联机而现在却脱机的任何文件。
在恢复数据库之前,请考虑以下限制:
恢复并不适用于介质恢复。 . 数据库快照是不完整的数据库文件副本,因此,如果数据库或数据库快照损坏,则不可能从快照进行恢复。 另外,如果损坏的话,即便可以恢复,也可能无法更正该问题。 因此,定期执行备份并对还原计划进行测试对于保护数据库至关重要。 有关详细信息,请参阅 SQL Server 数据库的备份和还原。
注意 如果需要能够将源数据库还原至创建数据库快照的时点,请使用完整恢复模式并实施允许您执行该操作的备份策略。
原始的源数据库会被恢复后的数据库覆盖,因此该快照创建后的所有数据库更新都会丢失。
恢复操作还会覆盖旧日志文件并重新生成日志。 因此,无法将恢复后的数据库前滚至发生用户错误的点。 所以,建议您在恢复数据库之前备份日志。
注意 虽然不能还原原始日志以便将数据库前滚,但是可以使用原始日志文件中的信息来重新构造丢失的数据。
恢复操作会打断日志备份链。 因此,必须首先进行完整的数据库备份或文件备份,然后才能够进行恢复后的数据库的日志备份。 建议您进行完整的数据库备份。
在执行恢复操作的过程中,快照和源数据库都不可用。 源数据库和快照都将被标记为“正在还原”。如果在执行恢复操作的过程中出现错误,则当数据库再次启动时,恢复操作将会尝试完成恢复。
恢复后的数据库的元数据与创建快照时的元数据相同。
恢复操作会删除所有的全文目录。
[返回页首]
先决条件
确保源数据库与数据库快照满足以下先决条件:
确认数据库没有损坏。
注意 如果数据库已损坏,您将需要从备份中还原它。 有关详细信息,请参阅完整数据库还原(简单恢复模式)或完整数据库还原(完整恢复模式)。
标识在发生错误之前新近创建的快照。 有关详细信息,请参阅查看数据库快照 (SQL Server)。
删除当前数据库中存在的任何其他快照。 有关详细信息,请参阅删除数据库快照 (Transact-SQL)。
[返回页首]
安全性
权限
任何具有源数据库 RESTORE DATABASE 权限的用户都可以将其恢复至创建数据库快照时的状态。
[返回页首]
如何将数据库恢复到数据库快照(使用 Transact-SQL)
将数据库恢复到数据库快照
注意 |
---|
有关此过程的示例,请参阅本节后面的示例 (Transact-SQL)。 |
标识要将数据库恢复到的数据库快照。 您可以在 SQL Server Management Studio 中查看数据库快照(请参阅查看数据库快照 (SQL Server))。 此外,您还可以在 sys.databases (Transact-SQL) 目录视图的 source_database_id 列中找到某个视图的源数据库。
删除其他任何数据库快照。
有关删除快照的信息,请参阅删除数据库快照 (Transact-SQL)。 如果数据库使用完整恢复模式,则在执行恢复之前,应先备份日志。 有关详细信息,请参阅备份事务日志 (SQL Server) 或在数据库损坏时备份事务日志 (SQL Server)。
执行恢复操作。
恢复操作要求对源数据库具有 RESTORE DATABASE 权限。 若要恢复数据库,请使用下列 Transact-SQL 语句:
RESTORE DATABASE database_name FROM DATABASE_SNAPSHOT = database_snapshot_name
其中,database_name 是源数据库的名称,database_snapshot_name 是要将数据库恢复到的快照的名称。 注意,必须在此语句中指定快照名称而非备份设备。
有关详细信息,请参阅 RESTORE (Transact-SQL)。
注意 在恢复操作过程中,快照和源数据库都不可用。 源数据库和快照都标记为“还原中”。如果在恢复操作期间发生错误,则数据库在重新启动后,将尝试完成恢复操作。
如果创建数据库快照后数据库所有者发生了变化,您可能希望更新恢复的数据库的数据库所有者。
注意 已恢复的数据库将保留数据库快照的权限和配置(例如,数据库所有者和恢复模式)。
启动数据库。
尤其在使用完整(或大容量日志)恢复模式时,可以选择备份恢复后的数据库。 若要备份数据库,请参阅创建完整数据库备份 (SQL Server)。
[返回页首]
示例 (Transact-SQL)
本节包含演示如何将数据库恢复到数据库快照的以下示例:
A. 恢复 AdventureWorks 数据库的快照
B. 恢复 Sales 数据库的快照
A.恢复 AdventureWorks 数据库的快照
此示例假定 AdventureWorks2012 数据库当前只存在一个快照。 有关在此创建数据库要恢复到的快照的示例,请参阅创建数据库快照 (Transact-SQL)。
USE master;
-- Reverting AdventureWorks to AdventureWorks_dbss1800
RESTORE DATABASE AdventureWorks from
DATABASE_SNAPSHOT = 'AdventureWorks_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
[返回页首]
相关任务
[返回页首]