我创建了一个SQL Server数据库的备份,如下所示:
BACKUP DATABASE [foo] TO DISK = '\path\to\database.bak'
现在,我想将数据库还原到同一SQL Server实例上的其他名称,而原始数据库foo
仍然存在。这是我尝试使用的命令:
RESTORE DATABASE [bar] FROM DISK = '\path\to\database.bak'
当我在SSMS中尝试此操作时,我收到一堆错误消息,告诉我foo.mdf
和foo_log.ldf
无法覆盖,因为数据库foo
正在使用它们。从我到目前为止在SO和其他地方阅读的内容来解决此问题,我必须使用MOVE
命令的RESTORE
选项并指定文件系统路径!我很难接受:我的意思是,SQL Server是一个数据库服务器,它迫使我处理低级文件系统细节以执行数据库恢复?!
有没有办法告诉SQL Server根据我要恢复的数据库的名称自动找出.mdf和.ldf文件的名称?也许我需要改变一些关于备份命令的东西?或者我可以使用与“备份数据库”/“恢复数据库”不同的更高级API?
请注意,我的用例保证我正在恢复的数据库不存在。
编辑:交互式解决方案不是一种选择,我需要以编程方式执行恢复。
答案 0 :(得分:0)
由于似乎没有优雅的解决方案来解决这个问题,所以我咬紧牙关并实施了一些似乎有用的东西 - 现在。虽然这不是我的问题的真正答案,但我认为其他人可能会受益于以下想法。
以下是我的实现的大致概述(在SQL Server 2012上测试):
bar
SELECT * FROM sys.master_files WHERE database_id = DB_ID('bar')
bar
RESTORE FILELISTONLY FROM DISK = '\path\to\database.bak'
RESTORE DATABASE [bar] FROM DISK = '\path\to\database.bak'
还原数据库。为备份中的每个文件添加一个MOVE
语句,其中备份中的逻辑文件名映射到实际物理文件名(在步骤2中获取)。ALTER DATABASE [bar] MODIFY FILE (name = 'backup_logical_filename', newname = 'real_logical_filename')
进行修复。对每个数据库文件重复。创建临时数据库以获得" real"有关数据库文件的信息(步骤1-3)允许至少将一些内容委托给DBMS:
在匹配真实文件名和备份文件名时(例如,在步骤5中),sys.master_files
和备份中的文件类型不同:
sys.master_files
中的文件类型为" ROWS"和" LOG" (如果您更喜欢数字文件类型,则为0和1)答案 1 :(得分:-1)
引发sql server错误,因为文件当前属于foo
数据库,这种行为是默认的,因为通常dba备份数据库并自行恢复(如果发生灾难或损坏) ,但对你来说有两个选项,一个在管理工作室,只需更改.mdf
和.ldf
文件的名称(不需要将它们放在一个全新的路径中),还有{{1}使用新选项可以更轻松,另一种方法是在脚本中设置新文件名。
这是一个例子:
Sql 2012