MySQL Replication Error 1236

สวัสดีครับ วันนี้มีเรื่องเกี่ยวกับ MySQL Replication Error มาเล่าให้ฟังครับ
ผมเองก็เพิ่งเคยเจอเหมือนกัน วิธีแก้ไขทำได้ยากมาก ปัญหาคือเกิดจาก
เครื่อง Master อาจจะมีการ shutdown โดยไม่ได้ stop MySQL ก่อน จึงทำให้
bin-log เกิดความไม่สมบูรณ์ โดยสามารถดูที่ Error Log ของ MySQL จะมี
ข้อความประมาณนี้ ที่เครื่อง Slave

100605 16:51:56 [Note] Slave I/O thread: connected to master ‘slaveuser@192.168.13.10:3306’,  replication started in log ‘mysql-bin.000429’ at position 57053329

100605 16:51:56 [ERROR] Error reading packet from server: Client requested master to start replication from impossible position ( server_errno=1236)

100605 16:51:56 [ERROR] Got fatal error 1236: ‘Client requested master to start replication from impossible position’ from master when reading data from binary log

100605 16:51:56 [Note] Slave I/O thread exiting, read up to log ‘mysql-bin.000429′, position 57053329

ผมพยามจะ STOP/START Slave แล้ว แต่ว่าก็ไม่ช่วยให้อาการดีขึ้น
ทางเดียวที่ควรจะทำคือ ให้เริ่ม Replication ใหม่ โดยใช้ bin-log อันดับถัดไป
ที่ position 0 อย่างในตัวอย่าง ผมก็จะเริ่มที่  mysql-bin.000430 position 0
โดยมีขั้นตอนต่างๆ ดังนี้คือ

mysql> STOP SLAVE;
mysql> change master to MASTER_HOST=’192.168.13.10′, MASTER_USER=’slaveuser’, MASTER_PASSWORD=’xxxxxx’, MASTER_LOG_FILE=’mysql-bin.000430′, MASTER_LOG_POS=0;
mysql> START SLAVE;

จากนั้นทำการสั่ง SHOW SLAVE STATUS\G; ก็จะพบว่าเครื่อง Slave
สามารถกลับมา replication กับเครื่อง Master ได้เหมือนเดิม ..

* คำเตือน ห้ามใช้วิธีการ STOP SLAVE; RESET SLAVE; START SLAVE;
โดยเด็ดขาด เพราะนั่นหมายความว่าจะต้องทำการ sync bin-log ตั้งแต่
bin-log แรกสุดที่เครื่อง Master เก็บไว้ 🙂

* เพิ่มเติม ควรทำการ purge bin-log บ่อยๆ เพื่อเป็นการลดพื้นที่การใช้ดิส
โดยใช้คำสั่ง ดังต่อไปนี้ หรือจะตั้ง cronjob ไว้ก็ได้คร้บ
mysql> PURGE BINARY LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 7 DAY);