一次MySQL主备同步出错恢复

错误提示:

Last_IO_Errno: 1236
 Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from position > file size; the first event 'mysql-bin.000001' at 1656, the last event read from './mysql-bin.000001' at 4, the last byte read from './mysql-bin.000001' at 4.'

版本环境:

[mysql]>select version();
+------------+
| version()  |
+------------+
| 5.6.26-log |

起因: 一个MySQL主备环境,同事不知道怎么操作的,备库不能正常同步。最后叫我过去排查问题

排查过程:

备库:

查看同步信息,有错误:

show slave status\G

 Last_IO_Errno: 1236
 Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from position > file size; the first event 'mysql-bin.000001' at 1656, the last event read from './mysql-bin.000001' at 4, the last byte read from './mysql-bin.000001' at 4.'

出现这种情况基本是同步文件不对。

因为不知道那个同事在备库上作了什么操作,有可能执行过change命令,改变过同步参数。这时候使用show slave status看的Read_Master_Log_Pos这些数据都不一定是对的了。而且要重新同步也不能依据主库现在的日志信息了,因为主库的Position是一直在变动的,根据这个Position更新,备库会少数据。

这个时候我们看mysql日志,有记录stop slave和change命令,能看出停止stop slave时的同步信息

#vim mysqld.log
...........
2018-05-31 23:03:27 21492 [Note] Slave I/O thread killed while reading event
2018-05-31 23:03:27 21492 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.000004', position 41624791
2018-05-31 23:03:27 21492 [Warning] slave info thread stopped!
2018-05-31 23:04:26 21492 [Note] 'CHANGE MASTER TO executed'. Previous state master_host='192.168.0.x', master_port= 3306, master_log_file='mysql-bin.000004', master_log_pos= 41624791, master_bind=''. New state master_host='192.168.0.x', master_port= 3306, master_log_file='mysql-bin.000001', master_log_pos= 11111, master_bind=''.
...........

可以看出有修改过同步信息。

停止同步: stop slave;

根据查询到的同步信息,重新change回去

change master to master_host='192.168.0.x',master_user='xxxxx',master_password='xxxxxx',master_log_file='mysql-bin.000004',master_log_pos=41624791;

开始同步: start slave;

恢复正常。

如果在日志中查看没有使用过change命令修改过而出现错误,可以查询同步记录的信息来恢复同步: MySQL5.6.2之前都是使用文件保存,5.6.2之后可以修改为表进行保存。 master_info_repository参数:

show variables like '%master_info%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| master_info_repository | TABLE |

如果是TABLE,则是一个表ysql.slave_master_info记录同步信息 如果是FILE,则是一个文件记录同步信息master.info

通过查询这个里面的数据来进行重新change