技术分享 | 如何根据 MySQL 崩溃日志找到已修复的 BUG 内容

智数追月客
• 阅读 2531

作者:岳明强

爱可生北京分公司 DBA 团队成员,负责数据库管理平台的运维和 MySQL 问题处理。擅长对 MySQL 的故障定位。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


在生产中一般发生运行问题,可以翻翻 error 日志,大部分都能解决。有的时候数据库突然宕机重启,此时我们在 error 日志中会发现"This could be because you hit a bug",然后打了一堆看不懂的堆栈。这时候如果拿着碰到BUG的结论交差,多半会被应用一顿暴击输出:有证据没,这个 bug 怎么出现的,官方怎么修的,在什么版本修的。那么接下来,我将根据现有 error 日志报错中的堆栈信息,找到详细的 BUG 修复记录

一、查看当前错误日志

MySQL 异常崩溃,查看 error 日志,红框处为位置信息

注:如出现这种类似 BUG 信息,不应只看这部分信息,应先查看 MySQL 异常退出前是否存在报错信息。此处不进行演示

技术分享 | 如何根据 MySQL 崩溃日志找到已修复的 BUG 内容

二、gdb 查看报错文件位置

使用 gdb 追踪报错文件位置,前面报错文件为 mysqld ,就 gdb mysqld 文件,如果是其他的文件,例如组复制插件,那么就 gdb 该文件

首先先 b 一下函数名称,如下所示:

技术分享 | 如何根据 MySQL 崩溃日志找到已修复的 BUG 内容

可以看出后面找到两个位置,然后我们再加上偏移量,再 b 一下:

技术分享 | 如何根据 MySQL 崩溃日志找到已修复的 BUG 内容

很明显,第二个找到的是 mysql 里文件,从官方上下载相同版本源码包进行解压,找过 pipeline_stats.h 这一文件中的410行,确定函数名为 Pipeline_member_stats()

技术分享 | 如何根据 MySQL 崩溃日志找到已修复的 BUG 内容

三、查看该函数变更内容

在 github上mysql 官方地址中找到这一文件

https://github.com/mysql/mysq...

技术分享 | 如何根据 MySQL 崩溃日志找到已修复的 BUG 内容

搜索相应的关键字到该位置

技术分享 | 如何根据 MySQL 崩溃日志找到已修复的 BUG 内容

网址上默认为8.0最新版本的代码,取下来和8.0.18版本的代码进行对比

技术分享 | 如何根据 MySQL 崩溃日志找到已修复的 BUG 内容

四、查看变更内容历史

通过对比工具,可以看出该段函数代码,存在部分的更改,接下来,再看看变更这部分代码的原因,打开左侧的 Blame ,可以看出历史的变更记录

技术分享 | 如何根据 MySQL 崩溃日志找到已修复的 BUG 内容

技术分享 | 如何根据 MySQL 崩溃日志找到已修复的 BUG 内容

技术分享 | 如何根据 MySQL 崩溃日志找到已修复的 BUG 内容

该函数内大部分的变更都是由于 Bug#30049349 引起,可以进去看看 bug 详细的内容,文章中指出 stop group_replication 时,进行P_S查看有几率造成数据库 crash,修复的方式是在 stop group_replication 的时候,给P_S中的相关表加一个读写锁,禁止查询

技术分享 | 如何根据 MySQL 崩溃日志找到已修复的 BUG 内容

在 MySQL 官网的 Release Notes 里也能找到是在8.0.20版本修复该bug

技术分享 | 如何根据 MySQL 崩溃日志找到已修复的 BUG 内容

还可以从整个文件的 History 中查看历史更改

技术分享 | 如何根据 MySQL 崩溃日志找到已修复的 BUG 内容

五、结语

文章内主要提到通过 error 日志找到当前已经修复的 bug 。碰到 error 日志中有上述报错,应该先对崩溃前的报错进行分析,部分的崩溃报错不用通过堆栈的方式定位就能找到问题。如碰到目前还未修复或者修复 bug 时并没有对该段代码进行直接修改时,可能会失效,这时候需要对堆栈指向的代码进行梳理,搞清楚这部分逻辑,再分析。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
Java中Class对象详解
<divclass"htmledit\_views"id"content\_views"<phttps://blog.csdn.net/mcryeasy/article/details/52344729<br</p<p待优化整理总结</p<p</p<h1style"padding:0px;fontfamily:'apple
Stella981 Stella981
3年前
Django之Django模板
1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
MySQL数据库InnoDB存储引擎Log漫游(1)
作者:宋利兵来源:MySQL代码研究(mysqlcode)0、导读本文介绍了InnoDB引擎如何利用UndoLog和RedoLog来保证事务的原子性、持久性原理,以及InnoDB引擎实现UndoLog和RedoLog的基本思路。00–UndoLogUndoLog是为了实现事务的原子性,
Stella981 Stella981
3年前
Dubbo爆出严重漏洞!可导致网站被控制、数据泄露!附解决方案
http://dy.163.com/v2/article/detail/F5FPIFRU0511Q1AF.html  !(http://dingyue.ws.126.net/2020/0216/125ec4c4p00q5rcrs0019d200ig009qg00ig009q.png)  来源:华为云  原文地址:https://w
Stella981 Stella981
3年前
JFinal使用笔记2
大部分步骤按cf官方的教程就可以了。遇到的问题如下:1、使用C3p0Plugin配置数据库连接,代码如下//配置C3p0数据库连接池插件//C3p0Pluginc3p0PluginnewC3p0Plugin(getProperty("jdbcUrl"),getProperty("user"),getP
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
3年前
C++笔记002:VS2010报错:LINK fatal error LNK1123 转换到 COFF 期间失败文件无效或损坏
 原创笔记,转载请注明出处!点击【关注】,关注也是一种美德~错误描述:1已启动生成:项目:FirstCode,配置:DebugWin321生成启动时间为2018/2/521:00:30。1InitializeBuildStatus:1 正在
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(