2010-10-28 15 views
33

मैं डेटाबेस को पुनर्स्थापित करने के लिए निम्न कोड का उपयोग कर रहा हूं,विशेष उपयोग प्राप्त नहीं किया जा सका क्योंकि डेटाबेस उपयोग में है

void Restore(string ConnectionString, string DatabaseFullPath, string backUpPath) 
{ 
    string sRestore = 
     "USE [master] RESTORE DATABASE [" + DatabaseFullPath + "] FROM DISK = N'" + backUpPath + "' WITH FILE = 1, NOUNLOAD, STATS = 10"; 

    using (SqlConnection con = new SqlConnection(ConnectionString)) 
    { 
     con.Open(); 
     SqlCommand cmdBackUp = new SqlCommand(sRestore, con); 
     cmdBackUp.ExecuteNonQuery(); 
    } 
} 

लेकिन मुझे नीचे अपवाद प्राप्त होता है

"Exclusive access could not be obtained because the database is in use. 
RESTORE DATABASE is terminating abnormally. 
Changed database context to 'master'." 

मैं इसे कैसे ठीक कर सकता हूं?

उत्तर

48

एक साथ MULTI_USER बहाल केवल तब हो सकता है डेटाबेस इसे करने के लिए किसी भी कनेक्शन नहीं है (तुम्हारा के अलावा)। एक एमएस SQL ​​सर्वर पर आसान तरीका सभी उपयोगकर्ताओं शुरू करने के लिए है:

ALTER DATABASE [MyDB] SET Single_User WITH Rollback Immediate 
GO 

अब, आप दण्ड मुक्ति के साथ अपने को बहाल कर सकते हैं। जब आप पूर्ण कर लें तो आप इसे बहु उपयोगकर्ता मोड में चला सेट सुनिश्चित करें बहाल:

ALTER DATABASE [MyDB] SET Multi_User 
GO 
+0

मेरा डेटाबेस 'D: \ SQL \ RRDB.mdf' में है, मुझे पूर्ण पथ या केवल 'RRDB.mdf' के साथ' MyDB' को प्रतिस्थापित करना है? –

+0

आपको केवल आरआरडीबी की आवश्यकता होनी चाहिए। – KeithS

+0

अगले जवाब में मैंने पूर्ण पथ का उपयोग किया और यह काम किया। –

1

इस समस्या के लिए कारण स्वयं-सिद्ध (कनेक्शन डेटाबेस वर्तमान में खुले/सक्रिय करने के लिए) है, लेकिन निम्न (यह भी है ताकि आप इसे समझते हैं गूगल) का उपयोग करें और यह ठीक हो जाओगे:

Alter Database YOURDB 
SET SINGLE_USER With ROLLBACK IMMEDIATE 
GO 

जाहिर है, YOURDDB को अपने डेटाबेस के नाम से बदलें और मास्टर डीबी के खिलाफ इसे चलाएं।

ओह, और बस बैठाना, यदि आप इसे एकल उपयोगकर्ता मोड में 'फंस' मिलता है, यह इसे पूर्ववत होगा:

Alter Database YOURDB 
SET MULTI_USER With ROLLBACK IMMEDIATE 
GO 

आशा इस मदद करता है।

संपादित करें:

तुम भी this पालन कर सकते हैं, देखने के लिए जहां कनेक्शन से कर रहे हैं, और अन्य जानकारी:

मैं इस जबकि सेवाओं चल रहा है कि डेटाबेस से पुन: कनेक्ट हैं होने का परीक्षण किया। मैंने पाया कि आपको एकल उपयोगकर्ता मोड पर सेट करना था, फिर sp_who2 से चलाएं, जहां एक कनेक्शन से आया था, और SPID को नोट करें। आप उस SPID के लिए हत्या आदेश चला सकते हैं और उसी लेनदेन में पुनर्स्थापित कर सकते हैं, और इसे पार करना चाहिए। यह इतना ही डेटाबेस के लिए एक कनेक्शन हो बनाया जा सकता है कर देगा

उपयोग मास्टर ALTER डेटाबेस DatabaseName सेट ROLLBACK तत्काल GO

-यह साथ SINGLE_USER: यहाँ अनुक्रम मैं प्रयोग किया जाता है। - डेटाबेस से कोई आवर्ती कनेक्शन कहां से आ रहा है यह देखने के लिए निम्न आदेश चलाएं।

EXEC SP_WHO2

की जाँच करें इस सूची, DBNAME स्तंभ के अंतर्गत देख। यदि डेटाबेस सूचीबद्ध है, तो कनेक्ट करने का प्रयास करने वाले कौन है यह देखने के लिए प्रोग्राम नाम, और होस्टनाम कॉलम देखें। - अगर यह कोई सेवा नहीं है, या अन्य एप्लिकेशन जो स्वचालित रूप से बंद हो सकता है, तो कनेक्शन को कनेक्शन को मारने के लिए SPID कॉलम में संख्या को नोट करें, और तुरंत बैकअप शुरू करें। बस नीचे संख्या को के साथ बदलें।

किल स्पीड रीस्टोर डाटाबेस डिस्क से DATABASENAME = 'एक्स: \ पाथो \ बैकअप।बेक 'जाओ

-अगर यह सफलतापूर्वक पूरा हो जाता है, तो हम नए पुनर्स्थापित डेटाबेस को बहु उपयोगकर्ता मोड में वापस सेट कर सकते हैं।

ALTER डेटाबेस DatabaseName सेट ROLLBACK तत्काल GO

+0

साहित्यिक चोरी के लिए -1। ईडीआईटी के नीचे का पाठ सीधे TheOneBlackMage के उत्तर से कॉपी किया गया है [यहां] (http://social.msdn.microsoft.com/Forums/en-US/sqldisasterrecovery/thread/aad41cbb-10cb-4109-9e55-aab048bbeb9d)। –

+0

"इंटरनेट पुलिस को कॉल करें, मैंने गलती की है और अब मैं खुद को कोशिश करने और रिडीम करने के लिए वेबसाइटों का उद्धरण दे रहा हूं" <- जो स्टीफनेल्ली, 28/10/2010 संपादित करें: उन्होंने अपनी टिप्पणी हटा दी, और मुझे नीचे छोड़ दिया। एलओएल – Dave

+0

1. संपादन इतिहास को देखते हुए, आपने हाइपरलिंक * बाद में * अपनी टिप्पणी पोस्ट की। 2. किसी भी विचार से मैंने अपनी टिप्पणी पोस्ट करने के तुरंत बाद मेरे कुछ अन्य उत्तरों पर 4 डाउनवॉट क्यों प्राप्त किए? –

14

इस प्रकार मैं अपने डेटाबेस बहाल करने के लिए,
मैं सही तरीके से हूँ नीचे दी गई विधि लिखा है?

void Restore(string ConnectionString, string DatabaseFullPath, string backUpPath) 
{ 
    using (SqlConnection con = new SqlConnection(ConnectionString)) 
    { 
     con.Open(); 

     string UseMaster = "USE master"; 
     SqlCommand UseMasterCommand = new SqlCommand(UseMaster, con); 
     UseMasterCommand.ExecuteNonQuery(); 

     string Alter1 = @"ALTER DATABASE [" + DatabaseFullPath + "] SET Single_User WITH Rollback Immediate"; 
     SqlCommand Alter1Cmd = new SqlCommand(Alter1, con); 
     Alter1Cmd.ExecuteNonQuery(); 

     string Restore = @"RESTORE DATABASE [" + DatabaseFullPath + "] FROM DISK = N'" + backUpPath + @"' WITH FILE = 1, NOUNLOAD, STATS = 10"; 
     SqlCommand RestoreCmd = new SqlCommand(Restore, con); 
     RestoreCmd.ExecuteNonQuery(); 

     string Alter2 = @"ALTER DATABASE [" + DatabaseFullPath + "] SET Multi_User"; 
     SqlCommand Alter2Cmd = new SqlCommand(Alter2, con); 
     Alter2Cmd.ExecuteNonQuery(); 

     labelReport.Text = "Successful"; 
    } 
} 
+0

प्रिंसिपल में मेरे लिए अच्छा लग रहा है। मैं इसे चलाने में सक्षम नहीं हूं, लेकिन कोई चमकदार त्रुटियां नहीं हैं I ध्यान रखें कि 'रोलबैक तत्काल के साथ सेट एकल उपयोगकर्ता' सभी कनेक्शन बंद कर देगा (कमांड चलाने वाले को छोड़कर) और सभी लेन-देन रोलबैक हालांकि। – Dave

8

सबसे अच्छा तरीका

Alter Database <Db_Name> SET [SINGLE_USER | RESTRICTED_USER] 
With ROLLBACK [IMMEDIATE | AFTER 30] 
go 
--do your job that needs exclusive access 
go 
--Back to normal mode 
Alter Database <Db_Name> SET MULTI_USER 
  • साथ ROLLBACK तत्काल - इस विकल्प यह सिर्फ वापस सभी खुले लेनदेन
  • रोलिंग शुरू होता है पूरा करने के लिए लेन-देन के लिए इंतजार नहीं करता रोल 0 के साथ रोल 0 के साथ - यह विकल्प वाई पर खुले लेनदेन के लिए एनएनएन सेकंड प्रतीक्षा करने के बाद सभी खुले लेनदेन रोलबैक करेंगे। हमारे उदाहरण में हम निर्दिष्ट कर रहे हैं कि प्रक्रिया किसी भी खुले लेनदेन को वापस रोल करने से पहले 30 सेकंड प्रतीक्षा करें।

  • जब RESTRICTED_USER निर्दिष्ट किया जाता है, db_owner, dbcreator, या सिस्टम प्रशासक के सदस्य ही भूमिकाओं डेटाबेस का उपयोग कर सकते हैं। MULTI_USER डेटाबेस को अपने सामान्य ऑपरेटिंग स्थिति में देता है।


2 तरीका: ->राज्य के शीर्षक के साथ पिछले अनुभाग का उपयोग SSMS 2008 R2 हम एक ही बात

  1. राइट क्लिक डेटाबेस संपत्ति
  2. विकल्प पर भी जा कर सकते हैं
  3. परिवर्तन से तक सीमित करें SINGLE_USER
  4. जवाब है हां यह सहायक सवाल को दर्शाता है जो कि कार्रवाई के इस प्रकार सभी अन्य कनेक्शन बंद हो जाएगा और मैं इसे केवल एक चीज हम द्वारा त्रुटि

पारित करने के लिए यहाँ के लिए देख रहे है लगता है डेटाबेस गुणों को बदलने के लिए, SQL Server डेटाबेस के सभी अन्य कनेक्शन को बंद करना होगा। क्या आप वाकई गुणों को बदलना चाहते हैं और अन्य सभी कनेक्शन बंद करना चाहते हैं? हाँ या ना

  1. अपने डेटाबेस पुनर्स्थापित
  2. 1-4 बदलते

3 रास्ता वापस करने के लिए पहुँच प्रतिबंधित MULTI_USER कदम कार्य करें: निम्न कमांड भी बंद हो जाएगा सभी कनेक्शन भी।

ALTER DATABASE [DbName] SET OFFLINE 
go  
ALTER DATABASE [DbName] SET ONLINE 

अब डेटाबेस के लिए बहाल तैयार है

अधिक (mssqltips :Getting exclusive access to restore SQL Server databases)

+1

सेट ऑफ़लाइन और सेट ऑनलाइन भी SQL 2008 पर काम किया। ध्यान दें कि दोनों उत्तराधिकार में किया जाना चाहिए; यदि डीबी ऑफ़लाइन है तो इसे पुनर्स्थापित नहीं किया जा सकता है। –

+0

यदि डीबी ऑफ़लाइन है तो इसे पुनर्स्थापित किया जा सकता है। मैंने इसे अद्यतन 2008 आर 2 पर परीक्षण किया और यह काम किया। आमतौर पर उल्लिखित विधियां काम नहीं करती हैं और आपको सक्रिय सत्रों को मारने के लिए गतिविधि मॉनीटर का उपयोग करना होगा। –

6

आप प्रदर्शन से पहले एक निर्दिष्ट डेटाबेस पर सभी प्रक्रियाओं Kiil के एसएमओ SqlServer वस्तु पर विधि का उपयोग कर सकते हैं एक बहाल:

sqlServer.KillAllProcesses("databaseName"); 
1
  • डेटाबेस के लिए केवल एक कनेक्शन बनाया जा सकता है। - यह देखने के लिए निम्न आदेश चलाएं कि डेटाबेस से कोई आवर्ती कनेक्शन कहां से आ रहा है।

    EXEC SP_WHO2 
    
  • डीबीएनएएम कॉलम के नीचे देखकर, इस सूची को देखें। यदि डेटाबेस सूचीबद्ध है, तो कनेक्ट करने का प्रयास करने वाले व्यक्ति को देखने के लिए प्रोग्राम नाम और होस्टनाम कॉलम देखें।

  • यदि यह कोई सेवा नहीं है, या अन्य एप्लिकेशन जो स्वचालित रूप से फिर से कनेक्ट हो जाएंगे, जिसे बंद कर दिया जा सकता है, कनेक्शन को मारने के लिए SPID कॉलम में संख्या को नोट करें, और तुरंत बैकअप शुरू करें। बस संख्या के साथ नीचे SPID बदलें।

    KILL SPID RESTORE DATABASE DATABASENAME FROM DISK = 'X:\PATHTO\BACKUP.BAK' GO 
    
  • इस सफलतापूर्वक पूरा करते हैं, तो हम वापस बहु उपयोगकर्ता मोड पर नव बहाल डेटाबेस सेट कर सकते हैं।

    ALTER DATABASE DATABASENAME SET MULTI_USER WITH ROLLBACK IMMEDIATE GO 
    
संबंधित मुद्दे

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