为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL5.6 crash-safe replication一个坑

标签:
MySQL


事情起因:唯品会一个DBA找到我,说他们的slave掉电,再重启服务器以后,同步复制就挂了,报1032和1062错误,首先排查了在从库上没有写操作,之后询问了他们的参数。

这是他们的参数:

sync_master_info = 1

sync_relay_log_info = 1

relay_log_info_repository = FILE

参数意思是:sql线程每次执行完了一个事务,就会记录在master.info和relay.info文件里。即:

START TRANSACTION;

-- Statement 1

-- ...

-- Statement N

COMMIT;

-- Update replication info files

由于在记录relay.info的时候宕机,relay.info未更新,机器重启恢复后会从之前的POS点再次执行,这样就执行了两条同样的SQL,就会报1032和1062错误,同步就挂了。

于是我建议他们设置:

relay_log_info_repository = TABLE

relay_log_recovery =  1

alter table mysql.slave_relay_log_info engine=innodb;

参数意思是:把relay.info改成记录在slave_relay_log_info表里,并改成innodb引擎,并开启relay_log_recovery中继日志自我修复功能。即:

START TRANSACTION;

-- Statement 1

-- ...

-- Statement N

-- Update replication info

COMMIT;

这样sql线程执行完事务后,立即会更新slave_relay_log_info表,如果在更新过程中宕机,事务会回滚,slave_relay_log_info表并不会记录同步的点,下次重新同步复制时,从之前的POS点再次执行。

看似很完美了,但之后我在虚拟机上做了测试,发现了一个BUG:

即针对DDL语句,不会触发刷盘操作,而DML语句不会有该问题,也就是说slave_relay_log_info表不会更新,必须手工执行stop slave;start slave;该表才会强制刷新。

试想一下,你修改了表结构以后,突然宕机,slave_relay_log_info表没刷进磁盘,下次重启服务后,会再次执行一次修改表结构,此时同步就挂了,你只能手工去跳过这个错误。

我测试的版本是:5.6.22-71.0-log Percona Server (GPL), Release 71.0, Revision 726

参考:

wKioL1TwRLDxNbh0AANu0NF7cYI259.jpg

©著作权归作者所有:来自51CTO博客作者hcymysql的原创作品,如需转载,请注明出处,否则将追究法律责任

crashslavemysql5.6MySQL5.6专栏


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消