การจำลองแบบ MySQL: 'รายการซ้ำสำหรับคีย์หลัก'


9

คุณกรุณาช่วยฉันเข้าใจว่าทำไมฉันถึงได้รับ 'รายการซ้ำสำหรับคีย์หลัก' บนเซิร์ฟเวอร์ทาสหลังจากทำการซิงค์ใหม่ทั้งหมด

โดยทั่วไป 'mysqldump' ทำงานเกือบทั้งคืนแล้วกระบวนการกู้คืนใช้เวลาสองสามชั่วโมงดังนั้นเมื่อฉันเริ่มใช้งานทาสมันคือ ~ 63874 วินาทีที่อยู่เบื้องหลังเจ้านาย

เซิร์ฟเวอร์ทาสเป็นแบบอ่านอย่างเดียว (read_only) และไม่มีการเขียนใด ๆ ระหว่างกระบวนการซิงค์ใหม่ดังนั้นฉันจึงไม่เข้าใจว่าเพราะเหตุใดจึงมีคีย์ซ้ำ

รูปแบบบันทึกไบนารีตั้งค่าเป็น MIXED บนต้นแบบ

คำสั่งที่ใช้ในการสำรองฐานข้อมูล:

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

Slave จะจำลองฐานข้อมูลเดียวเท่านั้นจากต้นแบบ (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-rewrite-db ก็บอกว่า:

การแปลชื่อฐานข้อมูลเสร็จสิ้นก่อนที่จะทดสอบกฎ --replicate- *

การreplicate-wild-do-tableบังคับใช้หลังจากเขียนใหม่ มันจะไม่น่าแปลกใจถ้าคำสั่งนี้กำหนด INSERT ไว้ในตารางที่มีข้อมูลอยู่แล้ว

คุณอาจถามว่าข้อมูลมาที่นี่ได้อย่างไร

ASPECT # 2: mysqldump

การทำเช่นmysqldump --single-transactionนี้ดูเหมือนจะเป็นวิธีที่ดีที่สุดในการทิ้งข้อมูล ณ เวลาที่กำหนด แต่น่าเสียดายที่มีจุดอ่อน:mysqldump --single-transaction ALTER TABLEหากตารางอยู่ภายใต้ALTER TABLEคำสั่งใด ๆเช่น a DROP TABLEและCREATE TABLEที่สามารถทำลายความสมบูรณ์ของการทำธุรกรรม mysqldump พยายามที่จะทำการถ่ายโอนข้อมูลในการตัดตาราง (ซึ่งเป็น DDL ใน MySQL จักรวาล) และวางและเพิ่มดัชนีสามารถ ก็จะก่อกวนเช่นกัน

คุณสามารถหาข้อมูลเพิ่มเติมว่าจากผลการดำเนินงาน MySQL บล็อกของที่ดีที่สุดเก็บไว้ mysqldump ลับ จริง ๆ แล้วฉันได้กล่าวถึงประเด็นนี้ในคำถามที่ผ่านมาซึ่งอธิบายถึง 12 คำสั่งที่สามารถทำลายความสมบูรณ์ของธุรกรรมของ mysqldump: การสำรองข้อมูล MySQL InnoDB

ข้อแม้

บทส่งท้าย

ด้านหนึ่งหรือทั้งสองด้านอาจมีส่วนช่วยให้การจัดแถวในระหว่าง mysqldump ที่ไม่ควรมีอยู่เนื่องจากกฎการเขียนใหม่หรือการแยกของ mysqldump ที่ถูกแทนที่

คำแนะนำ

ฉันจะทำการถ่ายโอนข้อมูล mysqlbinlog ของบันทึกการถ่ายทอดทั้งหมดตั้งแต่เริ่ม mysqldump เพื่อดู INSERT ทั้งหมดที่ Slave จะดำเนินการและดูว่าแถวเหล่านั้นมีอยู่แล้วบน Slave หรือไม่ ถ้าเป็นเช่นนั้นคุณอาจทำสองสิ่ง:

1: ข้ามข้อผิดพลาดคีย์ซ้ำทั้งหมด

เพียงเพิ่มส่วนนี้ลงใน my.cnf บน Slave

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

และเริ่ม mysql ใหม่ จากนั้นเรียกใช้START SLAVE;

ข้อผิดพลาดคีย์ซ้ำทั้งหมดจะถูกข้าม เมื่อSeconds_Behind_Masterถึง 0 ให้ลบบรรทัดเหล่านั้นและเริ่ม mysql ใหม่

2: ดาวน์โหลดเครื่องมือ percona

เครื่องมือที่คุณต้องการคือ

ใช้สิ่งเหล่านี้เพื่อค้นหาความแตกต่างใน Slave จากนั้นแก้ไขให้ถูกต้อง


0

ตรวจสอบการแทรกแบบสอบถามในรหัสที่แทรกลงในทาสโดยตรง เราอ่านได้จากทาสเท่านั้น แบบสอบถามแบบเขียนควรถูกนำไปยังต้นแบบ


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