2010-11-18 7 views
14

मैं इस तरह डेटाबेस बहाल करने की कोशिश:कैसे सी # कोड के माध्यम से SQL सर्वर डेटाबेस को बहाल करने के

SQL = @"RESTORE DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'"; 
       Cmd = new SqlCommand(SQL, Conn); 
       Cmd.ExecuteNonQuery(); 
       Cmd.Dispose(); 

लेकिन मैं हमेशा मिलता त्रुटि:

Msg 3102, Level 16, State 1, Line 7
RESTORE cannot process database 'MyDataBase ' because it is in use by this session. It is recommended that the master database be used when performing this operation.
Msg 3013, Level 16, State 1, Line 7
RESTORE DATABASE is terminating abnormally.

उत्तर

1

आप एक के माध्यम से डेटाबेस सर्वर से कनेक्ट करना होगा अलग डेटाबेस

तो आपकी कनेक्शन स्ट्रिंग आपको सर्वर पर "मास्टर" या अन्य डेटाबेस कहने के लिए लेनी चाहिए, फिर आप कार्य को हाथ में पूरा कर सकते हैं।

1

आपकी कनेक्शन स्ट्रिंग में master डेटाबेस से कनेक्ट होने के लिए डिफ़ॉल्ट कैटलॉग होना चाहिए।

12

आपका डीबी कनेक्शन उस डेटाबेस की सबसे अधिक संभावना है जिसे आप पुनर्स्थापित करने का प्रयास कर रहे हैं। तो वहाँ है एक डीबी ताला जो अपने डाटाबेस के बहाल होने से बचाता है साझा

इस

SQL = @"USE master BACKUP DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'"; 

प्रयास करें या मास्टर डीबी

+0

क्षमा करें !!! मैं बहाल करने की आवश्यकता मैं कोशिश यह: डिस्क से डेटाबेस MyDataBase पुनर्स्थापित = 'घ: \ MyDataBase.BAK' और इस त्रुटि – Gold

+0

मिला मैं इस प्रयास करें: उपयोग मास्टर पुनर्स्थापित MyDataBase करने के लिए डिस्क = 'घ: \ MyDATA.BAK लेकिन अभी भी यह त्रुटि प्राप्त करें: संदेश 3159, स्तर 16, राज्य 1, रेखा 7 डेटाबेस "MyDataBase" के लिए लॉग की पूंछ का बैक अप नहीं लिया गया है। लॉग इन बैकअप के लिए NORECOVERY के साथ बैकअप लॉग का उपयोग करें यदि इसमें वह कार्य शामिल है जिसे आप खोना नहीं चाहते हैं। लॉग की सामग्री को ओवरराइट करने के लिए RESTORE कथन के STOPLACE या STOPAT खंड के साथ उपयोग करें। संदेश 3013, स्तर 16, राज्य 1, रेखा 7 पुन: स्थापित डेटा असामान्य रूप से समाप्त हो रहा है। – Gold

14

उपयोग करने के लिए मैं एक बैकअप बहाल करने के लिए एसएमओ का उपयोग करना पसंद कनेक्शन विवरण बदलने:

Microsoft.SqlServer.Management.Smo.Server smoServer = 
    new Server(new ServerConnection(server)); 

Database db = smoServer.Databases['MyDataBase']; 
string dbPath = Path.Combine(db.PrimaryFilePath, 'MyDataBase.mdf'); 
string logPath = Path.Combine(db.PrimaryFilePath, 'MyDataBase_Log.ldf'); 
Restore restore = new Restore(); 
BackupDeviceItem deviceItem = 
    new BackupDeviceItem('d:\MyDATA.BAK', DeviceType.File); 
restore.Devices.Add(deviceItem); 
restore.Database = backupDatabaseTo; 
restore.FileNumber = restoreFileNumber; 
restore.Action = RestoreActionType.Database; 
restore.ReplaceDatabase = true; 
restore.SqlRestore(smoServer); 

db = smoServer.Databases['MyDataBase']; 
db.SetOnline(); 
smoServer.Refresh(); 
db.Refresh(); 

आप Microsoft.SqlServer.Smo, Microsoft.SqlServer.SmoExtended, और Microsoft.SqlServer.Management.Sdk.Sfc

के लिए संदर्भ की आवश्यकता होगी
+2

मेरी मशीन पर इन पुस्तकालयों तक पहुंचने के लिए आवश्यक डीएलएल सी: \ प्रोग्राम फ़ाइलें (x86) \ Microsoft SQL Server \ 110 \ SDK \ Assemblies में थे (क्योंकि मेरे पास SQL ​​सर्वर प्रबंधन 2008 R2 के हिस्से के रूप में स्थापित SQL सर्वर प्रबंधन स्टूडियो है) और मुझे इस फ़ोल्डर में ब्राउज़ करने और जोड़ने की आवश्यकता है: Microsoft.SqlServer.ConnectionInfo.dll, Microsoft.SqlServer.Management.Sdk.Sfc.dll, Microsoft.SqlServer.Smo.dll, Microsoft.SqlServer.SmoExtended.dll। –

+1

डीबीपाथ और लॉगपैथ लाइनें क्यों? वे जरूरी नहीं लगते हैं। आप पुनर्स्थापना का उपयोग करके इसे थोड़ा और संक्षिप्त बना सकते हैं। डिवाइसेस.एडडिवाइस (और नए बैकअप डेविस इटैम –

+0

@ChrisMoschini में उपयोग किए गए तर्कों को पारित करते हुए मुझे विश्वास है कि उनका ऐसा कुछ मतलब है: RelocateFile relocateDataFile = new RelocateFile (restore.ReadFileList (smoServer)। पंक्तियां [0] [0]। टॉस्ट्रिंग(), डीबीपाथ); पुनर्स्थापित करें। रिलायटफाइल। जोड़ें (स्थानांतरित करेंडेटाफाइल); – petric

संबंधित मुद्दे