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

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

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

这是他们的参数:

sync_master_info = 1sync_relay_log_info = 1relay_log_info_repository = FILE

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

START TRANSACTION;-- Statement 1-- ...-- Statement NCOMMIT;-- Update replication info files

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

于是我建议他们设置:

relay_log_info_repository = TABLErelay_log_recovery =  1alter 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 infoCOMMIT;

这样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

参考:

转载地址:http://vyxql.baihongyu.com/

你可能感兴趣的文章
PostgreSQL 在铁老大订单系统中的schemaless设计和性能压测
查看>>
SaaS模式与ASP模式的差异分析报告
查看>>
[译]函数式响应编程入门指南
查看>>
解决tiny4412串口终端不能输入的问题
查看>>
FCN
查看>>
BloomFilter算法概述
查看>>
关于static 访问权限、继承、多态、内部类结合在一起时的使用方法
查看>>
HIMSS博览会首登中国 建言医卫IT新发展
查看>>
苹果将知名黑客Kristin Paget招致麾下
查看>>
【机器学习PAI实践七】文本分析算法实现新闻自动分类
查看>>
SACC 2013:大数据可视化应用及推荐
查看>>
这里有一份面筋请查收(七)
查看>>
在 Cocos2d-x 中使用 OpenSSL
查看>>
Python 进阶_OOP 面向对象编程_self 的实例绑定
查看>>
JAVA在win10上的安装环境配置
查看>>
闵春榕:PCIE SSD在数据库优化中的应用
查看>>
Easystack陈喜伦:OpenStack市场走强,聚集效应加剧
查看>>
《社交网站界面设计(原书第2版)》——2.5 严格 VS. 灵活的分类法
查看>>
数据仓库需要的不是退出历史舞台
查看>>
VMware表示,用户在尝试OpenStack之后纷纷决定放弃
查看>>