簡體   English   中英

將 SQL Server 備份還原到新數據庫時出錯

[英]Error restoring SQL Server backup to a new database

我創建了一個名為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 異常終止。

我的代碼有什么問題?

解決了。 我用這個版本更改了 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個問題,第一個:

    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原始數據庫中的實際邏輯名稱。 但是, 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提到的新位置創建文件

上面的代碼使用新名稱創建文件。

祝你好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM