2014-06-05 2 views
0

제 질문은 기본적으로 제목에 명시되어 있습니다 만, 아쉽게도 확장하려고합니다. 데이터베이스를 백업 한 다음 해당 데이터베이스를 동일한 서버에있는 다른 데이터베이스로 복원하려고합니다. 지금은 테스트 목적으로 같은 서버에 보관하고 있지만 새 서버로 복원해야 할 수도 있습니다.SMO 복원이 항상 작동하지 않는 경우

코드는 작동하지만 오류는 없습니다. 그러나 한 번 실행하면 복원 된 데이터베이스가 업데이트된다는 보장이 없습니다. 만약 내가 그것을 실행하면 5 번 말할 수 있습니다, 그것은 가장 가능성이 데이터베이스를 업데이 트됩니다.

왜 지금 업데이트되지 않는지 궁금합니다.

using Microsoft.SqlServer.Management.Common; 
using Microsoft.SqlServer.Management.Smo; 
using System; 

// This program is used to perform a full database backup. The code also includes a SMO  restore as well 

namespace BackupDB 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Connecting to the server 
      ServerConnection serverConn = new ServerConnection(@"T520-R9K0H1K\SQLEXPRESS"); 
      Server server = new Server(serverConn); 

      backup(serverConn, server); 
      restore(serverConn, server); 

      Console.WriteLine("Closing Application"); 
      Environment.Exit(0); 

     } // Main 

     public static void backup(ServerConnection serverConn, Server server) 
     { 

      if (!serverConn.IsOpen) 
      { 
       serverConn.Connect(); 
      } 

      Backup bkpDBFull = new Backup(); 
      bkpDBFull.Action = BackupActionType.Database; 
      bkpDBFull.Database = "databaseTest"; 
      BackupDeviceItem bkpDevice = new BackupDeviceItem(@"C:\BakFiles\test.bak", DeviceType.File); 
      bkpDBFull.Devices.Add(bkpDevice); 
      bkpDBFull.BackupSetName = "databaseTest Backup"; 
      bkpDBFull.BackupSetDescription = " databaseTest - Full Backup"; 
      bkpDBFull.NoRecovery = false; 

      bkpDBFull.Initialize = true; 

      try 
      { 
       bkpDBFull.SqlBackupAsync(server); 
       Console.WriteLine("Backup Complete"); 
      } 

      catch (Exception ex) 
      { 
       Console.Write(ex.Message); 
       Console.Write(ex.Source); 
      } 

      finally{ serverConn.Disconnect(); } 
     } // Backup 

     public static void restore(ServerConnection serverConn, Server server) 
     { 
      if (!serverConn.IsOpen) 
      { 
       serverConn.Connect(); 
      } 

      Restore destination = new Restore(); 
      destination.Action = RestoreActionType.Database; 
      destination.ReplaceDatabase = true; 
      destination.Database = "RestoreDB"; 
      BackupDeviceItem source = new BackupDeviceItem(@"C:\BakFiles\test.bak", DeviceType.File); 
      destination.Devices.Add(source); 
      destination.NoRecovery = false; 
      destination.RelocateFiles.Add(new RelocateFile("databaseTest", @"C:\Restored\test.mdf")); 
      destination.RelocateFiles.Add(new RelocateFile("databaseTest_Log", @"C:\Restored\test_log.ldf")); 

      try 
      { 
       destination.SqlRestoreAsync(server); 
       Console.WriteLine("Restore Complete"); 
      } 

      catch (Exception ex) 
      { 
       Console.Write(ex.Message); 
       Console.Write(ex.Source); 
      } 

      finally{ serverConn.Disconnect(); } 
     } // Restore 
    } // Class 
} // Namespace 

답변

2

문제는 SqlRestoreAsync(Server)입니다. SqlRestoreAsync(Server)은 비 차단 이고, Restore 클래스의 이벤트를 수신하여 복원이 완료되었음을 알립니다. 따라서 어떤 오류가 발생했는지 알 수는 없습니다 (복원 과정 중에 serverConn.Disconnect()로 전화하면 도움이되지 않을 수도 있음).

어느 쪽이든 당신이 오류의 상태를 알아 내기 위해 CompleteInformation에 이벤트 리스너를 연결을 닫고하지 않아도 SqlRestore(Server)SqlRestoreAsync(Server)은 그래서 복원이 완료까지 코드의 줄에 중단하거나 코드를 다시 작성합니다 교체 또는 성공.


P. 동일한 이유로 SqlBackupAsyncSqlBackup으로 대체해야하며 백업 실패 여부를 알 수 없으며 백업 처리가 언제 완료되는지 알 수 없습니다. 나는 돈을 벌 것입니다. 무슨 일이 일어나고 있는지 당신이 백업을 시작한 다음 백업이 실행되는 동안 복원을 시도하고 실패합니다. 그런 다음 2 차 시도를하면 백업과 복원이 모두 실패합니다 (파일은 여전히 ​​백업에 사용 중입니다). 그런 다음 마침내 운이 좋게되고 6 또는 7 번의 실행이 끝나면 백업을 복원 한 다음 데이터베이스를 복원하기 시작합니다.

+0

정말 고마워요! 이 솔루션은 완벽하게 작동합니다! –

관련 문제