数据库恢复因移动而失败

问题描述 投票:0回答:8

我正在尝试恢复数据库备份但出现错误:

服务器“ASIF-VAIO”恢复失败。 (微软.SqlServer.SmoExtended)

其他信息:

System.Data.SqlClient.SqlError:文件'C:\ Program Files \ Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\uwa.mdf' 的声明者 “Aston_Fresh_log”(2) 和“Aston_Fresh”(1)。 WITH MOVE 子句可以是 用于重新定位一个或多个文件。 (微软.SqlServer.Smo)

sql sql-server sql-server-2008
8个回答
28
投票

恢复时,需要务必

  • 选择一个尚不存在的新数据库名称(除非您想覆盖先前存在的数据库)

enter image description here

  • 您在
    Overwrite
    选项卡页中勾选
    Options
    选项,并为 .mdf
    .ldf
    文件定义
    valid
    和新文件名,这样您就不会意外覆盖系统上的另一个数据库:

enter image description here


7
投票

这篇文章有一些很好的答案,但我不相信这里涵盖了我的解决方案,或者我不理解答案/评论。

但是,当我遇到此错误时,我正在恢复具有 2 个索引(主索引和索引)的数据库。问题是,恢复时它创建了两个 .ndf 文件,每个索引一个,但将它们命名为相同的文件。

所以本质上我有两个“恢复为”文件恢复到“D:\MSSQLDATA\DatabaseName.ndf”。

为了克服这个问题,我必须更改其中一个文件名,例如我更改了

 Index      |    D:\MSSQLDATA\DatabaseName.ndf
 Primary    |    D:\MSSQLDATA\DatabaseName1.ndf

具有唯一的文件名为我解决了这个问题。


3
投票

这对我有用:为脚本部分中的每个 MDF 和 LDF 文件指定不同的名称。

MOVE N'R_Data' 
  TO N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Build51_Testing_db1.mdf',

MOVE N'R_audit' 
  TO N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Build51_Testing_db2.mdf', 

等等...

最初由阿尔贝托·莫里洛建议


2
投票

我知道距离上次回答已经很久了,但我碰巧在谷歌中搜索了这个问题的解决方案。 对我来说,编写恢复脚本(更改文件名不起作用)并手动更改代码中的文件名

RESTORE DATABASE [DB_NAME] 
FILE = N'[name]',  
FILE = N'[name1]',
FILE = N'[name2]' 
FROM  DISK = N'[file_path]' 
WITH  FILE = 1m
MOVE N'[name]' TO N'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Data\\[name].mdf',
MOVE N'[name1]' TO N'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Data\\[name1].mdf',
MOVE N'[name2]' TO N'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Data\\[name2].mdf',
MOVE N'[logname]' TO N'D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Data\\[logname].ldf'
NOUNLOAD,
REPLACE,
STATS = 10
GO

问候


1
投票

就我而言,数据库有 2 个 mdf 文件。错误出现了,因为我试图将两个 mdf 文件恢复为相同的名称。

只需在“恢复为”下重命名第二个 mdf 文件即可。

enter image description here


0
投票

如果您遇到此问题且不是上述问题,请尝试在“还原选项”>“文件”下,选中“将所有文件重新定位到文件夹”复选框。

enter image description here


0
投票

就我而言,我的

.mdf
文件夹中已经有
.ldf
\DATA
文件,所以我必须创建两个新文件:

New-Item C:\path\to\sql\DATA\NewDatabase.mdf
New-Item C:\path\to\sql\DATA\NewDatabase_log.ldf

然后在SQL管理器中,您需要在恢复数据库时选择这些新文件。


0
投票

如果无法通过 SSMS 对话框进行冲突文件路径的恢复,则可能必须通过 T-SQL 执行以下操作:

1.识别备份中的逻辑文件名

RESTORE FILELISTONLY 
FROM DISK = 'C:\backupfile.bak';

这将列出备份中包含的文件及其属性,例如它们的逻辑名称和备份的物理路径。

2.使用新的物理文件位置进行恢复

对于步骤 1 中列出的每个逻辑文件,使用

MOVE
选项手动指定目标文件位置:

RESTORE DATABASE mydatabase
FROM DISK = 'C:\backupfile.bak'
WITH
    MOVE 'LogicalDataFileName' TO 'C:\Program Files\Microsoft SQL Server\MSSQL\MSSQL16.MSSQLSERVER\MSSQL\DATA\LogicalDataFileName.mdf',
    MOVE 'LogicalLogFileName' TO 'C:\Program Files\Microsoft SQL Server\MSSQL\MSSQL16.MSSQLSERVER\MSSQL\DATA\LogicalDataFileName.ldf'

确保这些新目标位置均不相同,并且步骤 1 中列出的所有文件均使用

MOVE
选项指定。

注意:此示例假设 SQL Server 实例安装在

C:\Program Files\Microsoft SQL Server\MSSQL\MSSQL16.MSSQLSERVER
(对于 SQL Server 2022,为 MSSQL16)。这些需要根据实际的SQL Server环境进行更改。

© www.soinside.com 2019 - 2024. All rights reserved.