升级MySQL至5.7后SHOW FULL PROCESSLIST无法显示全部活跃进程
MySQL 5.7.38升级后SHOW FULL PROCESSLIST无法显示部分慢查询的原因及解决办法
可能的原因
- 短连接或连接池复用场景:如果后端用短连接,查询执行完毕后连接直接关闭,对应线程销毁,不会出现在
PROCESSLIST中;若使用连接池,查询结束后连接被立刻复用,线程状态切换为sleep,容易被忽略。 - Performance Schema与传统PROCESSLIST的行为差异:MySQL 5.7默认启用Performance Schema,部分场景下
SHOW FULL PROCESSLIST仅展示连接线程的基础状态,无法捕获已进入执行阶段但未在传统线程模型中暴露的查询。 - 5.7版本PROCESSLIST的兼容性变更:MySQL 5.7对
SHOW FULL PROCESSLIST和INFORMATION_SCHEMA.PROCESSLIST的实现做了调整,针对InnoDB事务内的查询、快速终止的查询(如应用主动中断),可能不会被列表捕获。 - processlist_timeout阈值限制:若慢查询实际执行时间短于
processlist_timeout默认的10秒,线程信息可能被快速清理,导致查询时看不到。
解决配置及排查方法
- 改用Performance Schema查询线程与执行信息
- 确认Performance Schema已启用:
若值为SHOW VARIABLES LIKE 'performance_schema';OFF,在AWS RDS参数组中设置performance_schema = ON并重启实例。 - 查询完整的线程及当前执行语句:
这两个表能捕获-- 查看所有活跃线程 SELECT * FROM performance_schema.threads WHERE PROCESSLIST_ID IS NOT NULL; -- 查看指定线程的当前执行语句 SELECT * FROM performance_schema.events_statements_current WHERE THREAD_ID = <目标线程ID>;SHOW FULL PROCESSLIST遗漏的查询,包括刚执行完、处于事务中的语句。
- 确认Performance Schema已启用:
- 调整兼容与超时参数
- 启用5.6兼容模式:在参数组中设置
show_compatibility_56 = ON,让SHOW FULL PROCESSLIST行为和5.6版本一致,避免版本变更导致的显示差异。 - 调大processlist_timeout:执行
SHOW VARIABLES LIKE 'processlist_timeout';,若当前值过小,可调整为60秒左右,延长线程信息的保留时间(注意不要过大导致内存占用过高)。
- 启用5.6兼容模式:在参数组中设置
- 开启慢查询日志(最可靠的排查方式)
在AWS RDS参数组中配置以下参数:
慢查询日志会完整记录所有符合条件的查询,不受slow_query_log = ON long_query_time = 1 # 记录执行时间超过1秒的查询,可按需调整 log_queries_not_using_indexes = ON # 可选,记录未使用索引的查询PROCESSLIST的限制,是排查升级后索引误用问题的核心手段。 - 过滤PROCESSLIST中的睡眠线程
执行以下语句仅查看活跃查询线程:SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep';
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

