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);

MySQL Replication Corrupted

สวัสดีปีใหม่ไทยครับทุกท่าน ช่วงหยุดสงกรานต์ที่ผ่านมาผมไม่ได้
เข้ามา update blog เลย เพราะว่าเดินทางท่องเที่ยว และทำกิจกรรม
ในช่วงวันหยุดพักผ่อน ส่วนรูปและเรื่องราวต่างๆ ติดตามได้ที่ FB ครับ
URL : http://www.facebook.com/pornpasok

ส่วนเรื่องที่ผมจะมาเขียนวันนี้มีความสำคัญมาก สำหรับท่านที่ใช้
MySQL Replication ซึ่งบางครั้ง เครื่อง Slave บางเครื่องอาจจะ
มีปัญหาเกี่ยวกับ bin-log ซึ่งเราจำเป็นต้องทำให้ไป sync กับ Master
ที่ bin-log และ Position ที่เราต้องการ วิธีการ check มีดังต่อไปนี้ครับ

1.mysql> SHOW SLAVE STATUS\G;
จะได้ค่าต่างๆ ของเครื่อง Slave มา ที่เราสนใจก็คือค่าต่างๆ ของ
Relay_Master_Log_File : และั Exec_Master_Log_Pos :

2.mysql> STOP SLAVE;
เป็นการสั่งเพื่อหยุดการทำงานของ Slave

3.สมมุติว่า เครื่อง Master มี IP เป็น 192.168.1.1  User-Password ใส่แบบตัวอย่าง
Relay_Master_Log_File : mysql-bin.000354 Exec_Master_Log_Pos : 823287655
เราก็ทำการใช้ command ในการเปลี่ยนเครื่อง Slave เราให้ทำงานที่ position ที่เราต้องการดังนี้
mysql> CHANGE master TO  MASTER_HOST=’192.168.1.1′,MASTER_USER=’slaveuser’,MASTER_PASSWORD=’slavepassword’,master_log_file=’mysql-bin.000354′,master_log_pos=823287655,MASTER_CONNECT_RETRY=10;

4.mysql> START SLAVE;

เท่านี้ก็จะแก้ปัญหาต่างๆ เกี่ยวกับการทำ MySQL Replication ได้แล้วครับ 🙂

เพิ่มเติม URL : http://www.mysqlperformanceblog.com/2008/08/02/troubleshooting-relay-log-corruption-in-mysql/