问题背景

最近在写一个作为MySQL Slave的角色的程序,连接到MySQL Master使用MySQL复制协议来Dump Binlog事件流。很自然,这个程序在第一次运行的时候,其事务GTIDSet是空的,那么在和Master建立主从连接的时候,是无法正常建立的。原因是:

参考:https://github.com/mysql/mysql-server/blob/5.7/sql/rpl_binlog_sender.cc

Master判断一个Slave Dump请求合法必须满足两个条件:Slave请求的GTIDSet是Master Executed GTIDSet的一个子集

Master Purged GTIDSet是Slave请求的GTIDSet的一个子集

显然,程序第一次运行的时候无法满足条件2(只要Master存在Purged GTIDSet),一个比较自然的错误处理逻辑是:

如果Slave程序发现连接到Master报的错误码是ER_MASTER_HAS_PURGED_REQUIRED_GTIDS,对应错误信息是:The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.的时候,我们查询Master的Purged GTIDSet,将这个GTIDSet merge到本地,以merge后的GTIDSet作为新的开始位置请求Dump。把这个特殊场景考虑进程序的一个逻辑中,避免手动来处理。

但测试发现,MySQL Server(5.7.17)返回的错误码为:ER_MASTER_FATAL_ERROR_READING_BINLOG,但错误信息为:The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.。而ER_MASTER_FATAL_ERROR_READING_BINLOG其实是一个很宽泛的错误码,关键是在这个场景中,Master Dump线程还在check阶段(Binlog_sender::check_start_file()这个函数中),根本没到读取Binlog文件的环节。所以我们认为这是一个小坑!

Root cause追踪

参考:rpl_binlog_sender.cc,我们可以看到,当Master的Purged GTIDSet不是Slave请求GTIDSet的一个子集的时候,errmsg被设置为了期望的“The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.”。但error code是在set_fatal_error函数中设置的,我们继续看这个函数:

742     if (!gtid_state->get_lost_gtids()->is_subset(m_exclude_gtid))

743 {

744 errmsg= ER(ER_MASTER_HAS_PURGED_REQUIRED_GTIDS);

745 global_sid_lock->unlock();

746 set_fatal_error(errmsg);

747       return 1;

748 }

set_fatal_error函数实现:rpl_binlog_sender.h,可以看到error code被设置成了ER_MASTER_FATAL_ERROR_READING_BINLOG,也就是MySQL Server返回给应用程序的错误码和错误信息不匹配。

382   void set_fatal_error(const char *errmsg)

383 {

384 set_error(ER_MASTER_FATAL_ERROR_READING_BINLOG, errmsg);

385 }

最后是我们写的程序,期望根据error code来写处理逻辑行不通,只好修改成strcasecmp来字符串匹配。

642 len = cli_safe_read(g_mysql_, NULL);

643       if (len == packet_error || (long)len < 1) {

644 LOG_ERR("cli_safe_read failed: (%d - %d - %s).",

645 mysql_errno(g_mysql_),

646 ER_MASTER_HAS_PURGED_REQUIRED_GTIDS,

647 mysql_error(g_mysql_));

648         // TODO: why errno is incorrect!

649if (ER_MASTER_HAS_PURGED_REQUIRED_GTIDS == mysql_errno(g_mysql_)){

650 LOG_INF("Will try to merge purged gtidset next round!");

651 new_master_purged = true;

652 }

653         goto err_t;

654 }

上面这段程序,测试会得到MySQL Server端返回error code 1236,但是其实错误信息是error code 1789的内容。

cli_safe_read failed: (1236 - 1789 - The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.).

mysql内核测试,MySQL 5.7内核复制中的一个小坑相关推荐

  1. mysql smack_super-smack测试mysql性能

    最近对MySql的性能要求越来越高了,所以也需要做相关的压力仿真测试. super-smack测试mysql性能 一.使用Red Hat Enterprise Linux Server release ...

  2. sysbench mysql oltp_sysbench测试mysql oltp

    以前在做mysql压力测试的时候用的是jmeter,jmeter配置有点烦,最近尝试用sysbench来进行mysql的压力测试 下载最新版的sysbench cd /usr/local/src wg ...

  3. 有没有测试女生暗恋的软件,教你一个小技巧就可以测试女生是否喜欢你!

    原标题:教你一个小技巧就可以测试女生是否喜欢你! 有个兄弟好不容易认识一个女孩,通过不懈努力,终于把她约出来.但是在约会过程当中不知道和女孩干什么,不知道什么时候可以干什么. 看着自己喜欢的女孩坐在自 ...

  4. jmeter mysql driver_jmeter测试mysql数据库之JDBC请求

    jmeter要链接mysql数据库,首先得下载mysql jdbc驱动包(注:驱动包的版本一定要与你数据库的版本匹配,驱动版本低于mysql版本有可能会导致连接失败报错)我这里下载的是mysql-co ...

  5. oracle表复制为mysql表_oracle 将数据库的表复制到另一个数据库表内

    将数据库A中的表sys_role复制到数据库B中 在数据库b中的SQL工作表写如下代码: 第一步:建立链接 CREATE database link A //数据库名称 CONNECT to text ...

  6. mysql 删除字段_MySQL命令行删除表中的一个字段

    先看看删除之前的表结构: mysql> select * from test; +------+--------+----------------------------------+----- ...

  7. Mysql的存储过程修改表的数据:项目上一个小练习

    把所有的记录中的周数进行加52  一共十三万条的数据 思路: 先查询出来,把结果进行保存: 把进行使用update进行更新: create procedure changeweek2(in id_su ...

  8. mysql 从从(主主)复制(故障转移)

    mysql 从从(主主)复制(故障转移) 更新说明 8.0 所谓主主,其实是从从: 数据库版本 从1 1.数据库配置 2.重启数据库 3.设置从从 4.开启数据同步功能 5.在linux系统中mysq ...

  9. linux内核测试指南 第一章

    linux内核测试指南 第一章 内核,补丁,内核树 和 编译 1.1 内核 Linux内核的当前版本通常可以从linux内核档案网站(http://www.kernel.org/)以一个大的压缩文件的 ...

最新文章

  1. [亿能测试_www.gdtesting.com]测试技术资料网盘共享
  2. Spark的transformation和action算子简介
  3. 题目1174:查找第K小数
  4. 15套漂亮的 PSD 格式的图标,不一样的视觉效果
  5. good food to buy when at the train station
  6. 【需求工程】需求依赖矩阵
  7. map在Sql中的传参 模糊查询limit分页
  8. 每日算法系列【LeetCode 128】最长连续序列
  9. 中国ai人工智能发展太快_新的AI计算遥远行星的速度快100,000倍
  10. 网上免费打电话和国际长途
  11. 计算机用户密码怎么查看,电脑密码如何查看? 电脑教程:查看方法
  12. VBA金额转换中文大写(原创新解版)
  13. 【剑指offer】JZ55 二叉树的深度 python
  14. iOS开发:Protocol协议以及委托代理传值
  15. cad卸载工具_CAD安装失败都是红?
  16. python 微信授权 昵称乱码解决
  17. 【我的前端】网站开发:设计响应式网站的八大因素
  18. Windows命令行窗口 - DOS 指令
  19. 解密“达达-京东到家”的订单即时派发技术原理和实践
  20. 【QTdesigner】课时36.使用QTextEdit控件输入多行文本【pyqt5+QTdesigner模式】

热门文章

  1. 国产数据库产业百花齐放 “1+4+4+N”格局形成
  2. 未来,App就是一个人的全部
  3. Java 反射机制你还不会?那怎么看 Spring 源码?
  4. 小学六年级学生写的 “线段树”解析,厉害了!
  5. 苹果 Mac 电脑将采用自研芯片、App Store 上线“小程序”,WWDC20 为开发者带来了什么 ?
  6. 网易易盾升级内容安全体系 发布智能审核管理系统
  7. 如何使用 kubeadm 安装 Kubernetes?
  8. 围观京东云,您有一份区块链技术礼包待查收!
  9. 彻底征服 Entity Framework Core 优化!
  10. 为什么程序员都不愿意升级 Java 8?