ทำให้เกิดข้อผิดพลาด MySQL 1062 อะไร - รายการที่ซ้ำกันเมื่อเริ่มต้นทาส?


11
  • รุ่น MySQL หลัก: 5.5.16-1
  • MySQL Slave เวอร์ชั่น: 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, ...

มีเพียงระเบียนเดียวที่มี ID 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ไฟล์เพราะอาจทำให้ทาสไม่สอดคล้องกัน

อะไรคือสาเหตุของข้อผิดพลาดนี้?


UPDATE

นี่ไม่ใช่วิธีที่ฉันมักจะติดตั้งการจำลองแบบ mySQL

ขั้นตอนใดที่คุณคิดว่าฉันไม่ได้ติดตามเอกสาร

ฉันสงสัยว่าคุณจะพบปัญหาเดียวกันหรือไม่หากคุณต้องตั้งค่าการกำหนดค่าทั้งหมดแทนที่จะส่งคำสั่ง mysqldump

ไม่ทำงานได้ตามปกติถ้าฉันเปลี่ยนต้นแบบเป็นพิกัดที่เกี่ยวข้องด้วย

ฉันจะลองวางฐานข้อมูลลงบน Slave ตรวจสอบให้แน่ใจว่าถังขยะนั้นชัดเจนแล้วเริ่มใหม่อีกครั้ง ตรวจสอบตารางในคำถามบนต้นแบบเพื่อให้มั่นใจว่าดัชนีไม่มีข้อผิดพลาด

ลบ (ย้าย) datadir ทั้งหมดเพียงพอหรือไม่ ฉันทำอย่างนั้นและได้รับผลลัพธ์เดียวกัน


ตอบกลับไปที่ @Dmytro Leonenko

'แสดงสถานะทาสก์ \ G' บนสลาฟเพื่อให้แน่ใจว่ามีการกำหนดค่าอย่างเหมาะสม MASTER_LOG_POS คือ 0

มีเพียง 'show slave statug \ G' หลังจากนำเข้า แต่ก่อน 'เริ่มทาส' สามารถให้คำตอบกับเรา

ฉันสำรองข้อมูลไว้ลบทั้งหมดและเรียกใช้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แบบสอบถามทำให้เกิดข้อผิดพลาดในการเปลี่ยนแปลงอย่างน้อย? การตั้งค่าตำแหน่ง binlog ของทาสถูกต้องหรือไม่?
thinice

ทุกครั้งที่ฉันข้ามเคาน์เตอร์จะเปลี่ยนเป็น ID อื่น --master-dataตัวเลือกที่มีอยู่แล้วเขียนบันทึกพิกัดไบนารีแฟ้มการถ่ายโอน ฉันต้องการเปลี่ยน master เป็น master_host, master_user, master_password
quanta

นี่ไม่ใช่วิธีที่ฉันมักจะติดตั้งการจำลองแบบ 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='', ...สาเหตุของอะไร?
quanta

ไม่นั่นไม่ใช่สิ่งที่ฉันกำลังพูด ดังที่ฉันได้กล่าวถึงสิ่งที่คุณทำควรจะทำงานได้ตามที่คาดหวัง - เท่าที่ฉันเห็นไม่มีข้อผิดพลาดที่มีอยู่กับตัวเลือกนั้น อย่างไรก็ตามมันไม่ได้หมายความว่าไม่มีดังนั้นในขั้นตอนการแยกฉันจะทำตามข้อตกลงที่ mySQL จัดเตรียมไว้ก่อนผ่าน URL นั้น เสื้อ หากใช้งานได้อย่างน้อยคุณก็มีทิศทางที่จะเริ่มแก้ไขปัญหา หากไม่เป็นเช่นนั้นเรามีปัญหาแตกต่างกัน :)
Rilindo

คำตอบ:


7

สิ่งที่พยายามแก้ไขปัญหาของคุณ:

  1. คุณควรลบ master.info บน slave ก่อนแล้วรีสตาร์ท mysql
  2. เปลี่ยน MASTER เป็น MASTER_HOST = 'XX.XX.XX.XX', MASTER_USER = 'repl', MASTER_PASSWORD = 'slavepass';
  3. ทำ mysqldump ด้วยตัวเลือก '--flush-logs' บนมาสเตอร์
  4. 'mysql -u user -p <dump.sql' บนทาส
  5. 'แสดงสถานะทาสก์ \ G' บนสลาฟเพื่อให้แน่ใจว่ามีการกำหนดค่าอย่างเหมาะสม MASTER_LOG_POS คือ 0
  6. 'เริ่มทาส' บนทาส

สิ่งที่ต้องตรวจสอบ:

  • รูปแบบ Binlog: MIXED
  • server_ids ต่างจาก master และ slave

การออกสตริงต้นแบบการเปลี่ยนแปลงทั้งหมด (รวมถึงชื่อบันทึกและหมายเลขตำแหน่ง) แก้ไขได้จริง แต่ ณ จุดนี้ฉันคิดว่าคำถามหลักคือสาเหตุที่ Quanta มีการป้อนชื่อบันทึกและตำแหน่งจำนวนอีกครั้งเมื่อที่อยู่ใน ไฟล์ดัมพ์
Rilindo

มีเพียง 'show slave statug \ G' หลังจากนำเข้า แต่ก่อน 'เริ่มทาส' สามารถให้คำตอบกับเราได้
Dmytro Leonenko

ต่อท้ายข้อมูลที่ต้องการในโพสต์ต้นฉบับของฉัน
quanta

คุณจบลงด้วย "Master_Host: xxxx Master_User: xx" ได้อย่างไรโดยไม่ต้องออก "CHANGE MASTER ... " หรือคุณไม่ได้พูดถึงคำตอบ? คุณตรวจสอบรูปแบบ binlog แล้วและบรรทัดคำสั่งสำหรับ mysqldump คืออะไร?
Dmytro Leonenko

ฉันได้กล่าวแล้วว่าในโพสต์ของฉัน " นำเข้าไฟล์การถ่ายโอนการดำเนินการchange master to " ฉันใช้การบันทึกที่อิง MIXED ฉันทดสอบกับ MySQL 5.0.77 (อิงตามข้อความสั่ง) แล้วยังทำให้เกิดข้อผิดพลาดนี้ mysqldump แบบเต็มคือmysqldump -u root -p --all-databases --master-data --flush-logs > alldb_$(date +%F).sql
quanta

2

ปัญหาเกิดจากการตั้งค่าต้นแบบบนเซิร์ฟเวอร์ที่ใช้งานจริงก่อนที่จะทำการถ่ายโอนข้อมูล (เท่าที่ฉันสามารถบอกได้) ดังนั้นจึงมีคำถามที่เขียนใน master_log ที่ถูกดำเนินการแล้วกับข้อมูลที่อยู่บนสลาฟ ฉันไม่เคยเห็นวิธีแก้ปัญหาบนเว็บไซต์ 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


แก้ไขเพื่อรวมสิทธิ์ล้าง; ฉันรับรู้หลังจากข้อผิดพลาดอื่นที่แม้ผู้ใช้ของฉันถูกนำเข้าด้วยการถ่ายโอนข้อมูลสิทธิ์ของพวกเขายังไม่ได้ใช้งาน
BroknDodge

RESET MASTER ควรใช้กับทาสไม่ใช่เจ้านายดูpercona.com/blog/2013/02/08/…
Jon

1

หากคุณไม่ต้องการให้ทำซ้ำขั้นตอนที่สมบูรณ์การแก้ไขที่ดีก็คือการใช้

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

หากมีข้อผิดพลาดมากเกินไปความคิดที่ดีคือการทำให้เป็นอัตโนมัติโดยใช้สคริปต์ทุบตี

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
นี่จะเป็นคำตอบที่ดีกว่านี้หากคุณอธิบายว่ารหัสนั้นทำอะไรและจัดรูปแบบรหัสให้อ่านง่ายขึ้น
kasperd

0

ในกรณีของฉันปัญหาได้รับการแก้ไขโดยคำสั่งต่อไปนี้

โดยขั้นตอนดังต่อไปนี้

STOP SLAVE;
RESET SLAVE;
START SLAVE;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.