2009-09-23 7 views
14

से डेटाबेस को पुनर्स्थापित कैसे करें मेरे पास एक SQL 2008 डीबी है। मैं एक ऐसा फॉर्म चला रहा हूं जो डीबी को पीछे रखता है, फिर इसे अपडेट करने का प्रयास करता है। यदि अपडेट विफल रहता है तो विचार उस बैकअप को पुनर्स्थापित करना है। यहां वह कोड है जिसका उपयोग मैं बैकअप को पुनर्स्थापित करने के लिए कर रहा हूं।सी #

public void RestoreDatabase(String databaseName, String backUpFile, String serverName, String userName, String password) 
{ 
    Restore sqlRestore = new Restore(); 
    BackupDeviceItem deviceItem = new BackupDeviceItem(backUpFile, DeviceType.File); 
    sqlRestore.Devices.Add(deviceItem); 
    sqlRestore.Database = databaseName; 
    ServerConnection connection = new ServerConnection(serverName, userName, password); 
    Server sqlServer = new Server(connection); 
    sqlRestore.Action = RestoreActionType.Database; 

    string logFile = System.IO.Path.GetDirectoryName(backUpFile); 
    logFile = System.IO.Path.Combine(logFile, databaseName + "_Log.ldf"); 

    string dataFile = System.IO.Path.GetDirectoryName(backUpFile); 
    dataFile = System.IO.Path.Combine(dataFile, databaseName + ".mdf"); 

    Database db = sqlServer.Databases[databaseName]; 
    RelocateFile rf = new RelocateFile(databaseName, dataFile); 
    sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName, dataFile)); 
    sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName + "_log", logFile)); 
    sqlRestore.SqlRestore(sqlServer); 
    db = sqlServer.Databases[databaseName]; 
    db.SetOnline(); 
    sqlServer.Refresh(); 
} 

ऐसा लगता है कि मेरे द्वारा चुने गए फ़ाइल नाम ऑनलाइन डीबी से अलग हैं। मैं मूल रूप से बैकअप के साथ सर्वर पर डेटाबेस को प्रतिस्थापित करना चाहता हूं। जब मैं एसक्लरस्टोर को कॉल करता हूं तो मुझे अपवाद मिलता है।

मुख्य अपवाद कहते

{ "पुनर्स्थापित सर्वर के लिए विफल 'स्थानीय होस्ट'।"}

भीतरी अपवाद में खुदाई इन त्रुटियों

एक अपवाद तिथि दिखाता को एक ट्रांजैक्ट-एसक्यूएल कथन या बैच निष्पादित करते समय।

और फिर

तार्किक फ़ाइल 'डीबी' डेटाबेस 'डीबी' का हिस्सा नहीं है। लॉजिकल फ़ाइल नामों को सूचीबद्ध करने के लिए RESTORE FILELISTONLY का उपयोग करें। \ R \ nRESTORE डेटाबेस असामान्य रूप से समाप्त हो रहा है।

मुझे लगता है कि मौजूदा डीबी को प्रतिस्थापित करने के लिए इसे बताने का कोई तरीका है।

मैं बैकअप को डंप करने के लिए निर्देशिका रखने के लिए डीबी के फ़ाइल पथ को प्राप्त करने के लिए कोड के इस बिट का उपयोग करता हूं। हो सकता है कि फ़ाइल नामों को फिर से बनाने के लिए इसका उपयोग किया जा सके।

public string GetDBFilePath(String databaseName, String userName, String password, String serverName) 
{ 
    ServerConnection connection = new ServerConnection(serverName, userName, password); 
    Server sqlServer = new Server(connection); 
    Database db = sqlServer.Databases[databaseName]; 
    return sqlServer.Databases[databaseName].PrimaryFilePath; 
} 

उत्तर

18

मैं अपने वापस ऊपर बदल गया है और इस तरह देखने के लिए कार्यों को बहाल:

public void BackupDatabase(SqlConnectionStringBuilder csb, string destinationPath) 
{ 
    ServerConnection connection = new ServerConnection(csb.DataSource, csb.UserID, csb.Password); 
    Server sqlServer = new Server(connection); 

    Backup bkpDatabase = new Backup(); 
    bkpDatabase.Action = BackupActionType.Database; 
    bkpDatabase.Database = csb.InitialCatalog; 
    BackupDeviceItem bkpDevice = new BackupDeviceItem(destinationPath, DeviceType.File); 
    bkpDatabase.Devices.Add(bkpDevice); 
    bkpDatabase.SqlBackup(sqlServer); 
    connection.Disconnect(); 

} 

public void RestoreDatabase(String databaseName, String backUpFile, String serverName, String userName, String password) 
{ 
    ServerConnection connection = new ServerConnection(serverName, userName, password); 
    Server sqlServer = new Server(connection); 
    Restore rstDatabase = new Restore(); 
    rstDatabase.Action = RestoreActionType.Database; 
    rstDatabase.Database = databaseName; 
    BackupDeviceItem bkpDevice = new BackupDeviceItem(backUpFile, DeviceType.File); 
    rstDatabase.Devices.Add(bkpDevice); 
    rstDatabase.ReplaceDatabase = true; 
    rstDatabase.SqlRestore(sqlServer); 
} 

इस तरह वे बस का उपयोग जो कुछ फ़ाइलें हैं। फाइलों को स्थानांतरित करने के लिए अब और निर्देश नहीं हैं।

+3

यदि आप उसी मशीन पर उसी डीबी के बैकअप से पुनर्स्थापित करते हैं तो आपको फ़ाइलों को स्थानांतरित करने की आवश्यकता नहीं है।बैकअप/पुनर्स्थापित के माध्यम से डेटाबेस को स्थानांतरित और कॉपी करते समय स्थानांतरित करने की आवश्यकता होती है। –

+3

ठीक है, यहां कुछ सुझाव दिए गए हैं: बैकअप फ़ाइल पथ के संबंध में हमेशा ध्यान दें यदि फ़ाइल आपके स्रोत फ़ोल्डर पर वास्तव में मौजूद है। स्थानांतरित करने के संबंध में, यह एमडीएफ फ़ाइल लिखने के लिए एक अनुमति मुद्दा हो सकता है। अगर आपके ऐप को .bak फ़ाइल पढ़ने की अनुमति है, तो ध्यान दें, इस मामले में SQL कॉन्फ़िगरेशन प्रबंधक की जांच करें: MSSQLServer सेवा स्थानीय सिस्टम उपयोगकर्ता के अंतर्गत चलाना आवश्यक है। –

4

आप डेटाबेस नाम के आधार पर RelocateFile विकल्प जोड़ रहे हैं, जो गलत है। आपको उन्हें प्रत्येक फ़ाइल स्थानांतरित करने के लिए तार्किक फ़ाइल नाम के आधार पर जोड़ना चाहिए। तार्किक फ़ाइल नामों की सूची पुनर्प्राप्त करने के लिए Restore.ReadFileList का उपयोग करें।

+0

ऐसा लगता है जैसे मैं इन विकल्पों को एक साथ जोड़ नहीं सकता हूं। –

12

धन्यवाद आपके उत्तर के लिए रीमस!

मैं

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.RelocateFiles.Add(new RelocateFile(databaseName, dataFileLocation)); 
sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName + "_log", logFileLocation)); 

इन दो पंक्तियों को संशोधित किया है और मेरे कोड सफलतापूर्वक चल रहा है।

समर्थन के लिए धन्यवाद!

+0

@ पल्लवी आपका समाधान सीधे मेरे लिए काम करता है .. लेकिन मैं समाधान को समझ नहीं पा रहा हूं, क्या आप कृपया अपने समाधान के उत्तर को संक्षिप्त करेंगे। –

+1

यह समाधान मेरे लिए भी सही था। अधिक चाहते हैं, जो स्थानीय रीस्टोरफ़ाइल धारण करता है वह स्रोत डेटाबेस "फ़ाइल सूची" है। उस डेटाबेस की फ़ाइल सूची जैसे सभी एमडीएफ, लॉग और इंडेक्स फाइलें बनाई गई थीं। लेकिन, इन पंक्तियों [एक्स] संख्याओं का मानना ​​है कि आपके पास केवल 1 एमडीएफ और 1 एलडीएफ (उदाहरण के लिए कोई अतिरिक्त लॉग या इंडेक्स फाइल नहीं) के साथ एक सामान्य डीबी है। यदि ऐसा है, पंक्तियों [0] में पहली एमडीएफ फ़ाइल है, पंक्तियां [1] लॉग फ़ाइल होगी। और पंक्तियां [0] [0] और पंक्तियां [1] [0] में तार्किक डेटाबेस नाम होगा (जो मामला संवेदनात्मक है!) जिसका उपयोग आप "स्थानांतरित" करने के लिए कर सकते हैं। – eduncan911