【通知】SHOW PROCESSLIST死锁Bug说明

MySQL官方在8.0.28版本中,为每个会话引入了LOCK_thd_security_ctx锁(Bug#32320541),该锁的引入使得MySQL在执行SHOW PROCESSLIST语句时可能形成死锁。本文将介绍这一类死锁问题的发生原因及解决方案。

涉及版本

涉及的RDS MySQL 8.0小版本包括:

  • 20220830

  • 20221121

  • 20221231

  • 20230324

形成条件

MySQL官方Bug Report详见外部Bug系统:Bug#110494,以下简述形成死锁的条件:

  • 执行SHOW PROCESSLIST命令,获取锁顺序为LOCK_thd_removeLOCK_thd_security_ctx

  • 执行COM_CHANGE_USER命令,获取锁顺序为LOCK_thd_security_ctxLOCK_status

  • 执行COM_STATISTICS命令或FLUSH STATUS命令或开启Performance Agent功能,获取锁顺序为LOCK_statusLOCK_thd_remove

上述三项条件同时成立后,就有可能形成LOCK_thd_remove->LOCK_thd_security_ctx->LOCK_status->LOCK_thd_remove的死锁环。

影响

LOCK_thd_remove锁和LOCK_status锁会对实例造成较大影响,具体体现在以下方面:

  • 连接无法退出,如果一直有新连接建立,最终会导致连接数达到上限,无法连接实例。

  • SHOW GLOBAL STATUS等语句无法执行,实例监控数据无法采集。

  • Performance Agent停止记录,丢失监控数据。

解决方案

RDS MySQL小版本20230610及以上,对SHOW PROCESSLIST语句时可能形成死锁的问题进行了修复,对此建议用户检查当前版本并根据情况升级小版本。详情请参见升级内核小版本