Sql server 恢复具有不同名称的SQL Server数据库,但让服务器处理文件名

Sql server 恢复具有不同名称的SQL Server数据库,但让服务器处理文件名,sql-server,restore,Sql Server,Restore,我创建了SQL Server数据库的备份,如下所示: BACKUP DATABASE [foo] TO DISK = '\path\to\database.bak' 现在,我想在原始数据库foo仍然存在的情况下,将数据库恢复为同一SQL Server实例上的其他名称。这是我尝试使用的命令: RESTORE DATABASE [bar] FROM DISK = '\path\to\database.bak' 当我在SSMS中尝试此操作时,会收到一堆错误消息,告诉我foo.mdf和foo_log

我创建了SQL Server数据库的备份,如下所示:

BACKUP DATABASE [foo] TO DISK = '\path\to\database.bak'
现在,我想在原始数据库foo仍然存在的情况下,将数据库恢复为同一SQL Server实例上的其他名称。这是我尝试使用的命令:

RESTORE DATABASE [bar] FROM DISK = '\path\to\database.bak'
当我在SSMS中尝试此操作时,会收到一堆错误消息,告诉我foo.mdf和foo_log.ldf不能被覆盖,因为它们正被数据库foo使用。从我迄今为止在某地和其他地方读到的内容来看,要解决这个问题,我必须使用RESTORE命令的MOVE选项并指定一个文件系统路径!!!我很难接受这一点:我的意思是,SQL Server是一个数据库服务器,它迫使我处理低级文件系统细节以执行数据库还原

有没有办法让SQL Server根据要恢复到的数据库的名称自动计算出.mdf和.ldf文件的名称?也许我需要改变一下备份命令?或者我可以使用与备份数据库/恢复数据库不同的、更高级别的API

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


编辑:交互式解决方案不是选项,我需要以编程方式执行还原。

由于文件当前属于foo数据库,因此引发sql server错误,此行为是默认行为,因为通常dba备份数据库并在发生灾难或损坏时自行还原,但对于您来说,有两个选项,一个是在ManagementStudio中更改.mdf和.ldf文件的名称,而不需要将它们放在一个全新的路径中,而且Sql 2012通过一个新选项使它变得更容易,另一个方法是在脚本中设置新的文件名。 例如:

RESTORE DATABASE AdventureWorks FROM DISK = 'C:\AdventureWorks.BAK'
WITH MOVE 'AdventureWorks_Data' TO 'G:\SQLData\AdvnetureWorks_Data.mdf',
MOVE 'AdventureWorks_Log' TO 'H:\SQLData\AdvnetureWorks_Log.ldf'

由于这个问题似乎没有优雅的解决方案,我咬紧牙关,实现了一些似乎有效的东西——目前为止。虽然这不是我问题的真正答案,但我认为其他人可能会从以下想法中受益

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

创建临时数据库栏 使用SELECT*from sys.master_files从系统表中获取实际的逻辑和物理文件名,其中database_id=DB_id'bar' 删除临时数据库栏 使用RESTORE FILELISTONLY from DISK='\path\to\database.bak'从备份中获取备份逻辑和物理文件名 确保对于步骤4中获得的备份中的每个文件,我们在步骤2中获得了相应的真实逻辑/物理文件名 使用Restore database[bar]从磁盘='\path\to\database.bak'还原数据库。为备份中的每个文件添加一条MOVE语句,其中备份中的逻辑文件名映射到在步骤2中获得的实际物理文件名。 还原的数据库仍然具有备份中的错误逻辑名称,因此也可以使用ALTER database[bar]MODIFY FILE name='backup\U logical\u filename',newname='real\U logical\u filename'修复这些错误。对每个数据库文件重复此操作。 创建临时数据库以获取有关数据库文件的真实信息的方法步骤1-3允许将至少几件事情委托给DBMS:

根据DBA的服务器配置,文件系统位置正确,例如数据文件和事务日志的单独位置 数据库名称到文件名文件系统名称的映射,例如,如果数据库名称包含文件名中无效的字符,例如:字符 当匹配真实文件名和备份文件名时,例如在步骤5中,sys.master_文件和备份中的文件类型不同:

sys.master_文件中的文件类型为行和日志,如果您喜欢数字文件类型,则为0和1 备份中的文件类型为D和L
一种简单的方法是使用UI右键单击数据库,并使用bak文件恢复文件和文件组。选择bak和新数据库名称后,还可以从UI生成脚本。移动将在脚本中完成。如果您不想处理所谓的低级文件系统细节,只需停留在UI部分。@RaphaëlAlthaus我必须以编程方式从客户端应用程序进行恢复,因此我不能使用友好的SSMS UI。我知道有SMO API,但我不想这样做,因为它给了我一个新的依赖项。好吧,至少UI会给你一个用于通过文件移动恢复db的脚本示例,但我使用SMO。对不起,但是-1,因为你显然没有读我的问题。我正在寻找一个解决方案,我不必指定文件名!我在解释为什么你不能直接这么做