2012-02-22 7 views
3

SQL 2005 데이터베이스를 * .bak 파일로 백업해야합니다 (C# 사용). 그 파일에서 동일한 정확한 서버에 새로운 데이터베이스로 복원하려고합니다.SQL 데이터베이스 백업 및 복원

백업이 제대로 작동하고 내 C# 코드가 복원 방법을 호출하고 마침내 "시간 초과"될 때까지 작동하는 것처럼 보입니다. 나는 "innerExceptions"를 검사하고 RESTORE가이를 90 %로 만든 다음 예외를 반환한다는 것을 나타냅니다.

다음은 BACKUP 및 RESTORE에 사용하는 코드입니다.

누군가 내가 잘못 가고 있다는 것을 알려주실 수 있습니까? 내가 설정할 수있는 시간 초과 매개 변수 여야합니다. 그러나 그 매개 변수가 무엇인지 또는 수행하는 방법을 알지 못합니다.

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

+0

나는 타임 아웃 매개 변수를 추가하고 지금 시도했다. 저장 프로 시저가 성능면에서보다 효율적입니까? – dellbingham

답변

1

어떤 결과가 발생했는지 확인하기 위해 ServerConnection.StatementTimeout 값을 설정해 보았습니까?

MSDN 참조 here.

+0

지금 StatementTimeout 연결을 시도하고 있습니다. 그것은 약간의 시간이 걸립니다. 말하자면 ... Chris와 같은 저장 프로 시저가이 시나리오에서 더 나은 수행자를 언급하겠습니까? – dellbingham

+0

추측! 0으로 설정된 statementtimeout은 완벽하게 작동했습니다! – dellbingham

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

+0

@dellbingham 다른 방법으로 질문하겠습니다. SQL 명령을 추상화하여 C# 코드에서 무엇을 얻고 있습니까? 내가 일한/컨설팅 한 모든 상점에서 애플리케이션 코드는 T-SQL 및 DDL을 대체하지 않고 저장 프로 시저를 호출하는 도관 역할을했습니다. –

+0

@dellbingham 어떤 것이 더 잘 수행되는지 알아내는 가장 좋은 방법은 두 가지 방법을 모두 시도하는 것입니다. (완벽한 척도는 아니지만'System.Diagnostic.Stopwatch'는 멋진 도구입니다). 도움이된다면 +1하세요;) – Crisfole