का --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
मुद्दे से संबंधित नहीं होना चाहिए , क्योंकि यह लेनदेन स्पष्ट रूप से कोई ताले नहीं रखता है।