"ডেটাবেস স্থানান্তরিত হয়" ত্রুটি


12

আজ আমি একটি বিদ্যমান ডাটাবেসের উপর একটি ডাটাবেস পুনরুদ্ধার করার চেষ্টা করছিলাম, আমি কেবল এসএসএমএস -> টাস্কগুলিতে> ডাটাবেসটি ডানদিকে ক্লিক করেছি - অফলাইন নিয়েছি যাতে আমি ডাটাবেসটি পুনরুদ্ধার করতে পারি।

একটি ছোট পপ আপ উইন্ডো উপস্থিত হয়েছিল এবং কিছু সময়ের Query Executing.....জন্য প্রদর্শিত হয়েছিল এবং তারপরে একটি ত্রুটি ছুঁড়ে ফেলেছিল Database is in use cannot take it offline। যেখান থেকে আমি জড়ো হয়েছি সেখানে সেই ডাটাবেসের সাথে কিছু সক্রিয় সংযোগ রয়েছে তাই আমি নিম্নলিখিত কোয়েরিটি সম্পাদন করার চেষ্টা করেছি

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

আবার এই সময়ে এসএসএমএস কিছু সময়ের 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.

এর পরে আমি এসএসএমএসের মাধ্যমে ডাটাবেসের সাথে সংযোগ করতে পারিনি। এবং যখন আমি এসএসএমএস ব্যবহার করে এটি অফলাইনে নেওয়ার চেষ্টা করেছি তখন এটিতে একটি ত্রুটি ছুঁড়েছে:

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

এই মুহুর্তে আমি সহজেই ডাটাবেসটিকে স্পর্শ করতে পারিনি যা চেষ্টা করেছিলাম একই ত্রুটি বার্তাটি ফিরে আসে Database is in Transition

আমি গুগলে এমন কিছু প্রশ্ন পড়েছিলাম যেখানে লোকেরা একই রকম সমস্যার মুখোমুখি হয়েছিল এবং তারা এসএসএমএস বন্ধ করে আবার এটি খোলার পরামর্শ দিয়েছিল, তাই আমি এবং যেহেতু এটি কেবলমাত্র একটি সার্ভার ছিল তাই আমি এসএসএমএস ব্যবহার করে ডেটাবেসটি মুছলাম এবং নতুন ডাটাবেসে পুনরুদ্ধার করেছি।

আমার প্রশ্নটি কি সম্ভবত এটি হতে পারে ?? এবং ভবিষ্যতে এটি কীভাবে ঘটতে পারে তা এড়াতে পারি এবং ভবিষ্যতে যদি আমি একই পরিস্থিতিতে শেষ করি তবে এটির সমাধানের অন্য কোনও উপায় কি তাহলে সম্পূর্ণ ডাটাবেস মুছতে পারে ???

ধন্যবাদ

উত্তর:


24

Repro

  1. এসএসএমএস খুলুন
  2. একটি নতুন ক্যোয়ারী উইন্ডোতে নিম্নলিখিত লিখুন

    use <YourDatabase>;
    go
  3. অবজেক্ট এক্সপ্লোরার (এসএসএমএস) এ যান এবং <YourDatabase>-> Tasks-> এ ডান ক্লিক করুনTake Offline
  4. দ্বিতীয় নতুন ক্যোয়ারী উইন্ডোটি খুলুন এবং নিম্নলিখিতটি টাইপ করুন:

    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়তাটি রোলব্যাক ঠিকঠাক করে ফেলে থাকেন তবে আপনার সম্ভবত যথেষ্ট হবে।


4

কেবল এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও (এসএসএমএস) বন্ধ করা এবং পুনরায় খোলার বিষয়টি আমার জন্য সমস্যার সমাধান করেছে।


0

কিছু করার দরকার নেই, কেবলমাত্র SqLWB.exeটাস্ক ম্যানেজার থেকে প্রক্রিয়াটি মেরে ফেলুন, এসকিউএল সার্ভার খুলুন, ডাটাবেসে ডান ক্লিক করুন এবং এটি অফলাইনে নিয়ে যান। যদি এটি কাজ না করে তবে সেশনটি মারা যাওয়ার পরে কমান্ডটি টাইপ করুন

ALTER DATABASE [Test4] SET OFFLINE WITH ROLLBACK IMMEDIATE

এবং তারপরে অফলাইন। এটি আমার জন্য যেমন কাজ করেছে তেমন কাজ করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.