SQL सर्वर डेटाबेस को ऑफ़लाइन लेते समय चरम प्रतीक्षा-समय


278

मैं अपने देव डेटाबेस पर कुछ ऑफ़लाइन रखरखाव (लाइव बैकअप से डेव डेटाबेस रिस्टोर) करने की कोशिश कर रहा हूं, लेकिन SQL सर्वर मैनेजमेंट स्टूडियो के माध्यम से 'टेक ऑफलाइन' कमांड 30 मिनट से अधिक के आदेश पर बेहद धीमी गति से प्रदर्शन कर रहा है। मैं बस अपने दिमाग के अंत में हूं और मुझे कोई संदर्भ ऑनलाइन नहीं मिल रहा है कि गति की समस्या क्या हो सकती है, या इसे कैसे ठीक किया जाए।

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

इस मंदी का कारण क्या हो सकता है, और मैं इसे गति देने के लिए क्या कर सकता हूं?

जवाबों:


408

कुछ अतिरिक्त खोज के बाद (केबीके के जवाब पर gbn के उत्तर और u07ch की टिप्पणी से प्रेरित नए खोज शब्द) मुझे यह मिला, जो 2 सेकंड में सफलतापूर्वक पूरा हुआ:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

(अपडेट करें)

जब यह अभी भी निम्न त्रुटि के साथ विफल हो जाता है, तो आप इसे इस ब्लॉग पोस्ट से प्रेरित होकर ठीक कर सकते हैं :

इसके बाद DATABASE विफल रहा क्योंकि डेटाबेस 'dbname' पर ताला नहीं लगाया जा सका। बाद में पुन: प्रयास करें।

आप निम्न कमांड को यह पता लगाने के लिए चला सकते हैं कि आपके डेटाबेस पर ताला कौन लगा रहा है:

EXEC sp_who2

और जो कुछ भी SPIDआपको निम्न कमांड में मिलता है उसका उपयोग करें :

KILL <SPID>

फिर ALTER DATABASEकमांड चलाएं । यह अब काम करना चाहिए।


35
यदि यह काम नहीं कर रहा है (एक ताला नहीं लगाया जा सकता है), तो stackoverflow.com/questions/4673065 में समाधान भी आज़माएं ।
nalply

3
यदि टेक डीबी ऑफलाइन प्रक्रिया अभी भी चल रही है, तो देव मशीनों के लिए आप इसे टास्क मैनेजर से मार सकते हैं और कमांड से ऊपर चला सकते हैं।
नल हेड

1
यदि आप KILL कमांड चलाते हैं और संदेश प्राप्त करते हैं "अपनी प्रक्रिया को मारने के लिए KILL का उपयोग नहीं कर सकते", सुनिश्चित करें कि आप कमांड चलाने के लिए मास्टर डेटाबेस का उपयोग कर रहे हैं
Jarrod

129

डीबी से कहीं न कहीं एक संबंध होने की संभावना है (एक दुर्लभ उदाहरण: अतुल्यकालिक सांख्यिकीय अद्यतन )

कनेक्शन खोजने के लिए, sys.sysprocesses का उपयोग करें

USE master
SELECT * FROM sys.sysprocesses WHERE dbid = DB_ID('MyDB')

डिस्कनेक्ट करने के लिए, रोलबैक IMMEDIATE का उपयोग करें

USE master
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

7
+1 क्योंकि प्रक्रिया क्वेरी आपको बताती है कि इस डेटाबेस से क्या जुड़ा है। मेरे मामले में यह SSMS खुला :) के साथ एक बदमाश कर्मचारी था
माइक्मुर्को

3
मेरे मामले में मैं एक क्वेरी विश्लेषक खिड़की खुली के साथ बदमाश था
dellyjm

1
मेरे मामले में डेवलपर्स के पास एक बहुत ही प्रसिद्ध बैंक के लिए एक उत्पादन मुख्य वेबसाइट थी, जो डेटाबेस में पाए गए ओएलडी
ZZ9

3
अगर यह कहता है कि ALTER DATABASE failed because a lock could not be placed on databaseकमांड KILL <SPID>मदद करेगा
मुफलिक्स

28

क्या आपके पास कोई खुला SQL सर्वर प्रबंधन स्टूडियो विंडो है जो इस DB से जुड़ी है?

इसे एकल उपयोगकर्ता मोड में रखें, और फिर पुन: प्रयास करें।


2
ALAT DATABASE <DBNAME> SET SINGLE_USER को रोलबैक तत्काल के साथ
u07ch

KMike - मेरे पास एकमात्र कनेक्शन मास्टर डेटाबेस के लिए खुला है, वह डेटाबेस नहीं जिसे मैं ऑफ़लाइन लेने का प्रयास कर रहा हूं।
एरिक फोर्ब्स 18

17

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


7

संग्रहीत कार्यविधि sp_who2 निष्पादित करें

यह आपको यह देखने की अनुमति देगा कि क्या कोई अवरुद्ध ताले हैं .. उन्हें मारना चाहिए इसे ठीक करना चाहिए।


5

SSMS में: SQL सर्वर आइकन, गतिविधि मॉनिटर पर राइट-क्लिक करें। प्रक्रियाएँ खोलें। कनेक्टेड प्रक्रिया खोजें। प्रक्रिया पर राइट-क्लिक करें, किल।


4

जब भी आप इस प्रकार की चीज़ों में भाग लेते हैं, तो आपको हमेशा अपने लेन-देन के बारे में सोचना चाहिए। रोलबैक के साथ तत्काल db क़ानून में परिवर्तन इस बात को इंगित करता है। इसकी जांच करें: http://msdn.microsoft.com/en-us/library/ms189085.aspx

चौकियों आदि पर हड्डी, आपको यह तय करने की आवश्यकता है कि आपके लॉग में लेनदेन बचत के लायक हैं या नहीं और फिर तदनुसार अपने db को चलाने के लिए मोड चुनें। वास्तव में आपके पास प्रतीक्षा करने का कोई कारण नहीं है, लेकिन आपके पास डेटा खोने का कोई कारण भी नहीं है - आपके पास दोनों हो सकते हैं।


2
ऋषि सलाह - धन्यवाद - लेकिन इस मामले में डेटा खर्च करने योग्य है क्योंकि यह एक विकास डेटाबेस है जिसे बहाल किया जा रहा है।
एरिक फोर्ब्स

3

SSMS (SQL सेवा प्रबंधक) के उदाहरण को बंद करना जिससे अनुरोध किया गया था, मेरे लिए समस्या का समाधान किया गया ....।


3

मेरे मामले में मैंने इस कार्रवाई को करने से पहले डीबी में कुछ तालिकाओं को देखा था। मेरा उपयोगकर्ता खाता SSMS में इस DB के लिए एक सक्रिय कनेक्शन रखता था। एक बार जब मैंने एसएसएमएस में सर्वर से डिस्कनेक्ट किया ('डेटाबेस ऑफ़लाइन ले जाएं' डायलॉग बॉक्स खुला) तो ऑपरेशन सफल हो गया।


मेरे साथ भी ऐसा है। तब मैंने फिर से
जोड़ा

2

इसके आस-पास जाने के लिए मैंने IIS में db से जुड़ी वेबसाइट को बंद कर दिया और तुरंत 'जमे हुए' 'db ऑफ़लाइन' पैनल को हटा दिया गया।


2

मैंने नीचे सभी सुझावों की कोशिश की और कुछ भी काम नहीं किया।

  1. EXEC sp_who
  2. मार <SPID>

  3. रोलबैक तत्काल के साथ SATLE_USER सेट करें

    रोलमैट आइएमएडिएट के साथ ऑफ़लाइन सेट पर जाएं

    परिणाम: उपरोक्त दोनों आदेश भी अटक गए।

४। डेटाबेस पर राइट-क्लिक करें -> गुण -> विकल्प सेट डेटाबेस रीड-ओनली टू ट्रू क्लिक 'यस' डायलॉग वार्निंग SQL सर्वर डेटाबेस के सभी कनेक्शनों को बंद कर देगा।

परिणाम: खिड़की निष्पादित करने पर अटक गई थी।

अंतिम उपाय के रूप में, मैंने कॉन्फ़िगरेशन प्रबंधक से SQL सर्वर सेवा को फिर से शुरू किया और उसके बाद ROLLBACK IMMEDIATE के साथ DATABASE SET OFFLINE चलाया। इसने एक जादू की तरह काम किया


1

इसके अलावा, आपके पास किसी भी क्वेरी विंडो को खोलें, जो डेटाबेस से जुड़ी हो;


1

SSMS में, डेटाबेस को केवल तभी वापस पढ़ने के लिए सेट करें। कनेक्शन बंद हो जाएंगे, जो ताले को मुक्त कर देते हैं।

मेरे मामले में एक वेबसाइट थी जिसमें डेटाबेस के लिए खुले कनेक्शन थे। यह तरीका काफी आसान था:

  1. डेटाबेस पर राइट क्लिक करें -> गुण -> विकल्प
  2. Database Read-Onlyसही पर सेट करें
  3. SQL सर्वर के सभी कनेक्शन बंद कर देगा संवाद चेतावनी पर 'हां' पर क्लिक करें।
  4. विकल्प फिर से खोलें और रीड-ओनली बैक ऑफ करें
  5. अब डेटाबेस का नाम बदलने या इसे ऑफ़लाइन लेने का प्रयास करें।

0

मेरे लिए, मुझे बस जॉब एक्टिविटी मॉनिटर में जाना था और दो चीजों को रोकना था जो प्रसंस्करण कर रहे थे। फिर यह तुरंत ऑफ़लाइन हो गया। मेरे मामले में हालांकि मुझे पता था कि वे 2 प्रक्रियाएं क्या थीं और उन्हें रोकना ठीक था।


0

मेरे मामले में, डेटाबेस एक पुराने शेयरपॉइंट इंस्टॉल से संबंधित था। सर्वर प्रबंधक में संबंधित सेवाओं को रोकना और अक्षम करना, ऑफ़लाइन कार्रवाई करें, जो 40 मिनट से चल रही थी, और इसे तुरंत पूरा किया।

यदि कोई सेवाएँ वर्तमान में डेटाबेस का उपयोग कर रही हैं, तो आप जांचना चाहें।


1
sp_who2डेटाबेस को उपयोग kill <PID>करने और उन्हें रोकने के लिए कौन सी प्रक्रियाएं उपयोग कर रही हैं, यह देखने के लिए चलाएँ ।
एरिक किगथी

0

अगली बार, टेक ऑफलाइन डायलॉग से, 'ड्रॉप ऑल एक्टिव कनेक्शन्स' चेकबॉक्स को चेक करना याद रखें। मैं बिना किसी कनेक्शन के स्थानीय मशीन पर SQL_EXPRESS पर भी था, लेकिन मेरे लिए यह मंदी तब तक हुई जब तक कि मैंने उस चेकबॉक्स को चेक नहीं किया।


-1

मेरे मामले में मैंने टॉमकैट सर्वर को बंद कर दिया। फिर तुरंत DB ऑफ़लाइन हो गया।

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