2012-02-22 175 views
3

我需要將(使用C#)SQL 2005數據庫備份到* .bak文件。從那個文件中,我試圖在同一臺確切的服務器上恢復成一個新的數據庫。備份和還原SQL數據庫

備份工作正常,然後我的C#代碼調用恢復方法,它似乎一直工作,直到它最終「超時」。我檢查了「innerExceptions」,他們發現RESTORE使它達到90%,然後返回異常。

以下是我用於備份和還原的代碼。

有人能讓我知道我要去哪裏嗎?它必須是一個可以設置的超時參數,但我不知道它是什麼或如何去做。

public class JRBackupRestoreDB 
{ 
    public static void BackupDatabase(String databaseName, String userName, String password, String serverName, String destinationPath) 
    { 
     Backup sqlBackup = new Backup(); 

     sqlBackup.Action = BackupActionType.Database; 
     sqlBackup.BackupSetDescription = "ArchiveDataBase:" + DateTime.Now.ToShortDateString(); 
     sqlBackup.BackupSetName = "Archive"; 

     sqlBackup.Database = databaseName; 

     BackupDeviceItem deviceItem = new BackupDeviceItem(destinationPath, DeviceType.File); 
     ServerConnection connection = new ServerConnection(serverName, userName, password); 
     Server sqlServer = new Server(connection); 

     Database db = sqlServer.Databases[databaseName]; 

     sqlBackup.Initialize = true; 
     sqlBackup.Checksum = true; 
     sqlBackup.ContinueAfterError = true; 

     sqlBackup.Devices.Add(deviceItem); 
     sqlBackup.Incremental = false; 

     sqlBackup.ExpirationDate = DateTime.Now.AddDays(3); 
     sqlBackup.LogTruncation = BackupTruncateLogType.Truncate; 

     sqlBackup.FormatMedia = false; 

     sqlBackup.SqlBackup(sqlServer); 
    } 

    public static void RestoreDatabase(String databaseName, String filePath, 
    String serverName, String userName, String password, 
    String dataFilePath, String logFilePath) 
    { 
     Restore sqlRestore = new Restore(); 

     BackupDeviceItem deviceItem = new BackupDeviceItem(filePath, DeviceType.File); 
     sqlRestore.Devices.Add(deviceItem); 
     sqlRestore.Database = databaseName; 

     ServerConnection connection = new ServerConnection(serverName, userName, password); 
     Server sqlServer = new Server(connection); 

     Database db = sqlServer.Databases[databaseName]; 
     sqlRestore.Action = RestoreActionType.Database; 
     String dataFileLocation = dataFilePath + databaseName + ".mdf"; 
     String logFileLocation = logFilePath + databaseName + "_Log.ldf"; 
     db = sqlServer.Databases[databaseName]; 
     RelocateFile rf = new RelocateFile(databaseName, dataFileLocation); 

     System.Data.DataTable logicalRestoreFiles = sqlRestore.ReadFileList(sqlServer); 
     sqlRestore.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[0][0].ToString(), dataFileLocation)); 
     sqlRestore.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[1][0].ToString(), logFileLocation)); 

     sqlRestore.SqlRestore(sqlServer); 
     db = sqlServer.Databases[databaseName]; 
     db.SetOnline(); 
     sqlServer.Refresh(); 
    } 

} 
+0

如果你嘗試恢復到完全相同的服務器上的數據庫,你可以只創建一個存儲過程來此,傳遞MDF和ldf路徑。 – clamchoda 2012-02-22 21:46:48

+0

我已經嘗試添加一個超時參數並現在嘗試它。存儲過程的性能會更高效嗎? – dellbingham 2012-02-22 21:53:22

回答

1

你試過設置值與ServerConnection.StatementTimeout,看看會發生什麼?

MSDN reference here

+0

我正在嘗試StatementTimeout連接。這需要一些時間。說起來......在這種情況下,克里斯提到的存儲過程會不會更好? – dellbingham 2012-02-22 21:52:39

+0

猜測什麼! statementtimeout設置爲0完美工作! – dellbingham 2012-02-22 21:57:56

0

這是什麼,會是十分簡單的純SQL做...

你有沒有考慮嘗試這種方式?你只需要編寫sql腳本或過程來執行它,然後運行它。這是我們做什麼(對於不同的情況,但類似):

backup database {{DATABASE NAME HERE}} 
to disk = N'{{FILE_NAME_HERE}}' 
    with 
     name = N'{{BACKUP_DATABASE_NAME_HERE}}' 
GO 

restore database {{NEW_DATABASE_NAME}} 
from disk = N'{{FILE_NAME_HERE}}' 
    with 
     file = 1 
go 
+0

也非常有幫助。因爲我使用C類工作,所以在調用存儲過程時性能會更好嗎? – dellbingham 2012-02-22 21:59:26

+0

@dellbingham我會以另一種方式提出問題 - 通過在C#代碼中抽象SQL命令獲得什麼?在我工作/諮詢過的每家商店中,應用程序代碼都是調用存儲過程的渠道,而不是T-SQL和DDL的替代品。 – 2012-02-23 00:21:33

+0

@dellbingham找出哪個更好的方法是嘗試兩種方法。 (不是一個完美的測量,但'System.Diagnostic.Stopwatch'是一個很棒的工具)。如果它有幫助+1它;) – Crisfole 2012-02-23 03:24:51