[英]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.