2013-01-17 38 views
12

मैं एक नए डेटाबेस में .bak को पुनर्स्थापित करने के लिए SQL सर्वर SMO का उपयोग करता हूं, लेकिन काम करने में विफल रहा।smo डेटाबेस को पुनर्स्थापित करें

एसक्यूएल सर्वर 2012 और एसएमओ वस्तु संस्करण नवीनतम एसडीके संस्करण 11.0

फ़ाइल .bak एसक्यूएल प्रबंधन स्टूडियो 2012, एक ही स्थानीय पीसी, साथ ही का उपयोग कर एक ही कोडिंग पीसी पर बनाए जाने के बाद है।

त्रुटि संदेश मैं मिलता है:

सर्वर 'सर्वर' के लिए पुनर्स्थापना विफल हुई।

मेरे कोड में क्या गलत है?

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); 

UPDATED: मैं एसएमओ समाधान surrended, और करने की कोशिश की सभी

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. 

धन्यवाद।

+0

क्या कोई आंतरिक अपवाद है? कृपया डीबग में जांचें, जो शायद आपको वास्तविक कारण देगा। – Bridge

+0

इसके अलावा, क्या आप वाकई उन फ़ाइलों को ओवरराइट करने का प्रयास नहीं कर रहे हैं जो पहले से मौजूद हैं? यदि आप एक ही 'dbName' का उपयोग करते हैं, तो आपके पास एक ही नाम के साथ डेटा और लॉग फ़ाइल हो सकती है - यह देखने के लिए जांचें कि फ़ाइल पहले मौजूद है या नहीं, और यदि ऐसा होता है, तो इसे फिर से बनाने का प्रयास न करें। – Bridge

+0

बैकअप डिवाइस 'd: \ template.BAK' नहीं खोल सकता है। ऑपरेटिंग सिस्टम त्रुटि 123 (फ़ाइल नाम, निर्देशिका नाम, या वॉल्यूम लेबल वाक्यविन्यास गलत है।)। >> .bak एसक्यूएल प्रबंधन स्टूडियो 2012 द्वारा बनाया गया था और एसएमओ सही संस्करण (संस्करण 11) है। –

उत्तर

21

मैंने डेटाबेस को पुनर्स्थापित करने के लिए सफलतापूर्वक SMO का उपयोग किया। मैं अपना कोड साझा करूंगा। आशा करता हूँ की ये काम करेगा। हालांकि इस समाधान में एक चेतावनी है, यह मानता है कि आपके पास केवल एक प्राथमिक डेटा फ़ाइल है। लॉग और डेटा फ़ाइलों से मेल खाने के लिए वास्तव में मुश्किल है और कई तरीकों से कुछ गलत हो सकता है। वैसे भी कोशिश करें और मुझे यह बताएं कि इससे मदद मिलती है।

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

इस कोड ने वास्तव में कुछ संशोधनों के साथ मेरी मदद की। मुझे एक डीबी को एक अलग स्थान पर बहाल करने की आवश्यकता थी और 'RelocateFiles' सामान, जटिल है, जैसा कि यह है, अच्छी तरह से काम किया। – Jez

+0

हाय, डेटाबेस पुनर्स्थापन ऑपरेशन में स्थानांतरित फ़ाइलों का उद्देश्य क्या है? –

+0

@RustyWizard कभी-कभी डेटाबेस फ़ाइलों को डिफ़ॉल्ट स्थान में मौजूद नहीं होते हैं। उस स्थिति में हमें फ़ाइल को ढूंढने और पुनर्स्थापित आदेश में इसका उपयोग करने की आवश्यकता है ताकि पुनर्स्थापित करते समय कोई त्रुटि न हो। –