--single-transactionবিকল্প mysqldump আছে একটি FLUSH TABLES WITH READ LOCKব্যাকআপ কাজ শুরু করার পূর্বে কিন্তু শুধুমাত্র কিছু অবস্থার অধীনে। এই বিকল্পগুলির মধ্যে একটি হ'ল আপনি যখন --master-dataবিকল্পটিও নির্দিষ্ট করেন ।
mysql-5.6.19/client/mysqldump.c5797 লাইনে সোর্স কোডে :
if ((opt_lock_all_tables || opt_master_data ||
(opt_single_transaction && flush_logs)) &&
do_flush_tables_read_lock(mysql))
goto err;
পুনরাবৃত্তযোগ্য-পঠন লেনদেন শুরু করার আগে সুনির্দিষ্ট বিনলগ স্থানাঙ্কের উপর একটি দৃ lock় লক পাওয়ার জন্য, --master-dataবিকল্পটি এই লকটি পাওয়ার জন্য ট্রিগার করে এবং তারপরে বিনলগের স্থানাঙ্কগুলি পাওয়ার পরে মুক্তি দেওয়া হয়।
আসলে, mysqldumpএকটি FLUSH TABLESঅনুসরণ করে FLUSH TABLES WITH READ LOCKকারণ দুটি জিনিসই প্রাথমিক প্রবাহে কিছুটা সময় নেয় এমন ক্ষেত্রে রিড লকটি দ্রুত পাওয়া যায়।
...যাহোক...
এটি বিনলগ স্থানাঙ্কগুলি পাওয়ার সাথে সাথেই mysqldumpএকটি UNLOCK TABLESবিবৃতি জারি করে , সুতরাং আপনি যে ফ্লাশ শুরু করেছিলেন তার ফলস্বরূপ কোনও অবরুদ্ধ হওয়া উচিত নয়। উভয়ই থ্রেড হ'ল Waiting for table flushলেনদেনের ফলস্বরূপ হওয়া উচিত নয় mysqldump।
আপনি যখন Waiting for table flushরাজ্যে কোনও থ্রেড দেখেন , তার অর্থ এই হওয়া উচিত যে FLUSH TABLES [WITH READ LOCK]বিবৃতিটি জারি করা হয়েছিল এবং ক্যোয়ারি শুরু হওয়ার পরে এখনও চলছে - সুতরাং ক্যোয়ারিকে কার্যকর করার আগে টেবিল ফ্লাশের জন্য অপেক্ষা করতে হবে। আপনার পোস্ট করা প্রসেসলিস্টের ক্ষেত্রে, mysqldumpএই একই টেবিলটি থেকে পড়া হচ্ছে এবং কোয়েরিটি কিছুক্ষণ চলছিল, তবুও ব্লক করা অনুসন্ধানগুলি এত দিন ধরে অবরুদ্ধ ছিল না।
এগুলি থেকে বোঝা যায় যে অন্য কিছু ঘটেছে।
অভ্যন্তরীণভাবে কাজ করার উপায়টি বাগ # 44884 -এ একটি দীর্ঘস্থায়ী সমস্যা রয়েছে FLUSH TABLES। সমস্যাটি যদি এখনও অব্যাহত থাকে তবে আমি অবাক হব না, এই সমস্যাটি যদি কখনও "স্থির" হয় তবে আমি অবাক হব কারণ এটি সমাধান করা খুব জটিল সমস্যা - উচ্চতর সংমিশ্রিত পরিবেশে সত্যিকার অর্থে সমাধান করা কার্যত অসম্ভব - এবং যে কোনও প্রচেষ্টা এটিকে ঠিক করে তোলা অন্য কিছু ভাঙার, বা নতুন, আলাদা এবং এখনও অনাকাঙ্ক্ষিত, আচরণ তৈরির তাৎপর্যপূর্ণ ঝুঁকি বহন করে।
মনে হচ্ছে এটি আপনি যা দেখছেন তার ব্যাখ্যা হবে।
বিশেষ করে:
যদি আপনার কোনও টেবিলের বিপরীতে একটি দীর্ঘ-চলমান ক্যোয়ারী থাকে এবং ইস্যু করে FLUSH TABLES, তবে FLUSH TABLESদীর্ঘ-চলমান ক্যোয়ারী শেষ না হওয়া অবধি ব্লক হয়ে যাবে।
তদ্ব্যতীত, FLUSH TABLESজারির পরে শুরু হওয়া যে কোনও প্রশ্ন FLUSH TABLESসম্পূর্ণ না হওয়া পর্যন্ত অবরুদ্ধ হবে ।
তদ্ব্যতীত, আপনি যদি FLUSH TABLESক্যোয়ারীটি হত্যা করেন তবে যে প্রশ্নগুলি অবরুদ্ধ করা হচ্ছে সেগুলি এখনও মূল দীর্ঘকালীন ক্যোয়ারিতে অবরুদ্ধ থাকবে, যেটি FLUSH TABLESক্যোয়ারীটি ব্লক করে যাচ্ছিল , কারণ নিহত FLUSH TABLESকোয়েরিটি শেষ না হলেও , সেই টেবিলটি (একটি, বা আরও, দীর্ঘমেয়াদী ক্যোয়ারির সাথে জড়িত) এখনও ফ্লাশ হওয়ার প্রক্রিয়াতে রয়েছে এবং দীর্ঘস্থায়ী ক্যোয়ারী শেষ হওয়ার সাথে সাথে এই মুলতুবি ফ্লাশটি ঘটতে চলেছে - তবে এর আগে নয়।
এখানে সম্ভবত উপসংহারটি হ'ল অন্য প্রক্রিয়া - সম্ভবত অন্য একটি মাইসকিলডাম্প, বা একটি অসৎ পরামর্শযুক্ত ক্যোয়ারী, বা একটি দুর্বল-লিখিত পর্যবেক্ষণ প্রক্রিয়া একটি টেবিল ফ্লাশ করার চেষ্টা করেছে।
পরবর্তী সময়ে কোনও অজানা প্রক্রিয়া দ্বারা এই জিজ্ঞাসাটি হত্যা করা হয়েছিল বা সময়সীমা নির্ধারণ করা হয়েছিল, তবে এর প্রতিক্রিয়াগুলি প্রশ্নযুক্ত mysqldumpটেবিল থেকে পড়া শেষ না হওয়া পর্যন্ত দীর্ঘস্থায়ী ছিল ।
FLUSH TABLESদীর্ঘ-চলমান ক্যোয়ারী প্রক্রিয়া চলাকালীন চেষ্টা করে আপনি এই অবস্থার প্রতিলিপি করতে পারেন । তারপরে আর একটি ক্যোয়ারী শুরু করুন, যা ব্লক হয়ে যাবে। তারপরে FLUSH TABLESক্যোয়ারীটি মেরে ফেলুন, এটি সর্বশেষ কোয়েরিটিকে অবরুদ্ধ করবে না। তারপরে প্রথম ক্যোয়ারীটি মেরে ফেলুন বা শেষ করুন এবং চূড়ান্ত ক্যোয়ারীটি সফলভাবে চলবে।
অনাগ্রহিত হিসাবে, এটি সম্পর্কিত নয়:
Trx read view will not see trx with id >= 1252538405, sees < 1252538391
এটি সাধারণ, কারণ mysqldump --single-transactionসমস্যাগুলি এ START TRANSACTION WITH CONSISTENT SNAPSHOT, যা ডাম্পের প্রক্রিয়া চলাকালীন পরিবর্তিত হওয়া ডেটা ডাম্পিং থেকে বাধা দেয়। এটি ছাড়া, শুরুতে প্রাপ্ত বিনলগ স্থানাঙ্কগুলি অর্থহীন হবে, যেহেতু --single-transactionএটি দাবি করবে না। এটি কোনওভাবেই Waiting for table flushসমস্যার সাথে সম্পর্কিত হওয়া উচিত নয় , কারণ এই লেনদেনটিতে স্পষ্টত কোনও লক থাকে না holds