"डेटाबेस संक्रमण में है" त्रुटि


12

आज मैं पहले से मौजूद डेटाबेस पर एक डेटाबेस को पुनर्स्थापित करने की कोशिश कर रहा था, मैंने बस SSMS -> कार्य -> ​​ऑफ़लाइन ले लिया डेटाबेस में क्लिक किया ताकि मैं डेटाबेस को पुनर्स्थापित कर सकूं।

एक छोटा पॉप अप विंडो दिखाई दिया और Query Executing.....कुछ समय के लिए दिखाया गया और फिर एक त्रुटि कहकर फेंक दिया Database is in use cannot take it offline। जिससे मैं इकट्ठा हुआ, उस डेटाबेस में कुछ सक्रिय कनेक्शन थे इसलिए मैंने निम्नलिखित प्रश्न को निष्पादित करने का प्रयास किया

USE master
GO
ALTER DATABASE My_DatabaseName
SET OFFLINE WITH ROLLBACK IMMEDIATE
GO

इस बिंदु पर फिर से SSMS ने Query Executing.....कुछ समय के लिए दिखाया और फिर निम्नलिखित त्रुटि को फेंक दिया:

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

इसके बाद मैं SSMS के माध्यम से डेटाबेस से जुड़ नहीं सका। और जब मैंने SSMS का उपयोग करके इसे ऑफ़लाइन लेने का प्रयास किया, तो यह कहते हुए एक त्रुटि हुई:

Database is in Transition. Try later .....

इस बिंदु पर मैं बस डेटाबेस को स्पर्श नहीं कर सकता, मैंने जो भी कोशिश की थी वह उसी त्रुटि संदेश को वापस कर दिया Database is in Transition

मुझे Google पर कुछ ऐसे प्रश्न पढ़ने को मिले, जहां लोगों ने इसी तरह के मुद्दे का सामना किया था और उन्होंने SSMS को बंद करने और इसे फिर से खोलने की सिफारिश की थी, इसलिए मैंने किया और चूंकि यह केवल एक देव सर्वर था, मैंने बस SSMS का उपयोग करके डेटाबेस को हटा दिया और एक नए डेटाबेस पर पुनर्स्थापित किया।

मेरा सवाल यह है कि संभवतः इसका कारण क्या हो सकता है ?? और मैं भविष्य में ऐसा होने से कैसे बच सकता हूं और अगर मैं भविष्य में कभी भी उसी स्थिति में रहता हूं तो क्या इसे ठीक करने का कोई और तरीका है तो पूरे डेटाबेस को हटा दें ???

धन्यवाद

जवाबों:


24

रेप्रो

  1. SSMS खोलें
  2. एक नई क्वेरी विंडो में निम्नलिखित टाइप करें

    use <YourDatabase>;
    go
    
  3. ऑब्जेक्ट एक्सप्लोरर (SSMS) पर जाएं और <YourDatabase>-> Tasks-> पर राइट-क्लिक करेंTake Offline
  4. एक दूसरी नई क्वेरी विंडो खोलें और निम्न टाइप करें:

    use <YourDatabase>;
    go
    

आपको निम्न संदेश के साथ संकेत दिया जाएगा:

Msg 952, स्तर 16, राज्य 1, लाइन 1
डेटाबेस 'TestDb1' संक्रमण में है। बाद में कथन का प्रयास करें।

इसका कारण यह है कि एक समान नैदानिक ​​क्वेरी से नीचे एक को पाया जा सकता है:

select
    l.resource_type,
    l.request_mode,
    l.request_status,
    l.request_session_id,
    r.command,
    r.status,
    r.blocking_session_id,
    r.wait_type,
    r.wait_time,
    r.wait_resource,
    request_sql_text = st.text,
    s.program_name,
    most_recent_sql_text = stc.text
from sys.dm_tran_locks l
left join sys.dm_exec_requests r
on l.request_session_id = r.session_id
left join sys.dm_exec_sessions s
on l.request_session_id = s.session_id
left join sys.dm_exec_connections c
on s.session_id = c.session_id
outer apply sys.dm_exec_sql_text(r.sql_handle) st
outer apply sys.dm_exec_sql_text(c.most_recent_sql_handle) stc
where l.resource_database_id = db_id('<YourDatabase>')
order by request_session_id;

इसके लायक होने के लिए, आपको इस त्रुटि को पुन: उत्पन्न करने के लिए ऑब्जेक्ट एक्सप्लोरर की आवश्यकता नहीं है। आपको बस एक अवरुद्ध अनुरोध की आवश्यकता है जो एक ही ऑपरेशन का प्रयास कर रहा है (इस मामले में, डेटाबेस को ऑफ़लाइन ले जाएं)। T-SQL में तीन चरणों के लिए नीचे स्क्रीनशॉट देखें:

यहाँ छवि विवरण दर्ज करें

आप जो सबसे अधिक संभावना देखेंगे, वह है कि आपका ऑब्जेक्ट एक्सप्लोरर सत्र दूसरे सत्र द्वारा अवरुद्ध किया जा रहा है (द्वारा दिखाया गया है blocking_session_id)। वह ऑब्जेक्ट एक्सप्लोरर सत्र Xडेटाबेस पर एक अनन्य लॉक ( ) प्राप्त करने की कोशिश कर रहा होगा । उपरोक्त रेप्रो के मामले में, ऑब्जेक्ट एक्सप्लोरर सत्र को एक अपडेट लॉक ( U) और एक विशेष लॉक ( X) में बदलने का प्रयास किया गया था । इसमें LCK_M_Xहमारे सत्र द्वारा अवरुद्ध किया गया एक wa_type था , जिसे पहली क्वेरी विंडो ( डेटाबेस पर use <YourDatabase>एक साझा लॉक ( S) पकड़ता है ) द्वारा दर्शाया गया था ।

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

अगली बार आपको क्या करना चाहिए?

सबसे पहले, घबराओ मत और डेटाबेस को छोड़ना शुरू मत करो । आपको यह जानने के लिए कि आपको क्या दिखाई दे रहा है, यह जानने के लिए आपको एक समस्या निवारण दृष्टिकोण (ऊपर दिए गए समान नैदानिक ​​क्वेरी के साथ) लेने की आवश्यकता है । उस तरह के संदेश के साथ, या जब कुछ "लटका हुआ" दिखाई देता है, तो आपको स्वचालित रूप से संगामिति की कमी माननी चाहिए और अवरुद्ध करने में खुदाई करना शुरू करना चाहिए ( sys.dm_tran_locksयह एक अच्छी शुरुआत है)।

एक साइड नोट के रूप में, मुझे वास्तव में विश्वास है कि आप किसी भी यादृच्छिक कार्रवाई करने से पहले समस्या की जड़ का पता लगाने के लिए सबसे अच्छा है। न केवल इस ऑपरेशन के साथ, बल्कि वह सभी व्यवहार के लिए जाता है जिसकी आपको उम्मीद नहीं है। यह जानना कि वास्तव में आपकी समस्या क्या थी , यह स्पष्ट है कि यह वास्तव में कोई बड़ी बात नहीं थी। आपके पास मूल रूप से एक अवरुद्ध श्रृंखला थी, और मूल अवरोधक एक ऐसी चीज थी जिसकी आप सबसे अधिक संभावना सिर्फ एक जारी कर सकते KILLथे, या यदि यह एक सत्र का अनुरोध था जिसे आप नहीं करना चाहते थे KILLतो आप इसे पूरा होने तक इंतजार कर सकते थे। किसी भी तरह से, आपको अपने विशेष परिदृश्य (रोलबैक या कमिटमेंट के लिए प्रतीक्षा) को देखते हुए सही और विवेकपूर्ण निर्णय लेने का ज्ञान होगा।

एक और बात ध्यान देने योग्य है, यह एक कारण है कि मैं हमेशा जीयूआई के बजाय टी-एसक्यूएल विकल्प का विकल्प चुनता हूं। आपको ठीक-ठीक पता है कि आप T-SQL के साथ क्या निष्पादित कर रहे हैं और SQL सर्वर क्या कर रहा है। आखिरकार, आपने स्पष्ट आदेश जारी किया। जब आप GUI का उपयोग करते हैं, तो वास्तविक T-SQL एक अमूर्त होने जा रहा है। इस मामले में, मैंने डेटाबेस को ऑफ़लाइन लेने के लिए अवरुद्ध ऑब्जेक्ट एक्सप्लोरर के प्रयास को देखा और यह था ALTER DATABASE <YourDatabase> SET OFFLINE। रोलबैक के लिए कोई प्रयास नहीं किया गया था, यही कारण है कि यह अनिश्चित काल तक इंतजार कर रहा था। आपके मामले में, यदि आप उस डेटाबेस पर लॉकबैक सत्रों को रोलआउट करना चाहते थे, तो यदि आपने ALTER DATABASE ... SET OFFLINE WITH ROLLBACK IMMEDIATEप्रारंभिक निर्णय लिया था कि रोलबैक ठीक है , तो आपके पास सबसे अधिक संभावना होगी।



0

कुछ भी करने की ज़रूरत नहीं है, बस SqLWB.exeटास्क मैनेजर से प्रक्रिया को मारें , SQL सर्वर खोलें, डेटाबेस पर राइट क्लिक करें और इसे ऑफ़लाइन ले जाएं। यदि यह काम नहीं करता है, तो सत्र मारे जाने के बाद, कमांड टाइप करें

ALTER DATABASE [Test4] SET OFFLINE WITH ROLLBACK IMMEDIATE

और फिर ऑफ़लाइन। यह मेरे लिए भी काम करेगा जैसा कि यह मेरे लिए भी काम करेगा।

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