Single_User मोड में डेटाबेस कैसे छोड़ें


12

मैं एक डेटाबेस को कैसे छोड़ सकता हूं जो DatabaseName (Single User)इसके नाम के रूप में दिखाता है ?

जब मैं इसे हटाने की कोशिश करता हूं, तो मुझे निम्नलिखित त्रुटि मिलती है:

Alter डेटाबेस 'DatabaseName' के लिए विफल रहा। (Microsoft.SqlServer.Smo)

अन्य विवरण कथन विफल हुआ। (Microsoft SQL सर्वर, त्रुटि: 5064)

मैंने ALTERनीचे दिए गए निष्पादन की कोशिश की और अभी भी वही मुद्दा है।

ALTER DATABASE [DatabaseName] SET MULTI_USER WITH NO_WAIT

जवाबों:


23

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

तार्किक रूप से आपको डेटाबेस को वापस मल्टी_युजर मोड में रखना होगा ताकि आप इसे फिर से सिंगल_युसर मोड में डाल सकें (लेकिन इस बार आप उस एकल कनेक्शन के नियंत्रण में रहेंगे और डेटाबेस को किसी अन्य चीज़ से कनेक्ट होने से पहले छोड़ देंगे) और फिर आपका डेटाबेस होगा चला गया।

यहां कोड में बताया गया है कि आपको यह कैसे करना है ( लेकिन पहले अपनी क्वेरी विंडो को उस डेटाबेस से कनेक्ट करें। SSMS को पुनरारंभ करें और सुनिश्चित करें कि आप ऑब्जेक्ट डेटाबेस में इस डेटाबेस का चयन नहीं करते हैं ):

-- Then attempt to take your database to multi_user mode, do this from master
USE MASTER 
GO

ALTER DATABASE myDatabaseName 
SET multi_user WITH ROLLBACK IMMEDIATE
GO

-- Now put it into single_user mode and drop it. Use Rollback Immediate to disconnect any sessions and rollback their transactions. Safe since you are about to drop the DB.
ALTER DATABASE myDatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

DROP DATABASE myDatabaseName
GO

यदि डेटाबेस पहले से ही एकल-उपयोगकर्ता मोड में है, तो यह समाधान काम नहीं करेगा और आप इसे किसी अन्य कनेक्शन से एक्सेस करने का प्रयास करेंगे।
मैक्सिम पाउकोव

4
यह सही है मैक्सिम - इसीलिए मैंने कहा कि प्रदान की गई जानकारी के आधार पर यहां मेरी धारणा है और ओपी स्वयं उत्तर वास्तव में खुले कनेक्शन के साथ एक है जो संभवतः वस्तु एक्सप्लोरर या एक क्वेरी विंडो के माध्यम से है ... यदि यह किसी अन्य तरीके से खुला था अन्य उपयोगकर्ता, तब आपको यह पता लगाना होगा कि एक कनेक्शन जिसने एकल कनेक्शन को चुरा लिया है और उसके बाद हत्या कर दी है-एक कनेक्शन का सत्र और ऊपर उल्लिखित चरणों का पालन करें ..
माइक वाल्श

13

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

Msg 5064, Level 16, State 1, Line 1 राज्य में परिवर्तन या डेटाबेस 'DatabaseName' के विकल्प इस समय नहीं बनाए जा सकते हैं। डेटाबेस एकल-उपयोगकर्ता मोड में है, और एक उपयोगकर्ता वर्तमान में इससे जुड़ा हुआ है। Msg 5069, लेवल 16, स्टेट 1, लाइन 1 ALAT DATABASE स्टेटमेंट फेल हो गया।

निम्न क्वेरी डाटाबेस को ऐक्सेस प्रक्रियाओं को मारता है:

-- Create the sql to kill the active database connections  
declare @execSql varchar(1000), @databaseName varchar(100)  
-- Set the database name for which to kill the connections  
set @databaseName = 'DatabaseName'  

set @execSql = ''   
select  @execSql = @execSql + 'kill ' + convert(char(10), spid) + ' '  
from    master.dbo.sysprocesses  
where   db_name(dbid) = @databaseName  
     and  
     DBID <> 0  
     and  
     spid <> @@spid  
exec(@execSql)
GO

फिर आपको सामान्य रूप से डेटाबेस को बहु-उपयोगकर्ता मोड में वापस लाने में सक्षम होना चाहिए:

ALTER DATABASE 'DatabaseName' SET MULTI_USER

2
यह एक बहुत, बहुत बोझिल समाधान है और एक व्यस्त प्रणाली पर अजीब-ए-मोल के निराशाजनक खेल के बराबर है। सभी उपयोगकर्ताओं को बाहर निकालने के लिए, ALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATEमाइक के जवाब शो के रूप में उपयोग करने के लिए बहुत आसान है ।
हारून बर्ट्रेंड

1
@AaronBertrand माइक का समाधान काम नहीं करेगा यदि डेटाबेस पहले से ही एकल-उपयोगकर्ता मोड में है और आप इसे किसी अन्य कनेक्शन से एक्सेस करने का प्रयास करते हैं।
मैक्सिम पाउकोव

2
ठीक है, अगर ऐसा है, तो उसे सत्रों को ढूंढना होगा, जैसा कि आपने उल्लिखित किया है। हालाँकि, यदि कनेक्शन जिसने डेटाबेस को single_user पर सेट किया है वह उसका अपना है ...
हारून बर्ट्रेंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.