का --single-transactionविकल्प बैकअप कार्य शुरू करने से पहले mysqldump करता है लेकिन केवल कुछ शर्तों के तहत। उन शर्तों में से एक है जब आप भी निर्दिष्ट करते हैंFLUSH TABLES WITH READ LOCK--master-data विकल्प ।
स्रोत कोड में, mysql-5.6.19/client/mysqldump.cपंक्ति 5797 से:
if ((opt_lock_all_tables || opt_master_data ||
(opt_single_transaction && flush_logs)) &&
do_flush_tables_read_lock(mysql))
goto err;
दोहराए जाने वाले लेन-देन को शुरू करने से पहले, सटीक बिनलॉग निर्देशांक पर एक ठोस लॉक प्राप्त करने के लिए, झूठ --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, या एक बीमार-सलाह क्वेरी, या एक खराब-लिखित निगरानी प्रक्रिया एक तालिका को फ्लश करने की कोशिश की।
उस प्रश्न को बाद में एक अज्ञात तंत्र द्वारा मार दिया गया या समाप्त कर दिया गया, लेकिन इसके बाद के प्रभाव तक तक सीमित रहे 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मुद्दे से संबंधित नहीं होना चाहिए , क्योंकि यह लेनदेन स्पष्ट रूप से कोई ताले नहीं रखता है।