एकल-उपयोगकर्ता मोड से बाहर निकलें


208

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

डेटाबेस 'my_db' पहुँच योग्य नहीं है। (ObjectExplorer)

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

इस समय डेटाबेस 'my_db' की स्थिति या विकल्पों में परिवर्तन नहीं किया जा सकता है। डेटाबेस एकल-उपयोगकर्ता मोड में है, और उपयोगकर्ता वर्तमान में इससे जुड़ा हुआ है।

मैं एकल-उपयोगकर्ता मोड से कैसे बाहर निकल सकता हूँ? मेरे पास इस डेटाबेस का उपयोग करने वाला कोई भी उपयोगकर्ता नहीं है।

जब मैं अपनी साइट को IIS से ब्राउज़ करने का प्रयास करता हूं, तो मुझे जो त्रुटि मिलती है वह है:

वर्तमान वेब अनुरोध के निष्पादन के दौरान एक अखंड अपवाद उत्पन्न हुआ था। नीचे दिए गए स्टैक ट्रेस का उपयोग करके अपवाद की उत्पत्ति और स्थान के बारे में जानकारी की पहचान की जा सकती है।

मुझे लगता है जैसे एकल-उपयोगकर्ता मोड इसका कारण बन रहा है।

जवाबों:


381

SSMS सामान्य रूप से पर्दे के पीछे डेटाबेस के लिए कई कनेक्शन का उपयोग करता है।

एक्सेस मोड बदलने से पहले आपको इन कनेक्शनों को मारना होगा।

सबसे पहले, सुनिश्चित करें कि ऑब्जेक्ट एक्सप्लोरर मास्टर जैसे सिस्टम डेटाबेस को इंगित किया गया है।

दूसरा, एक sp_who2 निष्पादित करें और डेटाबेस 'my_db' के सभी कनेक्शन खोजें। KILL { session id }सत्र आईडी कहाँ SPIDसूचीबद्ध है, यह करके सभी कनेक्शनों को मारें sp_who2

तीसरा, एक नई क्वेरी विंडो खोलें।

निम्नलिखित कोड निष्पादित करें।

-- Start in master
USE MASTER;

-- Add users
ALTER DATABASE [my_db] SET MULTI_USER
GO

डेटाबेस फ़ाइलों को प्रबंधित करने पर मेरा ब्लॉग लेख देखें । यह चलती फ़ाइलों के लिए लिखा गया था, लेकिन उपयोगकर्ता प्रबंधन समान है।


2
जब मैंने 'sp_who2' कमांड का उपयोग किया था, तो मैंने 'my_db' से जुड़ा कोई भी DBName नहीं देखा था और मैंने उनमें से किसी भी कनेक्शन को नहीं मारा था। आदेशों को चलाने के बाद मुझे वही त्रुटि मिलती है = [: 'राज्य में परिवर्तन या डेटाबेस' my_db 'के विकल्प इस समय नहीं बनाए जा सकते। डेटाबेस एकल-उपयोगकर्ता मोड में है, और उपयोगकर्ता वर्तमान में इससे जुड़ा हुआ है। Msg 5069, लेवल 16, स्टेट 1, लाइन 1
ALAT

2
क्या आपने सुनिश्चित किया कि आप मास्टर हैं, sp_who2 डेटाबेस = my_db के साथ कोई पंक्तियाँ नहीं दिखाता है, और आपका ऑब्जेक्ट एक्सप्लोरर my_db पर नहीं है।
CRAFTY DBA

1
SSMS को डिस्कनेक्ट और कनेक्ट करने का प्रयास करें। कुछ उस डेटाबेस से जुड़ा होना चाहिए। अन्य विकल्प समर्पित एडमिन कंसोल (DAC) से जुड़ना है। यह मानता है कि आप एक तुनुकमिज़ाज हैं। फिर आपत्तिजनक मकड़ी को मारें।
CRAFTY DBA

1
इसके अलावा, डाउन लोड मेरी usp_who2 स्क्रिप्ट ( craftydba.com/wp-content/uploads/2011/09/usp-who2.txt )। इसे निष्पादित करो। यह msdb.dbo.usp_who2 में उपयोगिता रखता है। यह आपके उपयोगकर्ता आईडी के तहत tempdb में एक तालिका में sp_who2 के परिणामों को बचाता है, डेटाबेस नाम से फ़िल्टर करता है। हमें और अधिक मदद करने के लिए त्रुटि की एक छवि पोस्ट करें। सौभाग्य।
क्राफ्ट डीबीए

3
SPID ढूंढें, निम्न का उपयोग करें: किल 100। सत्र की संख्या (SPID) 100 है।
19 फरवरी को CRAFTY DBA

45

सबसे पहले, खोजें और KILLसभी प्रक्रियाएं जो वर्तमान में चल रही हैं।

फिर, मोड T-SQLमें डेटाबेस सेट करने के लिए निम्न को MULTI_USERचलाएँ।

USE master
GO
DECLARE @kill varchar(max) = '';
SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(10), spid) + '; '
FROM master..sysprocesses 
WHERE spid > 50 AND dbid = DB_ID('<Your_DB_Name>')
EXEC(@kill);

GO
SET DEADLOCK_PRIORITY HIGH
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

यह समाधान SQL Server 2016 पर मेरे लिए काम नहीं करेगा। यदि मैं मास्टर..साइसप्रोसेस करता हूं, तो मुझे कई पंक्तियां दिखाई देती हैं, लेकिन फिर पंक्तियों को एक त्रुटि संदेश के साथ बदल दिया जाता है कि दिया गया डेटाबेस एकल उपयोगकर्ता मोड में है, आदि
youcantryrassme

@youcantryreachingme, कृपया त्रुटि संदेश प्रदान करें जो आपको SQL Server 2016 में मिल रहा था ताकि मैं / कोई और आपको इसे हल करने में मदद कर सके।
सतीश

ओपी के समान: राज्य में परिवर्तन या डेटाबेस 'my_db' के विकल्प इस समय नहीं बनाए जा सकते। डेटाबेस एकल-उपयोगकर्ता मोड में है, और उपयोगकर्ता वर्तमान में इससे जुड़ा हुआ है।
youcantryreachingme

25

एकल उपयोगकर्ता मोड से बाहर जाने के लिए, प्रयास करें:

ALTER DATABASE [my_db] SET MULTI_USER

एकल उपयोगकर्ता मोड में वापस जाने के लिए, आप उपयोग कर सकते हैं:

ALTER DATABASE [my_db] SET SINGLE_USER


1
मुझे त्रुटि मिलती है: इस समय डेटाबेस की स्थिति या विकल्प 'my_db' में बदलाव नहीं किए जा सकते। डेटाबेस एकल-उपयोगकर्ता मोड में है, और उपयोगकर्ता वर्तमान में इससे जुड़ा हुआ है। एमएसजी 5069, लेवल 16, स्टेट 1, लाइन 1 ऑल्टर डबस्ट स्टेटमेंट फेल हो गया। '
सिंह राशि

1
क्या आप डेटाबेस को रोक सकते हैं और पुनः आरंभ कर सकते हैं (जाहिर है कि यदि यह उत्पादन प्रणाली नहीं है जो अन्य उपयोगकर्ताओं को प्रभावित करेगा), और फिर कमांड को पुनः प्रयास करें? और जैसा कि @CRAFTYDBA ने कहा कि कमांड को मास्टर डेटाबेस से निष्पादित किया जाना चाहिए।
rsbarro

1
मैंने 'सिस्टम डेटाबेस' का विस्तार किया और 'मास्टर' पर राइट क्लिक किया और 'न्यू क्वेरी' का चयन किया और आपकी और @ CRAFTYDBA की कमियों दोनों को आज़माया। वही त्रुटि = [
सिंहपद

1
क्या आपने मौजूदा कनेक्शन को मारने के लिए डेटाबेस को रोकने और पुनः आरंभ करने का प्रयास किया था? आप किसी डेटाबेस से कनेक्शन को मारने के और तरीके भी देख सकते हैं: stackoverflow.com/questions/11620/…
rsbarro

2
बाएं फलक में सर्वर पर राइट क्लिक करें और 'डिस्कनेक्ट' पर क्लिक करें। सुनिश्चित करें कि आपके पास अपने डेटाबेस पर केवल एक SSMS टैब खुला है (राइट क्लिक करें और 'अन्य कनेक्शन डिस्कनेक्ट करें' चुनें) और फिर स्टेटमेंट निष्पादित करें। प्रत्येक टैब और ऑब्जेक्ट एक्सप्लोरर एक कनेक्शन है; आपके पास केवल एक कनेक्शन डेटाबेस के लिए खुला हो सकता है (इसलिए, 'एकल-उपयोगकर्ता मोड')। सिंगल यूजर को 'सिंगल कनेक्शन' होना चाहिए :) सौभाग्य
tommy_o

20
  1. डेटाबेस सेक्शन में अपने डेटाबेस पर राइट क्लिक करें
  2. "गुण" चुनें
  3. "विकल्प" पृष्ठ का चयन करें
  4. नीचे "अन्य विकल्प" स्क्रॉल करें और "एक्सेस को प्रतिबंधित करें" फ़ील्ड को बदल दें

sql सर्वर के विकल्प पृष्ठ का स्क्रीनशॉट


1
यह समाधान मेरे लिए SQL Server 2016 पर काम नहीं करेगा। गुणों तक पहुंचने का प्रयास एक त्रुटि दिखाता है कि डेटाबेस एकल उपयोगकर्ता मोड में है और पहले से ही एक उपयोगकर्ता जुड़ा हुआ है।
youcantryreachingme


8

मुझे भी यही समस्या थी, और इस क्वेरी का उपयोग करने के लिए सत्र_ को मिल गया था:

Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');

यह एकदम सही था। Pesky SPID मिला और DB को ऑनलाइन वापस किया। बहुत धन्यवाद!
रसेल स्पाइट

8

CTRL + 1 दबाएं

उस प्रक्रिया को खोजें जो आपके डेटाबेस को लॉक करती है। अपने db के लिए कॉलम dbname में देखें और स्पाइड को नोट करें। अब आपको उस कथन को निष्पादित करना है:

kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;

CTRL + 1 एक बहुत ही आसान शॉर्टकट है जिसके बारे में मुझे नहीं पता था!
टायलर फोर्सिथे

7

निम्नलिखित ने मेरे लिए काम किया:

USE [master]
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE

7

एक अन्य विकल्प यह है:

  • डेटाबेस ऑफ़लाइन ले; SMSS में, डेटाबेस पर राइट क्लिक करें और Take Offline चुनें, 'सभी कनेक्शन ड्रॉप करें' पर टिक करें
  • Daud ALTER DATABASE [Your_Db] SET MULTI_USER

मेरा मुझे इसे ऑफ़लाइन नहीं लेने देगा, यह सिर्फ यह कहता रहा कि यह एकल उपयोगकर्ता मोड में था और उपयोगकर्ता जुड़ा हुआ था! (हाँ, मैंने "सभी कनेक्शन ड्रॉप करें" पर टिक किया था)। मैंने इसके बजाय डेटाबेस को समाप्त कर दिया!
तबबीकूल

मुझे इस विकल्प का उपयोग करना था क्योंकि कोई भी उपयोगकर्ता जुड़ा नहीं था, और KILL कमांड से कनेक्शन पर काम नहीं करेगा।
डेरेक के।

6

बस अगर किसी को इस धागे पर ठोकर लगती है, तो यहाँ एक बुलेट प्रूफ समाधान है SQL सर्वर जो एकल USER मोड में फंस गया है

- जिस कनेक्शन को आपको मारने की आवश्यकता है, उसकी प्रक्रिया आईडी (स्पिड) प्राप्त करें -
डीबी के वास्तविक नाम के साथ 'डीबीएनएएम' बदलें

SELECT sd.[name], sp.spid, sp.login_time, sp.loginame 
FROM sysprocesses sp 
INNER JOIN sysdatabases sd on sp.dbid = sd.dbid  
WHERE sd.[name] = 'DBName'

एक विकल्प के रूप में, आप खुले कनेक्शन के "स्पिड" पाने के लिए कमांड "sp_who" का भी उपयोग कर सकते हैं:

- या इसके बजाय इस एसपी का उपयोग करें

exec sp_who

- फिर निम्नलिखित को निष्पादित करें और सही मानों के साथ [spid] और [DBName] को बदलें

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

अतिरिक्त जानकारी के लिए धन्यवाद, एक बड़ा फर्क पड़ा!
डैनियल

5

यकीन नहीं होता कि यह किसी की मदद करता है, लेकिन मेरे पास एक ही मुद्दा था और वह प्रक्रिया नहीं पा सका जो मुझे पकड़ रही थी। मैंने SSMS को बंद कर दिया और सभी सेवाओं को स्थानीय उदाहरण से रोक दिया। फिर एक बार जब मैं वापस अंदर आया और उसने sp_who2 को अंजाम दिया, तो उसने मुझे अपराधी दिखाया। मैंने इस प्रक्रिया को मार डाला और काम करने के लिए Multi_User प्राप्त करने में सक्षम था, फिर सेवाओं को पुनरारंभ करें। हमने कुछ पैकेजों की तलाश में IIS को हर कुछ मिनटों / सेकंड में मार दिया था।


3

मैं आज सुबह उसी मुद्दे पर भागा। यह एक साधारण मुद्दा बन गया। मेरे पास एक क्वेरी विंडो खुली थी जो ऑब्जेक्ट एक्सप्लोरर में एकल उपयोगकर्ता डेटाबेस पर सेट थी। Sp_who2 संग्रहीत कार्यविधि तब कनेक्शन नहीं दिखाती थी। एक बार जब मैंने इसे बंद कर दिया, तो मैं इसे सेट करने में सक्षम था


3

Jespers उत्तर को जोड़ना , और भी अधिक प्रभावी होने के लिए:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGHDEADLOCK_PRIORITY5 का उपयोग करता है।

क्या हो रहा है कि अन्य प्रक्रियाओं को डेटाबेस में दरार मिलती है और, यदि आपकी प्रक्रिया कम है DEADLOCK_PRIORITY, तो यह दौड़ खो देता है।

यह दूसरे स्पिड को खोजने और मारने में बाधा डालता है (जिसे कई बार करने की आवश्यकता हो सकती है)।

यह संभव है कि आपको ALTER DATABASEएक से अधिक बार चलाने की आवश्यकता होगी , (लेकिन जेस्पर ऐसा करता है)। संशोधित कोड:

USE [master]
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE

3

इस स्क्रिप्ट का उपयोग करें

exec sp_who

Dbname और स्पिड कॉलम खोजें

अब अमल करो

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;

2

आज मुझे उसी मुद्दे का सामना करना पड़ा जहां मेरे डेटाबेस को मल्टी यूजर से सिंगल यूजर मोड में बदल दिया गया था और यह अंततः मुझे डेटाबेस प्रकाशित करने के लिए रोक रहा था।

इस समस्या को ठीक करने के लिए, मुझे सभी Visual Studio इंस्टेंसेस को बंद करना था और Sql Server क्वेरी विंडो में नीचे कमांड चलाना था -

USE [Your_Database_Name]; ALTER DATABASE [Your_Database_Name] SET MULTI_USER GO

इस कमांड ने DB को सिंगल यूजर से मल्टी यूजर में बदल दिया है और बाद में, मैं सफलतापूर्वक प्रकाशित कर पाया।


1

यहां तक ​​कि मुझे एक ही समस्या आती है, इसे मारने के लिए my_db के लिए सक्रिय कनेक्शन खोजने में सक्षम नहीं है लेकिन फिर भी वही त्रुटि दिखाता है। मैं सर्वर पर किसी भी डेटाबेस के लिए सभी संभव एसएसएमएस कनेक्शन को डिस्कनेक्ट करता हूं, एसएसएमएस से एक नया कनेक्शन बनाता हूं और इसे मल्टी यूजर में बदल देता हूं।

-- Actual Code to change my_db to multi user mode
USE MASTER;
GO
ALTER DATABASE [my_db] SET MULTI_USER

नोट: यह SQL Server 2005 में एक संभावित बग प्रतीत होता है!


1

हमने इसे SQL 2012 में ही अनुभव किया। एक प्रतिकृति प्रक्रिया में कूद गए जब हमने मूल सत्र को मार दिया जो इसे एकल उपयोगकर्ता के लिए सेट करता है। लेकिन sp_who2 ने यह नहीं दिखाया कि नई प्रक्रिया डीबी से जुड़ी है। SSMS को बंद करना और फिर से खोलना हमें डेटाबेस पर इस प्रक्रिया को देखने की अनुमति देता है और फिर हम इसे मार सकते हैं और तुरंत मल्टी_सर मोड पर स्विच कर सकते हैं और यह काम किया है।

मैं इसके पीछे के तर्क को काम नहीं कर सकता, लेकिन यह SSMS में एक बग प्रतीत होता है और अभी भी SQL 2012 में खुद को प्रकट कर रहा है।


0

मास्टर का उपयोग करें

जाओ

d.name, d.dbid, spid, login_time, nt_domain, nt_username, sysprocesses p से लॉगिन नाम चुनें। आंतरिक pysbat डेटाबेस में p.dbid = d.dbb जहाँ d.name = 'डेटाबेस का नाम' शामिल हों

568 मारना - मार मारना

परिवर्तन डेटाबेस नाम '

सेट MULTI_USER जाओ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.