博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL5.6 crash-safe replication一个坑
阅读量:6992 次
发布时间:2019-06-27

本文共 1248 字,大约阅读时间需要 4 分钟。

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

这是他们的参数:

1
2
3
sync_master_info = 1
sync_relay_log_info = 1
relay_log_info_repository = FILE

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

1
2
3
4
5
6
START TRANSACTION;
-- Statement 1
-- ...
-- Statement N
COMMIT;
-- Update replication info files

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

于是我建议他们设置:

1
2
3
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中继日志自我修复功能。即:

1
2
3
4
5
6
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

参考:

本文转自hcymysql51CTO博客,原文链接:http://blog.51cto.com/hcymysql/1615751 ,如需转载请自行联系原作者
你可能感兴趣的文章
C语言编程-----程序的内存布局
查看>>
SQLServer中查询时显示行号的方法
查看>>
ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
查看>>
unix date 命令获取某日期的前一天
查看>>
iOS:下拉刷新控件UIRefreshControl的详解
查看>>
windows命令行(Command Prompt / Console)字体设置
查看>>
谈谈转行
查看>>
js获取url中指定参数值
查看>>
zabbix没有frontends目录
查看>>
基于 html5 geolocation来获取经纬度地址(copy)
查看>>
电脑上设置对眼睛友好的绿豆沙色
查看>>
Hadoop+Spark:集群环境搭建
查看>>
有你的地方才是家!澳70年婚龄夫妇手牵手同时离世
查看>>
大数据时代,这项能力程序员不具备就out了!
查看>>
怎么让你在工作中不无聊
查看>>
“寻迹京杭运河”两岸青年交流活动在北京落幕
查看>>
一滴血或能预测老年痴呆 韩国研究帮助你了解病情
查看>>
台湾海峡掀9级大风 福建平潭赴台海上航线连续三天停航
查看>>
摩登兄弟:参加《歌手》压力很大,在准备下一期歌曲
查看>>
面向 Kubernetes 编程:Kubernetes 是下一代操作系统
查看>>