将 SQL Server 备份还原到新数据库时出错
Posted
技术标签:
【中文标题】将 SQL Server 备份还原到新数据库时出错【英文标题】:Error restoring SQL Server backup to a new database 【发布时间】:2021-12-15 17:40:21 【问题描述】:我创建了一个名为 mydb
的 SQL Server 数据库的备份。我需要使用 C# 代码以编程方式恢复它。
还原必须创建一个名为 mydbnew
的新数据库。我正在使用 Microsoft.SqlServer.Management.Smo
库。
代码是这样的:
public void RestoreDatabase()
string databaseName = "mydbnew";
string userName = "user";
string password = "password";
string serverName = "(local)\\SQLEXPRESS";
string sourcePath = @"c:\temp\";
string fileName = $"mydbbackup.bak";
ServerConnection connection = new(serverName, userName, password);
Server sqlServer = new Server(connection);
BackupDeviceItem deviceItem = new(sourcePath + fileName, DeviceType.File);
Restore restore = new Restore();
restore.Database = databaseName;
restore.ReplaceDatabase = true;
restore.NoRecovery = false;
restore.Devices.Add(deviceItem);
RelocateFile dataFile = new RelocateFile();
dataFile.LogicalFileName = databaseName + "_data";
dataFile.PhysicalFileName = databaseName + ".mdf";
RelocateFile logFile = new RelocateFile();
logFile.LogicalFileName = databaseName + "_log";
logFile.PhysicalFileName = databaseName + ".ldf";
restore.RelocateFiles.Add(dataFile);
restore.RelocateFiles.Add(logFile);
restore.SqlRestore(sqlServer);
restore.Devices.Remove(deviceItem);
restore.SqlRestore(sqlServer)
出现错误:
逻辑文件“mydbnew_log”不是数据库“mydbnew”的一部分。使用 RESTORE FILELISTONLY 列出逻辑文件名。 RESTORE DATABASE 异常终止。
我的代码有什么问题?
【问题讨论】:
错误在这里告诉你问题。您告诉 SQL Server,您要恢复的数据库有一个名为mydbnew_log
的文件,但备份中不存在这样的文件。
目标数据库中日志文件的实际逻辑名称是什么mydbnew
@Larnu 好的,但我试图告诉 SqlServer 我需要使用新名称将备份中的 mdf 和 ldf 文件恢复到新数据库:“mydb.ldf => mydbnew.ldf”和“mydb.mdf => mydbnew.mdf”。如果我删除重定位尝试,结果是错误:“文件 'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\mydb.mdf' 不能被覆盖。它正在被数据库 'mydb '。”
然后使用需要使用MOVE
子句,@Tonyc。
【参考方案1】:
解决了。
我用这个版本更改了 Relocate 部分:
RelocateFile dataFile = new RelocateFile();
dataFile.LogicalFileName = "mydb";
dataFile.PhysicalFileName = Path.Combine(@"C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA", "mydbnew.mdf");
RelocateFile logFile = new RelocateFile();
logFile.LogicalFileName = "mydb_log";
logFile.PhysicalFileName = Path.Combine(@"C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA", "mydbnew.ldf");
当然,我必须努力动态获取路径和名称,但它确实有效。
【讨论】:
【参考方案2】:看起来是 2 个问题,第一个:
RelocateFile logFile = new RelocateFile();
dataFile.LogicalFileName = databaseName + "_log";
dataFile.PhysicalFileName = databaseName + ".ldf";
您正在创建一个名为 logFile
的对象,但在下一条语句中为旧变量设置值。
我希望你希望它是:
RelocateFile logFile = new RelocateFile();
logFile.LogicalFileName = databaseName + "_log";
logFile.PhysicalFileName = databaseName + ".ldf";
下一个问题,LogicalFileName
是 original 数据库中的实际逻辑名称。但是,PhysicalFileName
是 新 名称。
因此,例如,如果您的数据库是这样的,
,
那么代码是这样的:
RelocateFile dataFile = new RelocateFile();
dataFile.LogicalFileName = "Mine";
dataFile.PhysicalFileName = sourcePath + databaseName + ".mdf";
RelocateFile logFile = new RelocateFile();
logFile.LogicalFileName = "Mine_log";
logFile.PhysicalFileName = sourcePath + databaseName + ".ldf";
RelocateFile
使用旧(原始数据库)的逻辑名称,但在 PhysicalFileName
中提到的新位置创建文件
以上代码用新名称创建文件。
祝你好运。
【讨论】:
是的,代码中存在剪切和粘贴错误。非常感谢您提供完整的解决方案。以上是关于将 SQL Server 备份还原到新数据库时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何设置将SQL SERVER2012数据库备份还原到SQL SERVER2008上
尝试将 SQL Server 2012 Express 还原到 2014