将 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";

下一个问题,LogicalFileNameoriginal 数据库中的实际逻辑名称。但是,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上

将 TFS 数据库还原到新硬件后出错

尝试将 SQL Server 2012 Express 还原到 2014

sql 2005 sp3版本,做数据自动备份时总是出错

请问sqlserver数据库恢复怎么办,从一台机器上备份数据库传到另一台机器上 还原数据库总是出错,

MSSQL备份文件怎么还原到新数据库