加入收藏 | 设为首页 | 会员中心 | 我要投稿 淮北站长网 (https://www.0561zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

一个罕见的MySQL redo死锁问题排查及解决过程

发布时间:2021-01-08 06:08:18 所属栏目:安全 来源:网络整理
导读:副标题#e# 《一个罕见的MySQL redo死锁问题排查及解决过程》要点: 本文介绍了一个罕见的MySQL redo死锁问题排查及解决过程,希望对您有用。如果有疑问,可以联系我们。 作者:张青林,腾讯云布道师、MySQL架构师,隶属腾讯TEG-基础架构部-CDB内核开发团队,专

在问题一的排查过程中我们确定了 log_sys->mutex 的所属线程,这个线程在获得 log_sys->log_flush_order_mutex 的过程中 hang 住了,因此线程堆栈可以分以为下几类:

  • Thread 446,获得 log_sys->mutex,等待获取 log_sys->log_flush_order_mutex 以把脏页加入到 buffer_pool 的 flush list中;
  • 需要获得 log_sys->mutex 以写日志或者读取日志信息的线程;
  • 未知线程获得 log_sys->log_flush_order_mutex,在做其它事情的时候被 hang 住.

因此,问题的关键是找到哪个线程获取了 log_sys->log_flush_order_mutex.

为了找到相关的线程做了以下操作:

  • 查找获取 log_sys->log_flush_order_mutex 的地方;

  • 结合现有 pstack 中的线程信息,仔细查看上述查找结果中的相关代码,发现基本没有线程获得 log_sys->log_flush_order_mutex;
  • gdb 进入 MySQL Server,将 log_sys->log_flush_order_mutex 打印出来,发现 {waiters=1; lock_word= 0}!!!,即 Thread 446 在等待一个空闲的 mutex,而这个Mutex也确实被等待,由于我们的版本为 Release 版本,所以很多有用的信息没有办法得到,而若用 debug 版本跑则很难重现问题,log_flush_order_mutex 的定义如下:

由以上的分析可以得出 问题二 的答案:

  • 只有两个线程和log_sys->log_flush_order_mutex有关,其中一个是 Thread 446 线程,另外一个则是最近一次调用 log_flush_order_mutex_exit() 的线程;
  • 现有线程中某个线程在释放log_sys->log_flush_order_mutex的过程中没有唤醒 Thread 446,导致Thread 446 hang 并造成其它线程不能获得 log_sys->mutex,进而造成实例不可用;
  • log_sys->log_flush_order_mutex 没有被任何线程获得.

3、问题三:绝处逢生

由问题二的分析过程可知 log_sys->log_flush_order_mutex 没有被任何线程获得,可是为什么 Thread 446 没有被唤醒呢,信号丢失还是程序问题?如果是信号丢失,为什么可以稳定复现?官方的bug list 列表中是没有类似的 Bug的,搜了一下社区,发现可用信息很少,这个时候分析好像陷入了死胡同,心里压力开始无形中变大……好像没有办法,但是任何问题都是有原因的,找到了原因,也就是有解的了……再一次将注意力移到了 Thread 446 的堆栈中,然后查看了函数:

(编辑:淮北站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读