mysql-logo
ระบบ MySQL replication จะมีการทำงานโดย slave จะดึงข้อมูลจาก binlog ที่ master server เพื่อไปทำการ replay ที่เครื่อง slave เอง ซึ่งถ้าหากเกิดปัญหา slave หยุดทำงานด้วย error 1236 ดังข้างล่าง เราสามาถทำการแก้ไขอย่างไร และสาเหตุเกิดจากอะไรมาดูกันครับ

Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'binlog truncated in the middle of event; consider out of disk space on master; the first event 'mysql-bin.000005' at 1185833, the last event read from '/var/log/mysql/mysql-bin.000005' at 1185833, the last byte read from '/var/log/mysql/mysql-bin.000005' at 1185852.

สาเหตุเกิดจาก master server เกิด crash ทำให้ binlog cache ไม่ได้ flush ลง disk (ทำให้เกิด binlog corrupt) แต่ในขณะนั้น slave ได้รับ position ใหม่แต่ไม่สามารถดึงข้อมูลจาก master ได้เนื่องจาก binlog ที่ทำการดึงเกิด corrupt เรียบร้อยแล้ว

การแก้ไข MySQL Replication: ‘Got fatal error 1236’

  1. ตรวจสอบหา binlog และ position ที่สามารถให้ slave เริ่มทำงานใหม่ได้ โดยทั้วไปแล้ว binlog ที่ corrupt จะไม่สามารถเขียนต่อได้ ดังนั้น MySQL จึงสร้าง binlog ขึ้นมาใหม่โดยที่ชื่อจะต่อจากชื่อเดิม เช่น ในตัวอย่าง binlog ที่เกิดปัญหาคือ mysql-bin.000005 ดังนั้น binlog ที่จะใช้เป็นตัวอ้างอิงให้ slave ทำงานใหม่คือ mysql-bin.000006
  2. หลังจากได้ binlog แล้วให้รันคำสั่งด้านล่างที่ slave เพื่อให้ slave เริ่ม sync ข้อมูลจากจุดอ้างอิงใหม่
    mysql> STOP SLAVE;
    mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=4;
    mysql> START SLAVE;
  3. ตรวจสอบ slave status ด้วยคำสั่ง
    mysql> SHOW SLAVE STATUS;

การป้องกันปัญหา MySQL Replication: ‘Got fatal error 1236’
เปิดใช้งาน sync_binlog ที่ master server ซึ่งจะช่วยให้ master server ทำการ flush cache ทุกครั้งที่มีการ write

  • แก้ไขที่ MySQL Console
    mysql> SET GLOBAL sync_binlog=1;
  • แก้ไขที่ my.cnf
    sync_binlog=1