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語句時可能形成死結的問題進行了修複,對此建議使用者檢查目前的版本並根據情況升級小版本。詳情請參見升級核心小版本。