无效的GRANT语句导致主从复制断开的MySQL5.6 Bug#68892

BUG描述:
执行无效的grant语句,会导致主从复制断开以及主库二进制日志重新创建,从库报错:The incident LOST_EVENTS occured on the master. Message: error writing to the binary log,以及二进制日志会有如下记录:# Incident: LOST_EVENTS
RELOAD DATABASE; # Shall generate syntax error #。

测试版本:MySQL 5.6.11

场景重现:
首先主从复制正常:

图片1

 

 

 

 

 

 

主库:

执行grant file on test.* to test@127.0.0.1语句

图片2

 

从库:

查看从库状态show slave status\G

图片3

 

 

 

 

 

 

查看二进制日志(注意:此时查看的二进制日志是show master status的上一个日志,因为在无效的grant语句执行后,主库会创建新的二进制日志),会有如下记录

图片4

 

 

 

错误原因分析:

因为file权限不能只赋予某个库,需要赋予所有库,即grant file on *.* to user@host才是有效的grant语句。

解决方法:
1,使用sql_slave_skip_counter跳过事件,但此方法只适用于基于二进制日志原理的复制,不适用于基于GTID原理的复制。
2,使用slave_skip_errors跳过错误。
3,在从库上做change master操作,重新切换master_log_file和master_log_pos。(由于无效的grant语句执行后会创建新的二进制日志,所以可以指定主库show master status的master_log_file和master_log_pos)

规避方案:
避免无效的grant语句的执行。例如,file,process,super权限都要赋予所有数据库上,而不是赋予某个库或者某几个库。

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>