रेप्रो
- SSMS खोलें
एक नई क्वेरी विंडो में निम्नलिखित टाइप करें
use <YourDatabase>;
go
- ऑब्जेक्ट एक्सप्लोरर (SSMS) पर जाएं और
<YourDatabase>
-> Tasks
-> पर राइट-क्लिक करेंTake Offline
एक दूसरी नई क्वेरी विंडो खोलें और निम्न टाइप करें:
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
प्रारंभिक निर्णय लिया था कि रोलबैक ठीक है , तो आपके पास सबसे अधिक संभावना होगी।