উত্তর:
যদি একটি ইনোডিবি টেবিলটি SELECT বা DML (INSERT, UPDATE, DELETE) এর মাধ্যমে একেবারে অ্যাক্সেস করা হয়ে থাকে তবে আপনার ঠিক একটি মেটাডেটা লক আশা করা উচিত।
মেটাডেটা লকিংয়ের মাইএসকিউএল ডকুমেন্টেশন অনুসারে :
লেনদেনের সিরিয়ালাইজিবিলিটি নিশ্চিত করার জন্য, সার্ভারকে অবশ্যই একটি সেশনে কোনও টেবিলে ডেটা ডেফিনিশন ল্যাঙ্গুয়েজ (ডিডিএল) বিবরণী সঞ্চালনের অনুমতি দিতে হবে না যা অন্য সেশনে একটি অপূর্ণিত লেনদেনে ব্যবহৃত হয়। কোনও লেনদেনের মধ্যে ব্যবহৃত টেবিলগুলিতে মেটাডেটা লকগুলি অর্জন করে এবং লেনদেন শেষ না হওয়া অবধি এই লকগুলির মুলতবি স্থগিত করে সার্ভার এটি অর্জন করে। কোনও টেবিলের একটি মেটাডেটা লক টেবিলের কাঠামোর পরিবর্তনে বাধা দেয়। এই লকিং পদ্ধতির অন্তর্ভুক্ত রয়েছে যে কোনও সারণীর মধ্যে লেনদেন দ্বারা ব্যবহৃত একটি টেবিল লেনদেন শেষ না হওয়া অবধি অন্য সেশনের দ্বারা ডিডিএল স্টেটমেন্টে ব্যবহার করা যাবে না।
বলা হচ্ছে, অন্য ডিবি অধিবেশন টেবিলে তালা ঝুলছে কিনা তা আপনার নির্ধারণ করা উচিত। যদি এই জাতীয় অধিবেশনটি একটি অপূর্ণবিহিত লেনদেন হয় তবে সেখানেই হোল্ড আপ থাকতে পারে।
আপনি কেবল ফিরে দ্রুত diskspace প্রয়োজন হয়, আপনি চালাতে পারে TRUNCATE TABLE
।
টেবিলটিকে নিম্নে নামানোর চেষ্টা করার আগে এর নামকরণের চেষ্টা করুন:
ALTER TABLE mydb.mytable RENAME mydb.mytabletodrop;
TRUNCATE TABLE mydb.mytabletodrop;
DROP TABLE mydb.mytabletodrop;
foo
। একবার এই সমস্ত সংযোগগুলি হয়ে গেলে, তারপর ALTER TABLE
এগিয়ে যেতে পারে।
কোন ক্যোয়ারী কার্যকর করে একটি লেনদেন লক তৈরি করে তা আপনার খুঁজে পাওয়া উচিত:
SHOW ENGINE INNODB STATUS
এবং একটি বিভাগ দেখুন TRANSACTION
। পরবর্তীতে আপনার একটি ক্যোয়ারীটি ডেটাবেস ছাড়ার জন্য হত্যা করা উচিত।
তথ্যসূত্র: আমি কীভাবে খুঁজে পাব যে কোনও লেনদেনের ফলে "টেবিল মেটাডেটা লকের অপেক্ষা করা হচ্ছে"?
foo
পুনরায় নামকরণে "টেবিল মেটাডেটা লকের অপেক্ষা করছি" পেয়েছিfootodrop