mysql hang_MySQL所有操作hang住了,怎么破?

原标题:MySQL所有操作hang住了,怎么破?

作者介绍

王松磊,现任职于UCloud,从事MySQL数据库内核研发工作。主要负责UCloud云数据库udb的内核故障排查工作以及数据库新特性的研发工作。

系统环境

CentOS release 6.7

MySQL社区版MySQL-5.5.24

故障简述

首先收到故障告警,所有的监控无法读取到数据。稍后收到客户的反馈,无法正常连接数据库。

故障排查

1、尝试登陆数据库

发现登陆发生hang住的情况,无法正常连接。无任何提醒信息报出。

shell>mysql -h192.168.150.21 -P50001 -uabc -pabc

shell>mysql -S /var/lib/mysql/mysql.sock -uabc -pabc

2、查看错误日志

错误日志完全正常,无任何错误日志报出。

3、使用pstack

使用pstack工具查看进程内各个线程的堆栈信息。执行命令:

shell>pstack > pstack.log

将堆栈日志存放到pstack.log文件中,分析堆栈日志的内容。发现存在很多线程处于等待线程互斥量mutex的状态,并且等待的mutex是两个不同的mutex,猜测是因为源码内存在bug,所以造成了进程死锁:

fdf08daa904adc562e00fe71ccd18228.png

66a5c545fc699edb3f067c9fcd301cbd.png

其中线程2和线程3分别在等待不同的mutex。

71ca1c4e315a06b08bd787ae8ee61255.png

而其它新连接或者已经连接无应答的进程,也在等待其中的一个mutex。

4、使用gdb查看具体信息

执行如下命令attach到mysqld进程,查看当前线程堆栈的具体情况。

shell>gdb -p

执行命令info thread查看线程的具体信息,发现很多线程均在等待锁信息。通过上面描述的pstack日志信息,我们知道线程2和线程3存在等待不同锁的行为且可疑性比较高。

09227a8b6b7fa13199cf44d50a88d87a.png

切换到线程2查看,线程在等待的mutex为LOCK_index。

7e7ec64f23f1a2fbad8a28889a9fc373.png

切换到线程3查看,线程在等待的mutex为LOCK_thread_count。

bb0c93ab82245181283f50895c440b68.png

由此猜测,是源码中由于存在LOCK_index和LOCK_thread_count相互等待的BUG,导致两个mutex均未被释放,从而发生死锁情况。其它需要获得锁的操作均发生一致等待的情况(即发生hang住)。

5、查看源码

根据gdb调试中线程2和线程3的信息,查看命令purge binlog和reset master对应的源码。查看发现两个命令对于LOCK_thread_count和LOCK_index调用顺序是不同的。导致同时执行时会发生相互等待,发生死锁的情况。

94fb0acffa2414a0bc60a0d649e838fa.png

解决问题

通过与客户沟通,得到确认,客户同时执行了purge binlog和reset master命令。最终也确认了我们的猜想,由于上述原因导致了问题的产生。

在查看官方修复后,发现该bug已经修复。升级到高版本,将客户数据迁移后解决了此问题。

相关专题:

精选专题(官网:dbaplus.cn)

◆MVP专栏 ◆

丨丨丨丨

丨丨丨丨

◆近期活动 ◆

云数据库架构设计与实践沙龙火热报名中返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值