MySQL Replication: ‘Got fatal error 1236’
ระบบ 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’
- ตรวจสอบหา binlog และ position ที่สามารถให้ slave เริ่มทำงานใหม่ได้ โดยทั้วไปแล้ว binlog ที่ corrupt จะไม่สามารถเขียนต่อได้ ดังนั้น MySQL จึงสร้าง binlog ขึ้นมาใหม่โดยที่ชื่อจะต่อจากชื่อเดิม เช่น ในตัวอย่าง binlog ที่เกิดปัญหาคือ mysql-bin.000005 ดังนั้น binlog ที่จะใช้เป็นตัวอ้างอิงให้ slave ทำงานใหม่คือ mysql-bin.000006
- หลังจากได้ binlog แล้วให้รันคำสั่งด้านล่างที่ slave เพื่อให้ slave เริ่ม sync ข้อมูลจากจุดอ้างอิงใหม่
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=4;
mysql> START SLAVE; - ตรวจสอบ 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