MySQL replication slave skip last error

เวลาที่ Slave หยุดทำงาน เพราะว่าข้อมูลใน Slave ไม่ตรงกับ Master ด้วยเหตุผลบางอย่าง. เราสามารถตรวจสอบได้ว่า มันเกิดจากปัญหาอะไร โดยใช้คำสั่ง

SHOW SLAVE STATUS \G

เราจะเจอว่า Slave_SQL_Running มันกลายเป็น No ไปแล้ว (แน่ละ เพราะว่าข้อมูลมันไม่ consistency กันแล้ว มันเลยไม่ execute SQL)  แต่ Slave_IO_Running จะต้องเป็น Yes อยู่นะ (ซึ่งหมายถึง Slave มันยังอ่าน bin-log จาก Master มาอยู่ตลอด) ถึงจะซ่อมด้วยวิธีนี้ได้

ถ้าเราพิจารณาจาก Last_Error แล้วว่า มันจะมีปัญหาแค่ query เดียวเนี่ยแหละ เช่น

Last_Error: Error 'Can't DROP 'ref_no'; check that column/key exists' on query. Default database: 'example_db'. Query: 'ALTER TABLE `order_status` DROP `ref_no`'

สมมติปัญหาข้างต้นเกิดจาก มีคนพลาดไป DROP ref_no ที่ Slave ไปก่อนแล้ว  ทำให้ Slave เกิดปัญหาหยุดทำงาน ตาม Last_Error ข้างต้น. ในกรณีแบบนี้เรารู้แน่ๆ ว่าแค่ข้าม query นี้ไปก็ได้ เพราะว่าคำสั่ง DROP ref_no ดังกล่าว มันถูกทำไปแล้ว. แล้วจะได้เริ่ม execute query ต่อๆ ไปได้เลย

คำสั่งที่ใช้สำหรับข้าม error คือ ( ใส่ 1 หมายถึง ข้ามแค่ error เดียว )

SET GLOBAL sql_slave_skip_counter = 1;

อ้างอิง: https://dev.mysql.com/doc/refman/5.7/en/set-global-sql-slave-skip-counter.html

หลังจากกำหนด sql_slave_skip_counter ไปแล้ว  เราก็สั่งให้ Slave เริ่มทำงานต่อได้เลย โดยรัน

START SLAVE;

เสร็จแล้วก็รอสักพัก ให้มันวิ่งไล่ Master จนทันก่อน (ดูจากค่า Exec_Master_Log_Pos วิ่งทัน Read_Master_Log_Pos) ค่อยเริ่มใช้งานอ่านจาก Slave ได้อีกครั้ง

ส่วนถ้าในกรณีที่เป็นปัญหา ที่ไม่ได้เรียบง่ายแบบเคสตัวอย่างข้างต้น ก็คงจำเป็นต้องทำ mysqldump –master-data แล้วเอาไป import ที่ Slave ใหม่ เพราะมั่นใจว่าทำงานเหมือนกันแบบคลีนๆ ไปเลย