症状
当使用 Microsoft SQL Server 2012 中的 WITH REPLACE 从备份还原数据库时,来自备份数据库的已还原数据库的物理文件名可能会覆盖现有数据库的物理文件名称。例如,请考虑以下方案:
-
您有两个 SQL Server 实例: InstanceA 和 InstanceB。
-
你的数据库在 SQL Server 的每个实例上都具有相同的名称 SQLDB。
-
在 InstanceA 上,SQLDB 数据库数据文件名为 DB1_InstanceA .mdf,日志文件名是 DB1_InstanceA .ldf。
-
在 InstanceB 上,SQLDB 数据库数据文件名为 DB1_InstanceB .mdf,日志文件名是 DB1_InstanceB .ldf。
-
通过使用restore命令的WITH REPLACE选项,尝试从 InstanceB 中的 SQLDB 数据库还原 SQLDB 数据库的备份。
在此方案中,InstanceB 上的 SQLDB 上的物理文件名更改为 DB1_InstanceA .mdf 和 DB1_InstanceA .ldf。
原因
此行为是 SQL Server 2012 中的设计导致的。
解决方法
要解决此问题,请不要使用RESTORE命令的WITH REPLACE选项。 请改为使用 " 与移动 " 选项。注意 " 使用移动 " 选项可提供更改物理文件名的选项。
更多信息
只有第一次使用 "还原" 命令时,"使用移动" 选项才是必需的。 当您尝试从备份还原数据库时,SQL Server 会比较数据库的恢复分叉值。 然后,备份集将采取以下操作,具体取决于这些值是否匹配:
-
如果存在匹配项,备份集将继续使用目标数据库的文件名。
-
如果值不同,备份集将使用备份集中的名称替换目标数据库的物理文件名。
将WITH MOVE选项与RESTORE命令结合使用时,将执行下列操作:
-
将在目标服务器上创建新的恢复派生。
-
在下一个还原操作中,备份集的恢复派生 Id 将与目标服务器的 Id 相匹配。
-
与WITH REPLACE选项一起使用的RESTORE命令将在目标服务器上保留物理名称。
有关 还原 命令的详细信息,请参阅 还原(transact-sql)