无法恢复 SQL Server 快照

5
由于某种原因,我无法恢复我的SQL Server快照。
我有一个名为DB01的数据库和一个名为DB01_SS的快照。
当尝试使用以下查询恢复快照时:
USE master
GO

ALTER DATABASE DB01 SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO

RESTORE DATABASE DB01 FROM DATABASE_SNAPSHOT = 'DB01_SS';
GO

ALTER DATABASE DB01 SET MULTI_USER
GO

我收到了这个错误信息:
Msg 3137, Level 16, State 1, Line 5 无法还原数据库。主要快照或快照名称未正确指定,所有其他快照未被删除,或存在缺失的文件。 Msg 3013, Level 16, State 1, Line 5 RESTORE DATABASE异常终止。
我已经检查过,名称已经正确指定。服务器上没有其他可用快照。唯一奇怪的事情是当我登录SQL Server查找快照文件时,发现与SSMS gui中的名称不同。它的名称为 DB_SS_2017.SS。尝试使用该名称还原时,我会收到以下错误:
Msg 911, Level 16, State 4, Line 5 数据库 DB_SS_2017.SS 不存在。确保输入的名称正确。 Msg 3013, Level 16, State 1, Line 5 RESTORE DATABASE异常终止。
最后但并非最不重要的是,在SSMS中尝试检查快照的属性时,属性按钮是灰色的!我该如何恢复SQL Server快照?

仅从您的帖子中看,似乎没有恢复方面的实际经验:您尝试过使用FROM DATABASE_SNAPSHOT ='DB01_SS.SS'吗?因为这个奇怪命名的文件以那个结尾... - RealCheeseLord
是的,我已经尝试过了。结果出现了911错误消息,SS不存在。 - doenoe
3个回答

11
您可能属于以下情况之一:
  1. 您定义了多个快照,请尝试在SSMS中刷新快照文件夹或运行 select * from sys.databases where source_database_id IS NOT NULL以查看是否有更多的快照。因为快照是“写时复制”,如果一个数据库有多个快照,您将无法还原。

  2. 您没有正确指定快照的逻辑名称。运行 select * from sys.databases where source_database_id IS NOT NULL以检查快照的逻辑名称。然后使用该名称重新运行还原操作。

  3. 您的快照文件不再与快照相关联(快照某种方式被损坏)。下面的语句查询快照文件中的页面,请运行它并查看是否有任何错误。 select db_name(database_id) [<database name>], database_id, count(*) from sys.dm_os_buffer_descriptors where database_id= (select top 1 database_id from sys.databases where source_database_id IS NOT NULL) group by database_id


2
您只能拥有一个快照。如果不知何故创建了第二个快照,它将无法正常工作。您必须先删除第一个快照,然后再创建新的快照。 - jsgoupil
3
@jsgoupil,你可以拥有多个快照(用于从中读取数据),但如果你有多个,就无法还原。 - Kosmo

0
根据您提供的信息,这个代码 应该 可以工作(因为您的数据库名为DB01,但快照名为DB_SS_2017.SS):
USE master
GO

ALTER DATABASE DB01 SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO

-- restore database "DB01" from the snapshot called "DB_SS_2017.SS" 
RESTORE DATABASE DB01 FROM DATABASE_SNAPSHOT = 'DB_SS_2017.SS';
GO

ALTER DATABASE DB01 SET MULTI_USER
GO

无法工作。我收到了“Msg 911,Level 16,State 4,Line 8 Database 'DB_SS_2017.SS' does not exist. Make sure that the name is entered correctly.”的消息。 - doenoe
@doenoe:在这种情况下,您的快照很可能不是来自您的“DB01”数据库,而是来自错误消息提到的另一个数据库.... - marc_s

0

需要一个更加“硬”的连接断开:):):)

USE master
GO
ALTER DATABASE DB01 SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO
ALTER DATABASE DB01 SET OFFLINE
GO
ALTER DATABASE DB01 SET ONLINE
GO
RESTORE DATABASE DB01 FROM DATABASE_SNAPSHOT = 'DB01_SS';
GO
ALTER DATABASE DB01 SET MULTI_USER
GO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接