चूंकि डेटाबेस पर ताला नहीं लगाया जा सका, इसलिए DATABASE विफल रहा


124

मुझे एक डेटाबेस को पुनरारंभ करने की आवश्यकता है क्योंकि कुछ प्रक्रियाएं काम नहीं कर रही हैं। मेरी योजना इसे ऑफ़लाइन और फिर से ऑनलाइन वापस लेने की है।

मैं Sql सर्वर प्रबंधन स्टूडियो 2008 में ऐसा करने की कोशिश कर रहा हूँ:

use master;
go
alter database qcvalues
set single_user
with rollback immediate;
alter database qcvalues
set multi_user;
go

मुझे ये त्रुटियां मिल रही हैं:

Msg 5061, Level 16, State 1, Line 1
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.
Msg 5061, Level 16, State 1, Line 4
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 4
ALTER DATABASE statement failed.

मैं क्या गलत कर रहा हूं?


वह कौन सी समस्या है जिसके कारण पहले स्थान पर इसकी आवश्यकता थी? क्या आपके पास इस समय कुछ रोलिंग बैक लेनदेन हैं? इसके अलावा आप पहले से ही एक और SSMS विंडो में इस कमांड को चलाते हैं जो अभी भी खुला हो सकता है? मैं सोच रहा हूं (शुद्ध अटकलें) कि क्या ऐसा ताला लग सकता है जो अन्य प्रयासों को अवरुद्ध करता है लेकिन यह अभी भी इंतजार कर रहा है क्योंकि डेटाबेस वास्तव में एकल_युजर मोड में डाल सकता है।
मार्टिन स्मिथ

1
@ मर्टिन - काफी उचित। मुझे कुछ और सोचना होगा या अपना दिमाग खोना होगा। या तो एक बहुत संभव है
कोडिंगबर्गर

@ आप सभी को बहुत बहुत धन्यवाद, मैंने SSMS को फिर से शुरू किया और सभी को मारने में सक्षम था
JOE SKEET

अंतर्मुखी हो सकता है। मैंने एक अधूरी क्वेरी को डिलीट कर दिया जिसमें डेटाबेस तक पहुँचने के लिए स्क्वीजीली लाइनें थीं और फिर यह काम कर गया।
फहीम

जवाबों:


293

त्रुटि मिलने के बाद, चलाएँ

EXEC sp_who2

सूची में डेटाबेस के लिए देखें। यह संभव है कि एक कनेक्शन समाप्त नहीं हुआ था। यदि आपको डेटाबेस से कोई कनेक्शन मिलता है, तो चलाएं

KILL <SPID>

<SPID>डेटाबेस से जुड़े सत्रों के लिए SPID कहाँ है।

डेटाबेस से सभी कनेक्शन हटा दिए जाने के बाद अपनी स्क्रिप्ट आज़माएं।

दुर्भाग्य से, मेरे पास कोई कारण नहीं है कि आप समस्या क्यों देख रहे हैं, लेकिन यहां एक लिंक है जो दिखाता है कि समस्या कहीं और हुई है।

http://www.geakeit.co.uk/2010/12/11/sql-take-offline-fails-alter-database-failed-because-a-lock-could-not-error-5061/


क्या आप इस बारे में कोई स्पष्टीकरण दे सकते हैं कि कमांड द्वारा कनेक्शन समाप्त क्यों नहीं किया जाएगा? एकमात्र कारण मैं सोच सकता हूं कि यह अभी भी वापस आने की प्रक्रिया में है या यह एक set single_userप्रयास है जो अभी भी लंबित है।
मार्टिन स्मिथ

@Martin, मुझे डर है कि मेरे पास इसके लिए कोई कारण नहीं है। लेकिन, मैं एक लिंक जोड़ूंगा जो बताता है कि दूसरों ने समस्या देखी है। मैं मानता हूं कि एक लेन-देन रोलबैक समस्या हो सकती है, लेकिन KILLयह भी हल नहीं करेगा।
बोब्स

यह समझना अच्छा होगा कि ऐसा क्यों होता है लेकिन आपके लिंक पर टिप्पणी से यह संकेत मिलता है कि यह काम करेगा! (+1)
मार्टिन स्मिथ

KILL (87)Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '('.erm में परिणाम ....
टिम एबेल

2
@MartinSmith मुझे लगता है कि मुझे पता है क्यों: मुझे बस एक ही समस्या थी, एक lingering कनेक्शन जो sp_who2 के तहत दिखाई दे रहा था, जिसके कारण ऑफ़लाइन स्टॉल लेना पड़ा। यह ssms में खुली संपादन पंक्तियों वाली खिड़कियां बन गईं। मेरा मानना ​​है कि यहाँ क्या होता है कि संपादन पंक्तियों की खिड़की एक क्वेरी है जिसे संपादन योग्य परिणाम सेट के साथ खुला रखा जाता है। SQL सर्वर में स्टेटमेंट अपडेट के विकल्प के रूप में ऐसी सुविधा होती है। इस विशेष ssms विंडो को बंद करने पर लटकता हुआ ऑफ़लाइन तुरंत पूरा हो जाता है।
जॉन

5

मैंने निम्न कार्य करके इस त्रुटि को पुन: उत्पन्न किया।

कनेक्शन 1 (कुछ मिनट के लिए चलना छोड़ दें)

CREATE DATABASE TESTING123
GO

USE TESTING123;

SELECT NEWID() AS X INTO FOO
FROM sys.objects s1,sys.objects s2,sys.objects s3,sys.objects s4 ,sys.objects s5 ,sys.objects s6

कनेक्शन 2 और 3

set lock_timeout 5;

ALTER DATABASE TESTING123 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

2

अगर यह "संक्रमण में है"

http://learnmysql.blogspot.com/2012/05/database-is-in-transition-try-statement.html

USE master
GO

ALTER DATABASE <db_name>

SET OFFLINE WITH ROLLBACK IMMEDIATE
...
...
ALTER DATABASE <db_name> SET ONLINE

डेटाबेस में संक्रमण होने पर काम नहीं करेगा, आपको SET OFFLINEओपी द्वारा उल्लिखित कथन के साथ वही त्रुटि मिलेगी (शायद ऐसे परिदृश्य हैं जहां यह काम करता है, लेकिन यह मेरे लिए नहीं था)
एबेल

1

मैं इसे यहां जोड़ूंगा अगर कोई मेरे जैसा भाग्यशाली होगा।

प्रक्रियाओं की sp_who2 सूची की समीक्षा करते समय, उन प्रक्रियाओं पर ध्यान दें जो न केवल प्रभावित डेटाबेस के लिए बल्कि मास्टर के लिए भी चलती हैं । मेरे मामले में डेटाबेस को ब्लॉक करने वाली समस्या xp_cmdshell शुरू करने वाली संग्रहीत प्रक्रिया से संबंधित थी।

जांचें कि क्या आपके पास मास्टर डेटाबेस के लिए KILL / RollBack स्थिति में कोई प्रक्रिया है

SELECT *
FROM sys.sysprocesses
WHERE cmd = 'KILLED/ROLLBACK'

यदि आपके पास एक ही मुद्दा है, तो बस KILL कमांड मदद नहीं करेगा। आप SQL सर्वर को पुनरारंभ कर सकते हैं, या बेहतर तरीका यह है कि SQL सर्वर OS पर विंडोज़ प्रक्रियाओं के तहत cmd.exe को ढूंढें और इसे मार दें।


0

SQL मैनेजमेंट स्टूडियो में, सिक्योरिटी -> लॉगिन पर जाएं और अपने लॉगिन पर डबल क्लिक करें। सर्वर कॉलम को बाएं कॉलम से चुनें, और सत्यापित करें कि sysadmin चेक किया गया है।

मेरे मामले में, मुझे उस विशेषाधिकार के बिना एक खाते पर लॉग इन किया गया था।

HTH!


1
मूल प्रश्न में त्रुटि तब भी होती है जब आप SA हैं, इसका आपके अधिकारों से कोई लेना-देना नहीं है। यदि आपके पास पर्याप्त अधिकार नहीं हैं, तो आप ऑफ़लाइन कमांड निष्पादित नहीं कर पाएंगे।
हाबिल

0

प्रक्रिया आईडी को मारना मेरे लिए अच्छी तरह से काम करता है। जब एक नई क्वेरी विंडो पर "EXEC sp_who2" कमांड चला रहा हो ... और "व्यस्त" डेटाबेस के लिए परिणामों को फ़िल्टर करें, "KILL" कमांड के साथ प्रक्रियाओं को मारना चाल को करने में कामयाब रहे। इसके बाद सभी ने फिर से काम किया।


0

बस मेरे दो सेंट जोड़ने के लिए। मैंने स्टेटमेंट को सफलतापूर्वक चलाने के लिए db लॉगिन के न्यूनतम आवश्यक विशेषाधिकारों की खोज करते हुए खुद को उसी स्थिति में रखा है:

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

ऐसा लगता है कि ALTER स्टेटमेंट सफलतापूर्वक पूरा हो जाता है , जब एक sysadmin लॉगिन के साथ निष्पादित किया जाता है , लेकिन इसके लिए कनेक्शन क्लीनअप भाग की आवश्यकता होती है, जब एक लॉगिन के तहत निष्पादित किया जाता है जिसमें "केवल" सीमित अनुमतियाँ होती हैं जैसे:

ALTER ANY DATABASE

PS मैंने यह जानने की कोशिश करने में घंटों बिताए हैं कि "ALTER DATABASE .." किसी लॉगिन के तहत निष्पादित होने पर काम नहीं करता है, जिसमें dbcreator की भूमिका होती है + किसी भी DATABASE विशेषाधिकारों के साथ। यहाँ मेरा MSDN धागा है !


0

मुझे पता है कि यह एक पुरानी पोस्ट है लेकिन मैं हाल ही में एक बहुत ही समस्या में भाग गया। दुर्भाग्य से मैं किसी भी डेटाबेस के कमांड का उपयोग करने में सक्षम नहीं था क्योंकि एक विशेष लॉक को रखा नहीं जा सकता था। लेकिन मैं कभी भी db के लिए एक खुला कनेक्शन नहीं ढूंढ पाया। मुझे अंततः डेटाबेस की स्वास्थ्य स्थिति को जबरदस्ती हटाने के लिए पुनर्प्राप्ति के बजाय एक पुनर्स्थापित स्थिति में लाना पड़ा।


0

दुर्लभ मामलों में (उदाहरण के लिए, एक भारी लेनदेन शुरू होने के बाद) डेटाबेस फ़ाइल पर FILE लॉक रखने वाली एक रनिंग CHECKPOINT सिस्टम प्रक्रिया MULTI_USER मोड में संक्रमण को रोकती है।


0

मेरे परिदृश्य में, डेटाबेस को sp_who2 के तहत ब्लॉक करने की कोई प्रक्रिया नहीं थी। हालाँकि, हमें पता चला क्योंकि डेटाबेस हमारे अन्य डेटाबेसों की तुलना में बहुत बड़ा है कि लंबित प्रक्रियाएँ अभी भी चल रही थीं, यही कारण है कि उपलब्धता समूह के तहत डेटाबेस अभी भी लाल / ऑफ़लाइन के रूप में प्रदर्शित होने के बाद हम डेटा को फिर से शुरू करने की कोशिश कर रहे हैं, जो कि रुके हुए डेटाबेस पर क्लिक करके सही है।

यह जाँचने के लिए कि क्या आपके पास अभी भी इस कमांड को चलाने की प्रक्रियाएं हैं: sysinos_exec_requests से पूर्ण प्रतिशत का चयन करें जहाँ प्रतिशत_ अपूर्ण> 0

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