ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

一个会导致Mysql crash 的半同步的bug

2021-03-05 22:04:26  阅读:160  来源: 互联网

标签:同步 crash 5.6 Mysql mysqld mysql bug


 作者在之前写的一篇关于mysql 5.6与mysql 5.7的半同步性能对比测试的文章中,提到mysql的半同步的一个bug .  当时提出了在mysql 5.6中并未曾遇到这个bug (作者确实未曾在5.6上遇到这个bug,回头看来,这个原因也很可能是性能上的差异导致),而事实上,这个bug在5.6就存在,周末在bug库里面找到了这个bug ,确实目前还没有程序员分享(贡献)解决这个Bug的代码。

         下面来看这个bug的详细信息:

图片

      代码描述的详细地址:http://bugs.mysql.com/bug.php?id=78680

       bug触发的条件是:当事务执行到正在提交的函数Trans_delegate::after_commit() 时,同时将master的半同步状态设置为on .

      如何重复,如下(截取bug 提交者的说明进行描述
This was interesting to reproduce.    (这是一个非常有趣的重现)
I attached a log file with details, but in short: (我提交了一个日志文件进行描述,简单说来如下)
- run mysqld with semi-sync DISABLED     (首先mysqld将半同步的插件运行在异步状态下,也就是semi-sync DISABLED  )

- run a DML statement , but block it when Trans_delegate::after_commit() is called  (通过debug_sync函数设置断点,将执行dml 语句的会话堵塞在Trans_delegate::after_commit() 这个函数的入口处)

- in another thread, enable semi-sync (用另外一个会话,将半同步开启)
- let the DML statement complete with semi-sync ENABLED (然后之前被block的dml 语句的会话继续运行)。
- mysqld will crash  (mysqld crash).


    因此,只有当其他会话正执行到这个函数Trans_delegate::after_commit() 时,将半同步从异步状态设置会同步状态时,则会引发mysqld crash . 因此,事务并发越多,越容易刚好在这个函数点上撞上,导致mysqld crash 。

    现在来说说,为什么在mysql 5.6上,作者为什么未曾遇到设置mysql半同步时出现crash的现象,通过对比测试发现,mysql 5.6的事务提交速度比mysql5.7低,因此事务并发提交的速度也没有mysql5.7快,所以刚好撞上的概率也就低。

  


标签:同步,crash,5.6,Mysql,mysqld,mysql,bug
来源: https://blog.51cto.com/15057824/2648705

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有