无法将数据库还原到 SQL Server 中的快照

Posted

技术标签:

【中文标题】无法将数据库还原到 SQL Server 中的快照【英文标题】:Unable to restore database to a snapshot in SQL Server 【发布时间】:2016-04-22 09:21:02 【问题描述】:

我想在每次运行单元测试时创建一个数据库快照并将数据库恢复到它。我可以创建快照,但在还原它时,我在执行此操作时遇到以下错误。

消息 5070,第 16 级,状态 2,第 1 行 当其他用户正在使用数据库“ImportData”时,无法更改数据库状态

消息 3013,第 16 级,状态 1,第 1 行 RESTORE DATABASE 异常终止。

下面列出了用于创建数据库并将其还原为快照的 SQL 查询。

创建快照:

CREATE DATABASE Data_SShot
ON (NAME=Data,
    FILENAME='C:\Snapshot\DataSnapshot.ss'),
   (NAME=Data_Data1,
    FILENAME='C:\Snapshot\Data1Snapshot.ss'),
   (NAME=Data_Index1,
    FILENAME='C:\Snapshot\DataIndexSnapshot.ss')
AS SNAPSHOT OF Data

恢复到快照

use master
go

RESTORE DATABASE Data 
FROM DATABASE_SNAPSHOT = 'Data_SShot'

它表明

当其他用户正在使用数据库时,无法更改数据库状态

如何克服这个问题?我正在使用 .NET (C#) 来执行此操作。如何关闭连接才能成功运行RESTORE DATABASE

我希望在测试套件中的每个测试都发生创建快照并将数据库恢复到它的整个过程。

【问题讨论】:

This SO post 会帮忙的,我想。 您需要先使数据库脱机。 【参考方案1】:

在恢复数据库之前需要做几件事。

    获取数据库的活跃用户数并终止会话。 使数据库离线和在线,这将终止所有隐藏的连接。 现在恢复数据库。如果失败,则使数据库脱机并尝试恢复。 还原完成后,使数据库联机。

这些是我一直用于数据库恢复的步骤,它已经为我工作了很长时间。

【讨论】:

【参考方案2】:

执行以下操作:

ALTER DATABASE [Data] SET SINGLE_USER

RESTORE DATABASE Data 
FROM DATABASE_SNAPSHOT = 'Data_SShot'

ALTER DATABASE [Data] SET MULTI_USER WITH NO_WAIT

【讨论】:

以上是关于无法将数据库还原到 SQL Server 中的快照的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2012,无法从 .bak 文件还原数据库

sql server 各种快照类型

sql server 2012的备份怎么还原到sql server 2008

sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法

如何设置将SQL SERVER2012数据库备份还原到SQL SERVER2008上

自动表快照(无作业)SQL Server