捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash

3、流程引擎下载安装与部署 camunda有多种使用方式,此处先使用独立平台的方式部署引擎,这种用法适合分布式,微服务化,多语言异构系统的使用方式。 阅读详情

作者:卢文双 资深数据库内核研发

背景

近期线上MySQL 5.7.20集群不定期(多则三周,短则一两天)出现主库mysql crash、触发主从切换问题,堆栈信息如下;

从堆栈信息可以明显看出,在调用 try_acquire_lock_impl 时触发的crash。

分析

在官方Bug库未搜到类似问题,转而从代码库入手,搜到对应的BUG —— 8bc828b982f678d6b57c1853bbe78080c8f84e84:

BUG#26502135: MYSQLD SEGFAULTS IN

              MDL_CONTEXT::TRY_ACQUIRE_LOCK_IMPL

ANALYSIS:
=========
Server sometimes exited when multiple threads tried to
acquire and release metadata locks simultaneously (for
example, necessary to access a table). The same problem
could have occurred when new objects were registered/
deregistered in Performance Schema.

The problem was caused by a bug in LF_HASH - our lock free
hash implementation which is used by metadata locking
subsystem in 5.7 branch. In 5.5 and 5.6 we only use LF_HASH
in Performance Schema Instrumentation implementation. So
for these versions, the problem was limited to P_S.

The problem was in my_lfind() function, which searches for
the specific hash element by going through the elements
list. During this search it loads information about element
checked such as key pointer and hash value into local
variables. Then it confirms that they are not corrupted by
concurrent delete operation (which will set pointer to 0)
by checking if element is still in the list. The latter
check did not take into account that compiler (and
processor) can reorder reads in such a way that load of key
pointer will happen after it, making result of the check
invalid.

FIX:
====
This patch fixes the problem by ensuring that no such
reordering can take place. This is achieved by using
my_atomic_loadptr() which contains compiler and processor
memory barriers for the check mentioned above and other
similar places.

The default (for non-Windows systems) implementation of
my_atomic*() relies on old __sync intrisics and implements
my_atomic_loadptr() as read-modify operation. To avoid
scalability/performance penalty associated with addition of
my_atomic_loadptr()'s we change the my_atomic*() to use
newer __atomic intrisics when available. This new default
implementation doesn't have such a drawback.

大体含义是:

当多个线程分别同时获取、释放metadata locks时,或者在 Performance Schema 中注册/撤销新的object时,可能会触发该问题,导致 mysql server crash。

该问题是 LF_HASH(Lock-Free Extensible Hash Tables) 的BUG引起的,那么 LF_HASH 用在什么地方呢?

  1. 在5.5、5.6中只用在 Performance Schema Instrumentation 模块。
  2. 在5.7中也用于metadata加锁模块。

问题出在my_lfind() 函数中,该函数针对cursor->prev的判断未考虑CAS,该patch通过使用 my_atomic_loadptr() 解决了该问题:

diff --git a/mysys/lf_hash.c b/mysys/lf_hash.c
index dc019b07bd9..3a3f665a4f1 100644
--- a/mysys/lf_hash.c
+++ b/mysys/lf_hash.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
+/* Copyright (c) 2006, 2017, Oracle and/or its affiliates. All rights reserved.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -83,7 +83,8 @@ retry:
   do { /* PTR() isn't necessary below, head is a dummy node */
     cursor->curr= (LF_SLIST *)(*cursor->prev);
     _lf_pin(pins, 1, cursor->curr);
-  } while (*cursor->prev != (intptr)cursor->curr && LF_BACKOFF);
+  } while (my_atomic_loadptr((void**)cursor->prev) != cursor->curr &&
+                              LF_BACKOFF);
   for (;;)
   {
     if (unlikely(!cursor->curr))
@@ -97,7 +98,7 @@ retry:
     cur_hashnr= cursor->curr->hashnr;
     cur_key= cursor->curr->key;
     cur_keylen= cursor->curr->keylen;
-    if (*cursor->prev != (intptr)cursor->curr)
+    if (my_atomic_loadptr((void**)cursor->prev) != cursor->curr)
     {
       (void)LF_BACKOFF;
       goto retry;

解决

查看change log,该问题在5.7.22版本修复的:

A server exit could result from simultaneous attempts by multiple threads to register and deregister metadata Performance Schema objects, or to acquire and release metadata locks. (Bug #26502135)

升级内核版本到5.7.29,之后巡检1个月,该问题未再出现,问题解决。

PS:

篇幅有限,在后续文章中会单独分析 MDL、LF_HASH 源码,敬请关注。


欢迎关注我的微信公众号【数据库内核】:分享主流开源数据库和存储引擎相关技术。

标题网址
GitHubhttps://dbkernel.github.io
知乎https://www.zhihu.com/people/…
思否(SegmentFault)https://segmentfault.com/u/db…
掘金https://juejin.im/user/5e9d3e…
开源中国(oschina)https://my.oschina.net/dbkernel
博客园(cnblogs)https://www.cnblogs.com/dbkernel
【云原生技术】SonarQube 生态中PMD插件和P3C插件详细介绍 4. 在项目中如何选择 / 组合 1. 小团队、对《阿里规约》认同度高 → 直接启用 **P3C**,配合 SonarJava 基本够用。 2. 追求全面 Bug/安全检测 + 额外编码规范 → **SonarJava + PMD**(必要时加 P3C 少量规则)。 3. 大型多团队,希望“一本规约”统一风格 → **P3C 为主**,再补充 SonarJava/PMD 的 Bug 与安全规则。 4. 通过 Quality Gate 控制:将 **Blocker/Critical** Bug 阅读详情

相关推荐

matebookego win11 arm 系统安装安卓子系统

一般的x86电脑如果安装android子系统,运行安卓子系统,由于要将android arm代码转译为x86代码,所以效率不一定高,但是如果电脑是arm架构的,通过安卓子系统运行android的程序执行效率就会 高不少,本文参考,都是在win11 home版本下的。两者跑分在cpu上差不太多了,大约是枭龙855的水平了,这个水平的子系统就有一定的实用性了,玩个一般游戏,刷个抖音都很流畅的。启动子系统后,点击左上角的设置,启用 “开发人员模式”。然后就可以再通运运行华为应用商店来进行安装其它应用了。

babytiger的专栏 1万+

mysql5.7的高危漏洞_某国产数据库发现超高危漏洞 可能存在重大风险

原标题:某国产数据库发现超高危漏洞 可能存在重大风险近日,某国产数据库确认存在一超高危漏洞,可能导致重大安全风险。该漏洞被“国家信息安全漏洞库”(CNNVD)发布并得到数据库厂商官方确认,漏洞编号CNNVD-201702-977。这是目前该国产数据库被确认的唯一超高危漏洞,利用此漏洞可以直接夺取操作系统最高控制权限。通常,我们按照对数据库的机密性、完整性和可用性的影响程度,对安全漏洞进行等级评定,...

weixin_42393829的博客 1480

TCN(Temporal Convolutional Networks)时序卷积网络详解及代码

TCN(Temporal Convolutional Networks)时序卷积网络详解及代码

zhulewen的博客 7884

MySQL Workbench Could not acquire management access for administration

MySQL数据库操作

m0_58285786的博客 2335

【ESP32 S3 开发】基于I2S协议驱动INMP441数字麦克风 实现语音采集

注意INMP441的 L/R接地之后才稳定输出数据 否则一直都是0WAV格式说明这里主要是想说wav文件重要的就是生成一个wavhead来标识它是一个wave文件,wave文件的data chunk 中的data部分还是PCM编码格式的数据,直接从I2S读进去就可以,不需要压缩。wav文件的头一般由4个chunk组成。 以16bit深度为例,代码如下。其他深度可以根据注释自行计算。 I2S -> DAC i2s_read()函数,向flash中划分的一个buff当中读入byte数组。以16bit深度为例,一

m0_43395703的博客 1万+

永久关闭Windows更新的5种方法

很多家用电脑,如果系统自动更新的话,会变得越来越卡顿,且硬件型号兼容也并不完美。那么我们该如何彻底关闭Win11的自动更新呢?以下准备了5种方法,您可以根据自身实际情况选择合适的方法!

qq_43652793的博客 1万+

MySQL Workbench显示could not acquire management处理方法

没有运行的话,右击启动即可。

u012861256的博客 1809

基于STM32、HAL库的W25Q01JVZEIQ TR FLASH存储器驱动应用程序设计

1Gb (128MB),分为512个可擦除块(block),每个块256KB。:块擦除约30-50ms,芯片擦除约30s。:标准SPI (支持1/2/4线模式)// 初始化CS引脚为高电平。// 擦除扇区(4KB)// 初始化Flash。/* 状态寄存器位 *//* 指令定义 *//* 超时定义 *//* 函数声明 */

corlin6688的博客 268

应用CVE: 最新的Mysql高危漏洞介绍

没学过的同学也不要慌,可以去B站搜索相关视频,你搜关键词网络安全工程师会出现很多相关的视频教程,我粗略的看了一下,排名第一的视频就讲的很详细。影响5.6.38及之前的版本,5.7.19及之前的版本。从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。不过我们这个水平也就算个渗透测试工程师,也就只能做个基础的安全服务,而这个领域还有很多业务,像攻防演练、等保测评、风险评估等,我们的能力根本不够看。

dzqxwzoe的博客 1450

SAP 系统中的数字签名解决方案及应用案例分析

在当前企业信息化及数字化转型的大背景下,数据安全与身份认证显得尤为重要。数字签名技术作为保障数据真实性和完整性的重要手段,在 SAP 系统中得到了广泛应用。本文将详细探讨 SAP 系统中部分应用场景如何利用数字签名技术满足业务需求,涵盖 SAP Single Sign-On、质量管理、过程工业生产计划以及 SAP ArchiveLink 内容服务器等方面,力求通过深入解读,帮助读者更好地理解和应用这一关键技术。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 529

置顶必读(2) | 《YOLOv11实战:从入门到深度优化》目录导航篇(持续更新中)

🏆 本文收录于 《YOLOv11实战:从入门到深度优化》 专栏。 本专栏系统梳理并持续复现全网各类 YOLOv11 / YOLO系列改进方案与实战案例,目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。 内容坚持 持续更新 + 深度拆解 + 工程落地导向,不仅讲“怎么改”,更讲“为什么这样改、如何真正落地到项目中”。

**My Coding Family** 11万+

mysql个版本bug_MySQL 5.7最新版本的2个bug

好久没写博客了,都长草了。新业务上了5.7没遇到什么问题,虽然没遇到什么问题,但不代表没有问题,我有个习惯就是没事就喜欢逛逛percona的Blog,于是看到目前最新GA版本5.7.17的2个bug,于是就搭建环境进行bug复现。目前知道的2个bug如下:1. slave_parallel_workers > 0,也就是开启了多线程复制的时候如果有延时,那么Seconds_Behind_Ma...

weixin_36046580的博客 743

十九、帧间预测编码_5、skip模式和direct模式

帧间预测的几种特殊模式: P_Skip: 即COPY模式,在该模式下无运动矢量残差,无像素预测残差。重建时以MVP作为实际运动矢量,以预测像素块作为重建; B_Skip:同P_Skip类似的是该模式下同样无运动矢量残差,无像素预测残差。重建时,以Direct模式获取双向MV,以预测像素块作为重建; B_Direct:B_Direct模式分为B_Direct_8x8和B_Direct_16x16,分别表示整个宏块和一个子块按照B_Direct模式编码。该模式下,无运动矢量残差,有像素预测残差。重建时,以D.

叮咚的博客 2396

mysql5.7lock变化,捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash

背景近期线上MySQL 5.7.20集群不定期(多则三周,短则一两天)出现主库mysql crash、触发主从切换问题,堆栈信息如下;从堆栈信息可以明显看出,在调用 try_acquire_lock_impl 时触发的crash。分析BUG#26502135: MYSQLD SEGFAULTS INMDL_CONTEXT::TRY_ACQUIRE_LOCK_IMPLANALYSIS:=======...

weixin_30188669的博客 236

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

MySQL 的这个 BUG,坑了多少人?

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏原创 | Java 2020超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析...

weixin_44421461的博客 296

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

mysql 5.7.12 bug_当在mysql5.7上发现这个bug,小心脏不好受了

近期连续很长一段时间忙成狗, 没有写些文章来跟大家分享。现在接近晚上12点,但还是准备把这个bug简单分享出来。发现这个bug已有半天,现在提起来,依然心有余悸。因此将其尽早分享出来,希望各位mysql dba朋友尽量别踏入这个雷区。 到底有多严重, 请看下面的测试结果:(这个bug的线索来源一个不曾相识的朋友,前段时间通过邮件向作者请教这个问题,因为太忙,没有顾上,当时也不以为然。今天抽时间来复...

weixin_29437633的博客 262

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MySQL 的这个 BUG,到底坑了多少人….

推荐阅读:阿里P8架构师谈:工作1-5年的Java工程师,怎样提高核心竞争力 阿里架构师直言:“没有实战都是纸上谈兵”!Redis实战PDF分享 奋发图强半年多,终于四面阿里如愿拿到心仪offer定级P7 问题描述 近期,线上有个重要Mysql客户的表在从5.6升级到5.7后master上插入过程中出现"Duplicate key"的错误,而且是在主备及RO实例上都出现。以其中一个表为例,迁移前通过“show create ta...

文章中资料均可获取,有需要请添加yunduoa2019即可 491

MySQL5.7 处理错误1405及碰到的系列错误

MySQL5.7 处理错误1405及碰到的系列错误

李哈哈的博客 1373

这个 MySQL bug 99% 的人会踩坑!

这周收到一个 sentry 报警,如下 SQL 查询超时了。

java_beautiful的博客 265

Windows 2008 R2上MySQL5.7异常关闭,报错:mysqld got exception 0xc000001d问题解决

Windows 2008 R2上安装了MySQL5.7,Navicat连接也正常,但是部署了Web服务的Jar包(数据展示大屏的服务,涉及大量查询和计算)后,刷新浏览器或者自动刷新后,MySQL的服务就会挂掉,打开Windows事件查看器,显示报错代码7034,MySQL日志中找到错误:mysqld got exception 0xc000001d,找到问题所在就是MySQL5.7自身的bug,百度之后找到该问题的解决方案,就是打2008 sp1的补丁就可以了,微软官方下载:windows6.1-KB976

Canpliy的专栏 985

MySQL 数据库崩溃(crash)的常见原因和解决办法

墨墨导读:本文来自墨天轮用户投稿,详述MySQL 数据库崩溃(crash)的常见原因和解决办法,希望对大家有帮助。数据技术嘉年华,十周年盛大开启,点我立即报名!大会以“自研·智能·新基建...

Enmotech的博客 4927

MySQL 5.7 mysqldump的Bug导致复制异常

DB版本:5.7.17 问题描述:mysqldump逻辑搭备库都相信大家都使用的非常普遍,大致做法如下: 1、在源库上mysqldump --single-transaction --master-data=2 -A ... >XXX.sql 2、在目标备库上stop slave;reset master; reset slave all; source XXX.sql ...

weixin_30401605的博客 267

mysql5.7的高危漏洞_应用CVE: 最新的Mysql高危漏洞介绍

MySQL官方最近做了一个大的安全漏洞补丁,修复了25 个安全漏洞,关于这些漏洞细节官方和媒体目前为止还有比较少的介绍和分析文章。在此笔者搜集下相关的详细,从邮件讨论组趴到一些细节信息,在此介绍一下几个比较重要的、高危的漏洞。包括CVE-2018-2696,CVE-2018-2591和CVE-2018-2562。 CVE-2018-2696 mysql: sha256_password 认证长密码拒绝式攻击 该漏洞源于MySQL sha256_password认证插件,该插件没有对认证密码的长度进行限制

Aplumage的专栏 8754

MySQL基础单词

五天掌握MySQL基础单词

小贺想改变 2811

mysql 5.7 漏洞_应用CVE: 最新的Mysql高危漏洞介绍

MySQL官方最近做了一个大的安全漏洞补丁,修复了25 个安全漏洞,关于这些漏洞细节官方和媒体目前为止还有比较少的介绍和分析文章。在此笔者搜集下相关的详细,从邮件讨论组趴到一些细节信息,在此介绍一下几个比较重要的、高危的漏洞。包括CVE-2018-2696,CVE-2018-2591和CVE-2018-2562。CVE-2018-2696 mysql: sha256_password 认证长密码...

weixin_31212247的博客 5882

mysql漏洞补丁升级_mysql 5.7 高危漏洞及升级修复步骤

mysql 2018 1月份出了3个高危漏洞,影响范围很大,涉及到5.6,5.7, 尤其是"CVE-2018-2696" 长密码拒绝式攻击:CVE-2018-2562 MySQL分区未指定的漏洞漏洞源于Oracle MySQL服务器分区组件。影响5.5.58及之前版本,5.6.38及之前的版本,5.7.19及之前的版本。该漏洞允许低权限通过多种协议对服务器进行拒绝式攻击,也可以无需授权更新、插入...

weixin_29149931的博客 1万+
上一篇: 问题定位 | Peronca Xtrabackup 8.0近日踩坑总结 - xtrabackup 2.4和8.0区别
下一篇: 技术分享 | 如何为你的代码选择一个合适的开源协议?
dbkernel
博客等级 码龄4年 60粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值