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_remove
、LOCK_thd_security_ctx
。执行
COM_CHANGE_USER
命令,获取锁顺序为LOCK_thd_security_ctx
、LOCK_status
。执行
COM_STATISTICS
命令或FLUSH STATUS
命令或开启Performance Agent功能,获取锁顺序为LOCK_status
、LOCK_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
语句时可能形成死锁的问题进行了修复,对此建议用户检查当前版本并根据情况升级小版本。详情请参见升级内核小版本。