使用不同的名称还原SQL Server数据库,但让服务器处理文件名

时间:2014-04-16 15:14:47

标签: sql-server restore

我创建了一个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.mdffoo_log.ldf无法覆盖,因为数据库foo正在使用它们。从我到目前为止在SO和其他地方阅读的内容来解决此问题,我必须使用MOVE命令的RESTORE选项并指定文件系统路径!我很难接受:我的意思是,SQL Server是一个数据库服务器,它迫使我处理低级文件系统细节以执行数据库恢复?!

有没有办法告诉SQL Server根据我要恢复的数据库的名称自动找出.mdf和.ldf文件的名称?也许我需要改变一些关于备份命令的东西?或者我可以使用与“备份数据库”/“恢复数据库”不同的更高级API?

请注意,我的用例保证我正在恢复的数据库不存在。

编辑:交互式解决方案不是一种选择,我需要以编程方式执行恢复。

2 个答案:

答案 0 :(得分:0)

由于似乎没有优雅的解决方案来解决这个问题,所以我咬紧牙关并实施了一些似乎有用的东西 - 现在。虽然这不是我的问题的真正答案,但我认为其他人可能会受益于以下想法。


以下是我的实现的大致概述(在SQL Server 2012上测试):

  1. 创建临时数据库bar
  2. 使用SELECT * FROM sys.master_files WHERE database_id = DB_ID('bar')
  3. 从系统表中获取真实的逻辑和物理文件名
  4. 删除临时数据库bar
  5. 使用RESTORE FILELISTONLY FROM DISK = '\path\to\database.bak'
  6. 从备份中获取备份逻辑和物理文件名
  7. 确保对于备份中的每个文件(在步骤4中获得),我们具有相应的实际逻辑/物理文件名(在步骤2中获得)
  8. 使用RESTORE DATABASE [bar] FROM DISK = '\path\to\database.bak'还原数据库。为备份中的每个文件添加一个MOVE语句,其中备份中的逻辑文件名映射到实际物理文件名(在步骤2中获取)。
  9. 已恢复的数据库仍有来自备份的错误逻辑名称,因此请使用ALTER DATABASE [bar] MODIFY FILE (name = 'backup_logical_filename', newname = 'real_logical_filename')进行修复。对每个数据库文件重复。

  10. 创建临时数据库以获得" real"有关数据库文件的信息(步骤1-3)允许至少将一些内容委托给DBMS:

    • 根据DBA的服务器配置(例如,数据文件和事务日志的单独位置),文件系统位置是正确的。
    • 将数据库名称映射到文件名文件系统名称(例如,如果数据库名称包含在文件名中无效的字符,例如":"字符)

    在匹配真实文件名和备份文件名时(例如,在步骤5中),sys.master_files和备份中的文件类型不同:

    • sys.master_files中的文件类型为" ROWS"和" LOG" (如果您更喜欢数字文件类型,则为0和1)
    • 备份中的文件类型为" D"和" L"

答案 1 :(得分:-1)

引发sql server错误,因为文件当前属于foo数据库,这种行为是默认的,因为通常dba备份数据库并自行恢复(如果发生灾难或损坏) ,但对你来说有两个选项,一个在管理工作室,只需更改.mdf.ldf文件的名称(不需要将它们放在一个全新的路径中),还有{{1}使用新选项可以更轻松,另一种方法是在脚本中设置新文件名。 这是一个例子:

Sql 2012