MySQL त्रुटि 1062 का क्या कारण है - दास शुरू करते समय डुप्लिकेट प्रविष्टि?


11
  • MySQL मास्टर संस्करण: 5.5.16-1
  • MySQL गुलाम संस्करण: 5.5.18-1

मास्टर का स्नैपशॉट इसके द्वारा बनाया गया है:

mysql> FLUSH TABLES WITH READ LOCK;
shell> mysqldump --all-databases --master-data > dbname_`date +%F`.sql

यह डंप फ़ाइल --skip-slave-startग़लती से आयात की जाती है (जिसे विकल्प के साथ शुरू किया गया है)

shell> pv dbname_`date +%F`.sql | mysql -u root -p

लेकिन मुझे निम्नलिखित त्रुटि मिली जब निष्पादित mysql> start slave;:

    Last_SQL_Errno: 1062
    Last_SQL_Error: Error 'Duplicate entry '115846' for key
'PRIMARY'' on query. Default database: 'db'. Query: 'INSERT INTO
request_posted (id, user_id, channel, message, link, picture, name, ...

मास्टर पर आईडी 115846 के साथ केवल एक रिकॉर्ड है:

mysql> select count(*) from request_posted where id=115846;
Current database: db

+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.01 sec)

कुछ प्रश्नों को छोड़ने की कोशिश करें:

mysql> STOP SLAVE; 
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 
mysql> START SLAVE;

मदद नहीं की। मैं उन त्रुटियों को जोड़कर छोड़ना नहीं चाहता:

slave-skip-errors = 1062

करने के लिए my.cnfफ़ाइल क्योंकि यह दास असंगत ला सकते हैं।

इस त्रुटि का कारण क्या हो सकता है?


अपडेट करें

यह नहीं है कि मैं आमतौर पर mySQL प्रतिकृति कैसे सेट करता हूं

आपको लगता है कि कौन से कदम मुझे दस्तावेज़ का पालन नहीं करते हैं?

मुझे आश्चर्य है कि अगर आप एक ही समस्या का सामना करेंगे, यदि आप पूरे कॉन्फ़िगरेशन को सेटअप करने के बजाय थे जो कि mysqldump कमांड को पास कर रहे थे।

नहीं, यह सामान्य रूप से काम करता है अगर मैं भी मास्टर को संबंधित निर्देशांक में बदलता हूं।

मैं दास पर डेटाबेस को छोड़ने की कोशिश करूँगा, सुनिश्चित करें कि बिनलॉग स्पष्ट हैं, और फिर से शुरू करें। अनुक्रमणिका में त्रुटियाँ नहीं होने का आश्वासन देने के लिए मास्टर पर विचाराधीन तालिका भी देखें।

क्या डिलीट (मूव) सभी डेटादिर के लिए पर्याप्त है? मैंने ऐसा ही किया और वही नतीजा मिला।


@Dmytro Leonenko को जवाब दें

दास को 'दास की स्थिति दिखाओ' यह सुनिश्चित करने के लिए कि वह ठीक से कॉन्फ़िगर किया गया है, MASTER_LOG_POS 0 है

आयात के बाद केवल 'गुलाम प्रतिमा' दिखाएँ 'लेकिन' गुलाम शुरू करें? ' हमें जवाब दे सकते हैं

मैंने डेटादिर का समर्थन किया, सभी हटाएं और चलाएं mysql_install_db, डंप फ़ाइल आयात करें, निष्पादित करें change master toऔर यहां परिणाम देखें:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: x.x.x.x
                  Master_User: xx
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: 
          Read_Master_Log_Pos: 4
               Relay_Log_File: mysqld-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: 
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 0
              Relay_Log_Space: 106
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
1 row in set (0.00 sec)

मैं सोच रहा हूँ क्यों Master_Log_Pos 4 है?


1
उस आईडी के साथ केवल एक रिकॉर्ड हो सकता है, इसलिए त्रुटि, यह कभी नहीं लिखा जाएगा। जब आप जारी करते हैं तो SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1क्या क्वेरी कम से कम त्रुटि में बदलाव का कारण बनती है? क्या गुलाम बिनलॉग स्थिति सेटअप सही था?
14

हर बार जब मैं काउंटर छोड़ता हूं, तो यह दूसरी आईडी में बदल जाता है। --master-dataविकल्प पहले से ही डंप फ़ाइल के लिए द्विआधारी लॉग निर्देशांक लिख रहा है। मुझे केवल मास्टर को मास्टर_होस्ट, मास्टर_युसर, मास्टर_पासवर्ड में बदलना होगा।
क्वांटा

यह नहीं है कि मैं आमतौर पर mySQL प्रतिकृति कैसे सेट करता हूं (मैं आमतौर पर प्रति URL यहां सेटअप प्रतिकृति: dev.mysql.com/doc/refman/5.0/en/replication-howto.html ) हालांकि, mysqldump विकल्पों के माध्यम से पढ़ना, कोई कारण नहीं है यह काम क्यों नहीं करना चाहिए। मुझे आश्चर्य है कि अगर आप एक ही समस्या का सामना करेंगे, यदि आप पूरे कॉन्फ़िगरेशन को सेटअप करने के बजाय थे जो कि mysqldump कमांड को पास कर रहे थे।
Rilindo

क्या आपका मतलब है कि --master-dataडेटा स्नैपशॉट बनाते समय मुझे विकल्प का उपयोग नहीं करना चाहिए ? यदि यह तब भी होता है जब मैं --lock-all-tablesविकल्प का उपयोग करता हूं और change master to master_log_file='', master_log_pos='', ..., इसके कारण क्या हो सकते हैं?
क्वांटा

नहीं, यह मैं नहीं कह रहा हूं। जैसा कि मैंने कहा था, आपने जो काम किया है, उसका उद्देश्य होना चाहिए - जहां तक ​​मैं देख सकता हूं, उस विकल्प के साथ कोई मौजूदा बग नहीं है। हालाँकि, इसका यह अर्थ नहीं है कि अलगाव कदम के रूप में, मैं उस URL के माध्यम से पहले mySQL द्वारा प्रदान किए गए सम्मेलन का पालन करूंगा। टी। यदि वह काम करता है, तो कम से कम आपके पास समस्या निवारण शुरू करने की दिशा है। यदि ऐसा नहीं है, तो ठीक है, हमारे पास एक अलग समस्या है। :)
Rilindo

जवाबों:


7

अपनी समस्या को ठीक करने के लिए क्या प्रयास करें:

  1. आपको पहले गुलाम पर master.info निकालना चाहिए और mysql को पुनरारंभ करना चाहिए
  2. जारी करें MASTER_HOST = 'XX.XX.XX.XX', MASTER_USER = 'उत्तर', MASTER_PASSWORD = 'दास' के लिए मास्टर बदलें;
  3. मास्टर पर '--flush- लॉग' विकल्प के साथ mysqldump करते हैं
  4. 'mysql -u user -p <दास.sql' गुलाम पर
  5. दास को 'दास की स्थिति दिखाओ' यह सुनिश्चित करने के लिए कि वह ठीक से कॉन्फ़िगर किया गया है, MASTER_LOG_POS 0 है
  6. 'गुलाम शुरू करो?' दास पर।

क्या जाँच करें:

  • Binlog प्रारूप: MIXED
  • server_ids मास्टर और दास पर भिन्न होते हैं

संपूर्ण परिवर्तन मास्टर स्ट्रिंग जारी करना (लॉग नाम और स्थिति संख्या सहित) वास्तव में इसे ठीक करता है, लेकिन इस बिंदु पर, मुझे लगता है कि कोर सवाल यही है कि क्वांटा को लॉग-नाम और स्थिति संख्या को फिर से दर्ज करना होगा जब वह पहले से ही अंदर है डंप फ़ाइल।
रिलिंडो

आयात के बाद केवल 'गुलाम प्रतिमा' दिखाएँ 'लेकिन' गुलाम शुरू करें? ' हमें जवाब दे सकते हैं
Dmytro Leonenko

मेरे मूल पोस्ट में अनुरोधित जानकारी संलग्न की।
क्वांटा

आपने "Master_Host: xxxx Master_User: xx" को "CHANGE MASTER ..." जारी किए बिना कैसे समाप्त किया। या आपने अभी इसका उत्तर नहीं दिया है? क्या आपने बिनलॉग प्रारूप की जाँच की है और mysqldump के लिए कमांड लाइन क्या थी?
दिमित्रो लियोनेंको

मैंने पहले ही उल्लेख किया है कि मेरी पोस्ट में " डंप फ़ाइल आयात करें, निष्पादित करेंchange master to "। मैं MIXED- आधारित लॉगिंग का उपयोग कर रहा हूं। मैंने MySQL 5.0.77 (स्टेटमेंट-आधारित) के साथ परीक्षण किया है, यह भी इस त्रुटि का कारण बनता है। पूर्ण mysqldump हैmysqldump -u root -p --all-databases --master-data --flush-logs > alldb_$(date +%F).sql
मात्रा

2

समस्या मास्टर को रनिंग प्रोडक्शन सर्वर पर स्थापित करने से होती है क्योंकि डंप कर रहा है (जहां तक ​​मैं बता सकता हूं)। तो, मास्टर_लॉग में लिखे गए प्रश्न हैं जो पहले से ही दास पर रहने वाले डेटा पर निष्पादित किए गए हैं। मैंने वास्तव में mysql वेबसाइट या मेलिंग सूची पर कोई समाधान नहीं देखा। तो, मैं निम्नलिखित समाधान के साथ आया था जिसने मेरी समस्या को हल किया।

दास पर:

mysql> STOP SLAVE;
mysql> FLUSH PRIVILEGES;  # dump likly included users too

गुरु पर:

mysql> RESET MASTER;

दास पर:

mysql> RESET SLAVE;
mysql> START SLAVE;

वैसे, मैंने अपने डंप को गुलाम पर निम्न के साथ चलाया:

mysqldump -uROOTUSER -pROOTPASSWORD -hMYSQLMASTER.EXAMPLE.COM --all-databases --delete-master-logs | mysql -uROOTUSER -pROOTPASSWORD

मैं उम्मीद करता हूं कि इससे किसी की मदद होगी।

http://dev.mysql.com/doc/refman/5.0/en/reset-master.html

http://dev.mysql.com/doc/refman/5.0/en/reset-slave.html


FLUSH PRIVILEGES को शामिल करने के लिए संपादित किया गया; मुझे एक और त्रुटि के बाद एहसास हुआ कि मेरे उपयोगकर्ताओं को भी डंप के साथ आयात किया गया था, उनके विशेषाधिकार अभी तक सक्रिय नहीं थे।
ब्रोकरडॉज

RESET MASTER को दास पर चलाया जाना चाहिए, न कि स्वामी पर, percona.com/blog/2013/02/08/… पर
जॉन

1

यदि आप पूर्ण प्रक्रिया को REDO नहीं चाहते हैं, तो एक अच्छा फिक्स उपयोग करना होगा

STOP SLAVE;    
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;

यदि ऐसी बहुत सी त्रुटियां हैं, तो एक अच्छा विचार यह होगा कि इसे bash स्क्रिप्ट का उपयोग करके स्वचालित किया जाए।

Ref: फिक्सिंग डुप्लिकेट एंट्री एरर


1

मुझे सटीक समस्या थी और Ut xd के लिंक ने मदद की। लेकिन उस लिंक में कमांड में सिंटैक्स त्रुटि थी और यहां वह संस्करण है जो मेरे लिए काम करता है:

while [ 1 ]; do if [ `mysql -uroot -ppassword -e"show slave status \G;" | grep "Duplicate entry" | wc -l` -eq 2 ] ; then mysql -uroot -ppassword -e"stop slave; set global sql_slave_skip_counter=1; start slave;"; fi; sleep 1; mysql -uroot -ppassword -e"show slave status\G"; done

यह मूल रूप से जांचता है कि क्या डुप्लिकेट प्रविष्टि त्रुटि है और मास्टर से इस घटना को छोड़ दें। और यह एक पाश में करते हैं।


1
यह एक बेहतर उत्तर होगा यदि आप बताएंगे कि कोड क्या करता है और कोड को अधिक पठनीय बनाने के लिए प्रारूपित करता है।
कैस्परड

0

मेरे मामले में इस समस्या को निम्न आदेशों द्वारा हल किया गया है

निम्न चरणों द्वारा

STOP SLAVE;
RESET SLAVE;
START SLAVE;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.