MySQL प्रतिकृति: 'प्राथमिक कुंजी के लिए डुप्लिकेट प्रविष्टि'


9

क्या आप मुझे यह समझने में मदद कर सकते हैं कि मुझे एक पूर्ण पुनः-सिंक के बाद एक दास सर्वर पर 'प्राथमिक कुंजी के लिए डुप्लिकेट प्रविष्टि' क्यों मिल रही है।

मूल रूप से 'mysqldump' लगभग पूरी रात चल रहा था और फिर पुनर्स्थापना प्रक्रिया में कुछ घंटों का समय लगा, इसलिए जब मैंने दास शुरू किया है तो यह मास्टर के पीछे ~ 63874 सेकंड था।

गुलाम सर्वर केवल पढ़ा जाता है (read_only) और फिर से सिंक प्रक्रिया के दौरान कोई भी लिखना नहीं था इसलिए मुझे समझ में नहीं आता है कि डुप्लिकेट कीज़ क्यों हैं।

बाइनरी लॉग प्रारूप मास्टर पर MIXED पर सेट है।

DB बैकअप करने के लिए उपयोग किया जाने वाला कमांड:

mysqldump --opt --single-transaction -Q --master-data=2 db | bzip2 -cz > db.sql.bz2

गुलाम निम्नलिखित विकल्पों के साथ मास्टर (db -> db_backup) से केवल एक डेटाबेस की नकल कर रहा है:

replicate-wild-do-table = db_backup.%
replicate-rewrite-db = db->db_backup

जवाबों:


11

ASPECT # 1: प्रतिकृति

मुझे ऐसा नहीं लगता

replicate-wild-do-table = db_backup.%
replicate-rewrite-db = db->db_backup

एक साथ हैं।

अन्य लोगों ने भी इस बारे में सोचा है

आदेश प्रतिकृति नियमों से समस्या उपजी है। प्रतिकृति नियमों पर MySQL प्रलेखन के अनुसार :

यदि कोई --replicate-rewrite-db विकल्प निर्दिष्ट किए गए थे, तो उन्हें --replicate- * फ़िल्टरिंग नियमों से पहले लागू किया जाता है।

यहां तक ​​कि दोहराने-फिर से लिखने पर भी MySQL प्रलेखन कहते हैं:

डेटाबेस नाम का अनुवाद --replicate- * नियमों से पहले किया जाता है।

replicate-wild-do-tableफिर से लिखने के बाद लागू की जाती है। यह आश्चर्य की बात नहीं होगी अगर यह आदेश किसी भी तरह एक INSERT को एक तालिका में लगाए, जिसमें पहले से ही डेटा है।

आप शायद पूछ रहे हैं कि डेटा वहां कैसे पहुंचा?

ASPECT # 2: mysqldump

ऐसा mysqldump --single-transactionलगता है कि डेटा के समय-समय पर डंप करने का सबसे बड़ा तरीका है। दुर्भाग्य से, mysqldump --single-transactionएक अकिलीज़ हील है ALTER TABLE:। एक मेज किसी भी के अधीन है, तो ALTER TABLEइस तरह के एक के रूप में आदेश, DROP TABLEऔर CREATE TABLE, कि लेनदेन mysqldump में डंप करने के लिए कोशिश कर रहा था की अखंडता को तोड़ सकते हैं। एक मेज (जो MySQL ब्रह्मांड में DDL है) छोटा किया जा रहा है और छोड़ने और सूचियों को जोड़ने कर सकते हैं विघटनकारी भी हो।

आप MySQL Performance Blog के Best रखे MySQLDump Secret से इस बारे में अधिक जानकारी प्राप्त कर सकते हैं । मैंने वास्तव में 12 कमांड का वर्णन करते हुए एक पिछले प्रश्न में इस बिंदु को संबोधित किया था जो कि mysqldump के लेनदेन की अखंडता को तोड़ सकता है: MySQL बैकअप IoDB

चेतावनी

उपसंहार

एक या दोनों पहलुओं ने mysqldump के दौरान एक पंक्ति को खिसकाने में योगदान दिया हो सकता है जो कि या तो फिर से लिखे गए नियमों या mysqldump के अलगाव से वंचित होने के कारण अस्तित्व में नहीं होना चाहिए।

सुझाव

मैं सभी INSERTs को देखने के लिए mysqldump की शुरुआत के बाद से सभी रिले लॉग का एक mysqlbinlog डंप करूंगा कि दास प्रक्रिया करेगा और यह देखेगा कि क्या उन पंक्तियों पहले से ही दास पर मौजूद हैं। यदि वे करते हैं, तो आप शायद दो काम कर सकते हैं:

1: सभी डुप्लिकेट कुंजी त्रुटियों को छोड़ दें

बस इसे गुलाम पर my.cnf में जोड़ें

[mysqld]
slave-skip-errors=1062
skip-slave-start

और mysql को पुनरारंभ करें। फिर भागोSTART SLAVE;

सभी डुप्लिकेट-कुंजी त्रुटियां बायपास हो जाएंगी। जब Seconds_Behind_Master0 हो जाता है, तो उन पंक्तियों को हटा दें और mysql को पुनरारंभ करें।

2: पर्कोना उपकरण डाउनलोड करें

आपके लिए आवश्यक उपकरण हैं

दास में अंतर खोजने के लिए इनका उपयोग करें, और फिर उन्हें सही करें


0

कोड में क्वेरी डालने की जाँच करें जो सीधे दास में सम्मिलित करता है। हम केवल दास से पढ़ सकते हैं। लिखें प्रश्नों को मास्टर करने के लिए निर्देशित किया जाना चाहिए।


प्रश्न पर वापस देखें। स्लेव केवल-पढ़ने के लिए है और रेसक्यू के दौरान कोई लिखता नहीं है।
रोलैंडमाइसीडीडीबीए
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.