show processlist 经常漏掉关键连接,因权限限制(普通用户仅见自身连接)、默认限100行、info列为空(sleep状态或show_query_in_processlist=off);应查information_schema.processlist并过滤command!='sleep'且time>0。

直接执行 SHOW PROCESSLIST 就能看到当前所有连接,但默认只显示前100条、SQL被截断、且普通用户看不到别人进程——这三点不处理,等于白查。
为什么 SHOW PROCESSLIST 经常漏掉关键连接?
不是命令失效,是权限和配置共同拦住了你:
- 没
PROCESS权限时,只能看到自己发起的连接;root或授权用户才看全 - 默认最多返回 100 行,连接数超了就直接砍掉后面的结果
-
INFO列为空或显示NULL,常见原因有两个:一是连接处于Sleep状态(没在跑 SQL),二是系统变量show_query_in_processlist被设为OFF(MySQL 8.0+ 默认开启,但某些 RDS 实例可能关了)
怎么查到真正“正在干活”的连接?
光看数量没用,得筛掉长期空闲的假活跃:
-
COMMAND != 'Sleep'是基本过滤条件,但还不够——比如Connect状态持续几秒,大概率是短连接滥用,不是真业务逻辑在跑 -
TIME > 0更可靠:表示该线程已持续当前状态超过 1 秒,Query+TIME > 60才值得优先盯 -
STATE比COMMAND更细:同为Query,Sending data和Copying to tmp table的优化方向完全不同 - 推荐这条查询:
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM information_schema.PROCESSLIST WHERE COMMAND != 'Sleep' AND TIME > 0 ORDER BY TIME DESC LIMIT 20;
KILL 前必须确认的三件事
杀错线程比不杀更危险:
- 确认
ID对应的是应用连接,不是system user(复制线程)、event_scheduler或Binlog Dump(主从同步线程) - 优先用
KILL QUERY <var>thread_id</var>中断 SQL,保留连接;只有确认是泄漏连接时才用KILL CONNECTION <var>thread_id</var>(MySQL 5.7+) - 执行后别立刻刷新——被杀线程会先进入
Killed状态,几秒后才真正消失;反复刷新可能误判“没生效”而重复操作
真正难的不是列出进程,而是判断哪些该留、哪些该杀。比如 PHP-FPM 进程池开 32,却看到 200+ Sleep 连接,说明连接池没配对;Java 应用 HikariCP 的 maximumPoolSize=20,却持续出现 50+ Connect 状态,基本就是连接未 close 导致泄漏。这些细节,光靠 SHOW PROCESSLIST 看不出来,得回头翻应用配置。











