错误提示:
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