Repro
- এসএসএমএস খুলুন
একটি নতুন ক্যোয়ারী উইন্ডোতে নিম্নলিখিত লিখুন
use <YourDatabase>;
go
- অবজেক্ট এক্সপ্লোরার (এসএসএমএস) এ যান এবং
<YourDatabase>
-> Tasks
-> এ ডান ক্লিক করুনTake Offline
দ্বিতীয় নতুন ক্যোয়ারী উইন্ডোটি খুলুন এবং নিম্নলিখিতটি টাইপ করুন:
use <YourDatabase>;
go
আপনাকে নিম্নলিখিত বার্তাটি সম্পর্কে অনুরোধ জানানো হবে:
এমএসজি 952, স্তর 16, রাজ্য 1, লাইন 1
ডাটাবেস 'টেস্টডিবি 1 ' স্থানান্তরিত রয়েছে। বিবৃতি পরে চেষ্টা করুন।
এটি হওয়ার কারণটি নীচের মত একটি অনুরূপ ডায়াগোনস্টিক কোয়েরি থেকে পাওয়া যাবে:
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;
এটি মূল্যবান কিসের জন্য, এই ত্রুটিটি পুনরুত্পাদন করার জন্য আপনার অবজেক্ট এক্সপ্লোরারের প্রয়োজন হবে না। আপনার কেবল একটি অবরুদ্ধ অনুরোধ প্রয়োজন যা একই ক্রিয়াকলাপটি চেষ্টা করছে (এই ক্ষেত্রে, ডাটাবেসটি অফলাইনে নিন)। টি-এসকিউএল-তে তিনটি ধাপের জন্য নীচের স্ক্রিনশটটি দেখুন:
আপনি সম্ভবত যা দেখতে পাবেন তা হ'ল আপনার অবজেক্ট এক্সপ্লোরার সেশনটি অন্য সেশনের (দ্বারা দেখানো blocking_session_id
) দ্বারা অবরুদ্ধ করা হয়েছে । সেই অবজেক্ট এক্সপ্লোরার সেশনটি X
ডাটাবেসে একচেটিয়া লক ( ) পাওয়ার চেষ্টা করবে । উপরোক্ত তিরস্কারের ক্ষেত্রে, অবজেক্ট এক্সপ্লোরার সেশনে একটি আপডেট লক ( U
) প্রদান করা হয়েছিল এবং একচেটিয়া লকটিতে রূপান্তর করার চেষ্টা করা হয়েছিল ( X
)। এটির একটি অপেক্ষা_প্রকার ছিল LCK_M_X
, আমাদের সেশন দ্বারা অবরুদ্ধ করা হয়েছিল যা প্রথম ক্যোয়ারী উইন্ডো দ্বারা উপস্থাপিত হয়েছিল ( ডাটাবেসে use <YourDatabase>
একটি ভাগ করা লক ধরেছে S
)।
এবং এরপরে এই ত্রুটিটি এসেছিল একটি লক পাওয়ার চেষ্টা করার পরে অন্য একটি অধিবেশন থেকে এবং এই ত্রুটি বার্তাটির ফলে একটি সেশনকে অস্বীকৃতি জানায় যে কোনও ডেটাবেজে অ্যাক্সেস পাওয়া যায় যা একটি পৃথক রাজ্যে স্থানান্তরিত করার চেষ্টা করছে (এই ক্ষেত্রে, অনলাইনের অবস্থা) অফলাইন রূপান্তর)।
পরের বার আপনার কী করা উচিত?
প্রথমে, আতঙ্কিত হবেন না এবং ডাটাবেসগুলি বাদ দেওয়া শুরু করবেন না । আপনি যা দেখছেন তা কেন দেখছেন তা জানতে আপনাকে সমস্যা সমাধানের পদ্ধতি গ্রহণ করতে হবে (উপরের মতো একটি অনুরূপ ডায়াগনস্টিক কোয়েরি সহ) । এর মতো বার্তা সহ বা যখন কোনও কিছু "হ্যাং" উপস্থিত হয়, আপনার স্বয়ংক্রিয়ভাবে সম্মতি স্বীকার করে নেওয়া উচিত এবং অবরুদ্ধকরণে খনন করা শুরু করা ( sys.dm_tran_locks
এটি একটি ভাল শুরু)।
পার্শ্ব নোট হিসাবে, আমি সত্যই বিশ্বাস করি যে কোনও এলোমেলো পদক্ষেপ নেওয়ার আগে আপনি সমস্যার মূল খুঁজে বের করার পক্ষে সেরা। কেবল এই অপারেশন দিয়ে নয়, এটি এমন আচরণের জন্য যায় যা আপনি প্রত্যাশা করেন না। আপনার সমস্যাটি আসলে কী কারণে ঘটছে তা জানা , এটি স্পষ্টতই কোনও বড় বিষয় ছিল না। আপনার মূলত একটি ব্লকিং চেইন ছিল, এবং প্যারেন্ট ব্লকার এমন একটি জিনিস যা সম্ভবত আপনি একটি KILL
অন ইস্যু করতে পেরেছিলেন , বা যদি এটি একটি সেশনের অনুরোধ ছিল যা আপনি চান না KILL
তখন আপনি এটি শেষ না হওয়া পর্যন্ত অপেক্ষা করতে পারতেন। যে কোনও উপায়ে আপনার নির্দিষ্ট দৃশ্যের (রোলব্যাক বা অঙ্গীকারের অপেক্ষায়) সঠিক ও বিচক্ষণ সিদ্ধান্ত নেওয়ার জ্ঞান থাকতে হবে।
লক্ষ্য করার মতো আরেকটি বিষয়, আমি সবসময় জিইউআইয়ের পরিবর্তে টি-এসকিউএল বিকল্পের জন্য নির্বাচন করার কারণগুলির এটি একটি। আপনি কী জানেন যে আপনি টি-এসকিউএল দিয়ে এক্সিকিউট করছেন এবং এসকিউএল সার্ভার কী করছে। সর্বোপরি, আপনি সুস্পষ্ট আদেশ জারি করেছেন। আপনি যখন জিইউআই ব্যবহার করেন, আসল টি-এসকিউএল একটি বিমূর্ততা হতে চলেছে। এই ক্ষেত্রে, আমি অবরুদ্ধ অবজেক্ট এক্সপ্লোরারটির ডাটাবেসটিকে অফলাইনে নেওয়ার প্রয়াসের দিকে নজর দিয়েছিলাম এবং এটি ছিল ALTER DATABASE <YourDatabase> SET OFFLINE
। রোলব্যাক করার কোনও চেষ্টা হয়নি, যে কারণে এটি অনির্দিষ্ট সময়ের জন্য অপেক্ষা করছিল। আপনার ক্ষেত্রে, যদি আপনি সেই ডাটাবেসে লকযুক্ত সেশনগুলি রোলব্যাক করতে চান, আপনি ALTER DATABASE ... SET OFFLINE WITH ROLLBACK IMMEDIATE
যদি প্রাথমিক দৃ determination়তাটি রোলব্যাক ঠিকঠাক করে ফেলে থাকেন তবে আপনার সম্ভবত যথেষ্ট হবে।