2013-01-17 18 views
12

Uso SQL Server SMO per ripristinare un .bak in un nuovo database, ma non è riuscito a funzionare.database di ripristino smo

di SQL Server è la versione 2012 e SMO oggetto è da l'ultima versione dell'SDK 11.0

.bak è stata creata usando SQL Management Studio 2012, lo stesso pc locale, sullo stesso pc codifica pure.

Il messaggio di errore che ottengo è:

ripristino non riuscito per Server 'SERVER'.

Cosa c'è di sbagliato nel mio codice?

string dbPath = Path.Combine(@"d:\my data", dbName + "_db" + ".mdf"); 
string logPath = Path.Combine(@"d:\my data", dbName + "_db" + "_Log.ldf"); 

Restore restore = new Restore(); 

BackupDeviceItem deviceItem = new BackupDeviceItem("d:\template.BAK", DeviceType.File); 
restore.Devices.Add(deviceItem); 
restore.Database = dbName + "_db"; 

RelocateFile relocateDataFile = new RelocateFile("Data", dbPath); 
RelocateFile relocateLogFile = new RelocateFile("Log", logPath); 

restore.RelocateFiles.Add(relocateDataFile); 
restore.RelocateFiles.Add(relocateLogFile); 

restore.Action = RestoreActionType.Database; 
restore.ReplaceDatabase = true; 
restore.SqlRestore(server); 

AGGIORNAMENTO: I arrese soluzioni SMO, e ha cercato

using (SqlConnection connection = new SqlConnection("Data Source=server;user id=sa;password=xxxxx;")) 
     { 

      using (SqlCommand command = new SqlCommand(@"RESTORE DATABASE beauty01 FROM DISK = 'd:\template.bak' WITH RECOVERY, MOVE 'beauty1' TO 'D:\MyData\beauty01_Data.mdf', MOVE 'beauty1_log' TO 'd:\Mydata\beauty01_Log.ldf', REPLACE", connection)) 
      { 
       connection.Open(); 
       // Add the parameters for the SelectCommand. 


       command.CommandType = CommandType.Text; 
       command.ExecuteNonQuery(); 
      } 

     } >> work good. 

Grazie a tutti.

+0

Esiste un'eccezione interna? Per favore controlla il debug, che probabilmente ti darà la vera ragione. – Bridge

+0

Inoltre, sei sicuro di non voler sovrascrivere i file già esistenti? Se usi lo stesso 'dbName', potresti avere dati e file di log con lo stesso nome - prova a controllare se il file esiste prima, e se lo fa, non provare a crearlo di nuovo. – Bridge

+0

Impossibile aprire il dispositivo di backup 'd: \ template.BAK'. Errore di sistema operativo 123 (il nome del file, il nome della directory o la sintassi dell'etichetta del volume non sono corretti). >> il .bak è stato creato da sql management studio 2012 e smo è la versione corretta (versione 11). –

risposta

21

Ho utilizzato con successo SMO per ripristinare il database. Condividerò il mio codice. Spero che sia d'aiuto. Tuttavia, questa soluzione ha un avvertimento, ritiene che tu abbia un solo file di dati primario. Riuscire a far combaciare il registro e i file di dati è davvero complicato e qualcosa può andare storto in molti modi. Ad ogni modo prova e fammi sapere questo aiuta.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.IO; 
using System.Text; 
using System.Threading; 
using Microsoft.SqlServer.Management.Common; 
using Microsoft.SqlServer.Management.Smo; 
using Microsoft.Win32; 

namespace DatabaseUtility 
{ 
    public class BackupRestore 
    { 
     static Server srv; 
     static ServerConnection conn; 

     public static void BackupDatabase(string serverName, string databaseName, string filePath) 
     { 
      conn = new ServerConnection(); 
      conn.ServerInstance = serverName; 
      srv = new Server(conn); 

      try 
      { 
       Backup bkp = new Backup(); 

       bkp.Action = BackupActionType.Database; 
       bkp.Database = databaseName; 

       bkp.Devices.AddDevice(filePath, DeviceType.File); 
       bkp.Incremental = false; 

       bkp.SqlBackup(srv); 

       conn.Disconnect(); 
       conn = null; 
       srv = null; 
      } 

      catch (SmoException ex) 
      { 
       throw new SmoException(ex.Message, ex.InnerException); 
      } 
      catch (IOException ex) 
      { 
       throw new IOException(ex.Message, ex.InnerException); 
      } 
     } 

     public static void RestoreDatabase(string serverName, string databaseName, string filePath) 
     { 

      conn = new ServerConnection(); 
      conn.ServerInstance = serverName; 
      srv = new Server(conn); 

      try 
      { 
       Restore res = new Restore(); 

       res.Devices.AddDevice(filePath, DeviceType.File); 

       RelocateFile DataFile = new RelocateFile(); 
       string MDF = res.ReadFileList(srv).Rows[0][1].ToString(); 
       DataFile.LogicalFileName = res.ReadFileList(srv).Rows[0][0].ToString(); 
       DataFile.PhysicalFileName = srv.Databases[databaseName].FileGroups[0].Files[0].FileName; 

       RelocateFile LogFile = new RelocateFile(); 
       string LDF = res.ReadFileList(srv).Rows[1][1].ToString(); 
       LogFile.LogicalFileName = res.ReadFileList(srv).Rows[1][0].ToString(); 
       LogFile.PhysicalFileName = srv.Databases[databaseName].LogFiles[0].FileName; 

       res.RelocateFiles.Add(DataFile); 
       res.RelocateFiles.Add(LogFile); 

       res.Database = databaseName; 
       res.NoRecovery = false; 
       res.ReplaceDatabase = true; 
       res.SqlRestore(srv); 
       conn.Disconnect(); 
      } 
      catch (SmoException ex) 
      { 
       throw new SmoException(ex.Message, ex.InnerException); 
      } 
      catch (IOException ex) 
      { 
       throw new IOException(ex.Message, ex.InnerException); 
      } 
     } 

     public static Server Getdatabases(string serverName) 
     { 
      conn = new ServerConnection(); 
      conn.ServerInstance = serverName; 

      srv = new Server(conn); 
      conn.Disconnect(); 
      return srv; 

     } 
    } 
} 
+0

Questo codice mi ha davvero aiutato, con alcune modifiche. Avevo bisogno di ripristinare un DB in una posizione diversa e quella roba di "RelocateFiles", per quanto complessa, funzionava bene. – Jez

+0

Salve, qual è lo scopo del riposizionamento dei file nell'operazione di ripristino del database? –

+0

@RustyWizard A volte i file del database non sono presenti nella posizione predefinita. In tal caso, dobbiamo trovare il file e usarlo nel comando restore in modo che non ci siano errori durante il ripristino. –

Problemi correlati