一次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