বড় মোছার ক্যোয়ারী হিমশীতল বলে মনে হচ্ছে


10

আমরা একটি ডাটাবেসে 1.8bn সারি সহ একটি মুছা কোয়েরি চালিয়েছি। এই মোছা 1.2bn সারি মুছে ফেলবে।

অন্ধকারে, আমরা এই ক্যোয়ারীটি একবারে প্রায় 100 মিটার করে ভেঙে ফেলতে পারি তবে আমরা এমন অবস্থানে রয়েছি যেখানে এটি 24 ঘন্টা চলছে এবং লগ ফাইলটি 2 টিবিতে রয়েছে যা লগ ফাইলের জন্য অনুমোদিত সর্বোচ্চ আকার বলে মনে হয়।

ডাটাবেসটি সিম্পল পুনরুদ্ধার মোডে রয়েছে।

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


আপনি কি এটি এসএসএমএস থেকে চালিয়েছেন? শুধু এটি বাতিল করুন। এটি বাতিল হতে কিছুক্ষণ সময় লাগবে। প্রায় চলমান হিসাবে এটি প্রায়। আপনার ধৈর্য প্রয়োজন।
পাপারাজ্জো

1
@ গ্রামীম বিলিয়ন-রেকর্ড ডাটাবেসগুলির সাথে আমাদের অভিজ্ঞতা থেকে (আমরা তাদের কয়েকটি চালিয়ে যাচ্ছি) কখনও কখনও শিকারের টেবিল থেকে বাকী রেকর্ডগুলি সংরক্ষণ করা , এটি কেটে ফেলা, মুছে ফেলা, সংরক্ষণ করা রেকর্ডগুলি মূল নামে ফিরিয়ে রাখা এবং তারপরে সূচকগুলি পুনরুদ্ধার করা দ্রুততর হয় ।
আন্তন ক্রোগলভ

1
একবার আপনি এই স্পিডটি সাফ করার পরে, আমি 100 মিটারের চেয়ে অনেক ছোট ব্যাচগুলির পরামর্শ দিই, আমি সাধারণত 100 কে থেকে 1 মি করে করি। এছাড়াও, যদি সম্ভব হয় তবে মুছে ফেলার জন্য রেকর্ডগুলি নির্বাচন করতে আপনার প্রারম্ভিক কীটি আপনার WHERE ধারা হিসাবে ব্যবহার করুন।
ব্র্যাডিসি

বিপুল পরিমাণে ডেটা মুছতে এবং লগ সমস্যা এড়াতে চেষ্টা করার সময় কাটা কাটা আপনার বন্ধু।
জেফ.ক্লার্ক 18

উত্তর:


14

সবার আগে, লগের জন্য এটি সর্বাধিক আকারের হয় কিনা তা দেখতে এসকিউএল ত্রুটিটি পরীক্ষা করে দেখুন। যদি এটি হয়ে থাকে, তবে ক্যোয়ারির সমাপ্তির কোনও আশা নেই, এটি সম্ভবত ইতিমধ্যে রোলব্যাক অবস্থায় রয়েছে।

যদি তা হয় তবে আমি সর্বদা ম্যানুয়ালি স্পিডটি মেরে ফেলতে পছন্দ করি (স্পাইড ব্যবহার করতে sp_who2বা সন্ধান sp_WhoIsActiveকরতে, তবে একটি kill 59বা যা কিছু করুন)। আপনি সুস্পষ্ট কিল না করা পর্যন্ত আপনি রোলব্যাকের স্থিতিও পরীক্ষা করতে পারবেন না, এই সম্পর্কিত থ্রেডটি দেখুন

যেহেতু এটি একটি মুছে ফেলা, এবং কোনও আপডেট বা সন্নিবেশ নয়, আপনি খুব ভাগ্যবান হতে পারেন এবং দেখতে পাবেন যে এটি অবিলম্বে ফিরে আসে। যদি তা না হয়, তবে এই পয়েন্টে পৌঁছাতে যেমন পিছনে যেতে পেরেছিল ততক্ষণে (বা আরও বেশি) সময় লাগতে পারে।

রোলব্যাকের অবস্থা দেখতে, ব্যবহার করুন

kill 59 with statusonly

দুর্ভাগ্যক্রমে, আমি এটি প্রায়শই পেয়েছি যে দরকারী কিছু দেখায় না, কেবল "0% সম্পূর্ণ"। sp_who2সেক্ষেত্রে আপনাকে আইও এবং সিপিইউ ব্যবহার করতে হবে এবং দেখতে হবে এটি এখনও কিছু করছে কিনা তা দেখতে।

রিবুট সম্পর্কে, এটি মারাত্মক ঝুঁকি। স্পিডটি যদি সক্রিয়ভাবে পিছনে ঘুরছে (সিপিইউ এবং আইও পরিবর্তন হচ্ছে), তবে এসকিউএল পুনরায় চালু করা রোলব্যাক সম্পূর্ণভাবে শেষ না হওয়া অবধি পুরোপুরি অফলাইনে ডাটাবেস নেবে (ঘন্টা এবং ঘন্টা)। তবে , যদি সিপিইউ এবং আইও চলমান না থাকে তবে এটি বাস্তবে এখুনি এটি পরিষ্কার করে দিতে পারে। যেভাবেই হোক না কেন, এটি ঝুঁকিপূর্ণ।

একটি চূড়ান্ত বিকল্প, যদি বিষয়গুলি বিশেষত মারাত্মক হয়: যদি মুছুন শুরু করার ঠিক আগে থেকেই আপনার যদি ব্যাকআপ থাকে (এবং ডিবিতে অন্য কোনও আপডেট হয় নি) , তবে পুনরুদ্ধার করার দ্রুততম উপায়টি কেবল ডিবি ছেড়ে যাওয়া, পুনরায় চালু করা হতে পারে এসকিউএল এবং ব্যাকআপ থেকে পুনরুদ্ধার করুন।

আপনি যদি ডিবি ছাড়তে না পারেন (বা যদি আপনি ইতিমধ্যে পুনরায় সূচনাটি শুরু করেন এবং স্কেল ত্রুটিটি 24 ঘন্টা পুনরুদ্ধারের সময়ের পূর্বাভাস দিচ্ছে), তবে এসকিউএল পরিষেবাগুলি বন্ধ করে দিন, এমডিএফ এবং এলডিএফ ফাইলগুলি ডিস্ক থেকে মুছে ফেলুন, এসকিউএল শুরু করুন, ছেড়ে দিন (ভূত) ডাটাবেস, এবং ব্যাকআপ থেকে পুনরুদ্ধার।

স্পষ্টতই আপনি কেবল চেষ্টা করতেন যে এটি যদি ব্যাক-এন্ড প্রসেসিং ডাটাবেস হয় যা ব্যবহারকারীরা ইন্টারঅ্যাক্ট করেনি।


3
পুনঃস্থাপন বিকল্প সম্পর্কে ভাল পরামর্শ। নরক হিসাবে ভীতিজনক, কিন্তু এখনও ভাল পরামর্শ।
সর্বোচ্চ ভেরনন

2
হ্যাঁ, এই শর্তে আমাদের একটি ডিবিএ পুনরায় চালু হয়েছিল, যা আমাদের দুটি খুব খারাপ বিকল্পের মধ্যে সিদ্ধান্ত নিতে বাধ্য করেছিল: 18-24 ঘন্টা নীচে থাকুন, বা কোয়েরিটি শুরু হওয়ার আগেই আবার গড়িয়ে দিয়ে ডেটা হারাতে হবে। ব্যবসায়টি ফিরে যেতে বেছে নিয়েছে।
ব্র্যাডসি

1
4 ই মার্চ থেকে আমাদের একটি সম্পূর্ণ ব্যাকআপ রয়েছে যা আমরা যদি রিবুটটি কাজ না করে তবে আমরা একটি সর্বশেষ উপায় হিসাবে পুনরুদ্ধার করব। ভাগ্যক্রমে এটি একটি স্থিতিশীল পর্যাপ্ত ডিবি যা আমরা কেবল ছাঁটাই করতে চাইছিলাম। প্রতিক্রিয়াটির জন্য ধন্যবাদ, খুব সহায়ক
গ্রীম

4
@ গ্র্যাম - এফওয়াইআই - 1.2 বিলিয়ন সারি মুছে ফেলার চেষ্টা করার পরিবর্তে, টেবিলের কাঠামোর একটি অনুলিপি তৈরি করুন, আপনি যে সারিগুলি নতুন টেবিলের মধ্যে রাখতে চান তা অনুলিপি করুন, তারপরে পুরানো সারণীটি ফেলে দিন। এটি কীভাবে করবেন তা জিজ্ঞাসা করে আপনি যদি একটি নতুন প্রশ্ন যুক্ত করেন তবে আমি আপনাকে একটি খুব চটজলদি উপায় দেখাতে পারি যা 1.2 বিলিয়ন সারিগুলি মোছার চেয়ে অনেক দ্রুত।
ম্যাক্স ভার্নন

আমার উত্তর ধরে নেওয়া হয়েছে যে ডিবি সিম্পল পুনরুদ্ধার মোডে রয়েছে। যদি এটি সম্পূর্ণ মোডে থাকে তবে আপনাকে বিশাল ট্রান লগ ব্যাকআপগুলিও পরিচালনা করতে হবে।
ব্র্যাডিসি 8:48

8

এসকিউএল সার্ভার পুনরায় শুরু করবেন না। এটি কেবলমাত্র আপনার যন্ত্রণাকে দীর্ঘায়িত করবে যেহেতু পুনরুদ্ধার হবে, যা আপনার মোছা সহ পুরোপুরি সম্পন্ন না হওয়া কোনও লেনদেনকে রোলব্যাক করবে বা পুনরায় করবে।

মুছে ফেলা চলমান সেশনটি মেরে ফেলার ফলস্বরূপ রোলব্যাক ঘটবে, যা সম্পূর্ণ হতে অনেক দিন সময়ও নেবে।

অপারেশনের অবস্থাটি দেখতে আপনি নীচের ক্যোয়ারীর দিকে নজর রাখতে চান:

SELECT des.session_id 
    , des.host_name
    , des.login_name
    , der.command
    , der.estimated_completion_time
    , der.blocking_session_id
    , der.last_wait_type
    , der.percent_complete
    , der.start_time
    , der.status
    , der.wait_resource
    , der.wait_type
    , der.wait_time
FROM sys.dm_exec_sessions des
    INNER JOIN sys.dm_exec_requests der ON des.session_id = der.session_id
WHERE des.session_id <> @@SPID
    AND des.is_user_process = 1
ORDER BY des.session_id;

percent_completeকলাম, এবং যেমন ঐ যে এর উপর নির্ভর, estimated_completion_time, কেবলমাত্র নিচের অপারেশনের জন্য জনবহুল করা হয়:

ALTER INDEX REORGANIZE
AUTO_SHRINK option with ALTER DATABASE
BACKUP DATABASE
DBCC CHECKDB
DBCC CHECKFILEGROUP
DBCC CHECKTABLE
DBCC INDEXDEFRAG
DBCC SHRINKDATABASE
DBCC SHRINKFILE
RECOVERY
RESTORE DATABASE
ROLLBACK
TDE ENCRYPTION

সুতরাং আপনি কেবলমাত্র সেই কলামটি সার্থক দেখতে পাবেন যদি আপনি ইতিমধ্যে মুছার বিবৃতিটি বাতিল করে দিয়ে থাকেন এবং এটি আবার ঘূর্ণায়মান হয় বা আপনি যদি ইতিমধ্যে এসকিউএল সার্ভারটি পুনরায় চালু করে থাকেন এবং এটি পুনরুদ্ধারে আসে।

যদি blocking_session_idকলামটিতে একটি নম্বর থাকে তবে এটি নির্দেশ করে যে অন্যান্য সেশনটি মোছার অপারেশনটিকে অবরুদ্ধ করছে। যদি সেই অধিবেশনটি মুছে ফেলা অপারেশনটিকে এটি শুরু করার পরে অবরুদ্ধ করে চলেছে তবে আপনি কোনও রোলব্যাক করার প্রয়োজন ছাড়াই অপারেশনটি বাতিল করতে পারবেন।


ভাল প্রশ্ন, তবে এটি মুছতে বাধা দেওয়া থাকলে লগটি বিশাল আকার ধারণ করত বলে মনে হয় না pretty
ব্র্যাডিসি

4
হ্যাঁ. আমি কেবল আউটপুটটি সামান্য ব্যাখ্যা করার চেষ্টা করছি। ভবিষ্যতের পাঠকরাও এটি দেখতে পাবেন। প্রকৃতপক্ষে, আমি সন্দেহ করি যে আমরা পরবর্তী সময়ের মধ্যে ওপি থেকে শুনব কিনা। তিনি সম্ভবত বেশ ব্যস্ত।
ম্যাক্স ভার্নন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.