show processlist 默认仅显示前100行且截断sql,需用show full processlist(需process权限)查看完整语句;活跃连接应筛选command!='sleep'且time>0;连接暴增时重点分析host、user、time、state,并结合应用连接池配置判断是否泄漏。

直接执行 SHOW PROCESSLIST 就能看到当前所有活跃连接进程,但默认只显示前100条且不显示完整SQL语句——这是最常被忽略的限制。
为什么 SHOW PROCESSLIST 有时看不到全部连接?
MySQL 默认限制返回结果为100行,且当 SQL 语句长度超过 max_allowed_packet 或被截断时,Info 列会显示为 NULL 或省略内容。普通用户执行该命令还可能只能看到自己的连接(取决于 PROCESS 权限)。
- 用
SHOW FULL PROCESSLIST强制显示完整 SQL(注意:这会暴露敏感查询逻辑,生产环境慎用) - 需要
PROCESS权限才能看到其他用户的连接;否则只返回当前用户自己的进程 - 若结果为空但实际有连接,先检查是否被权限或行数限制过滤掉了
如何查出真正“活跃”的连接(排除 Sleep 状态)?
SHOW PROCESSLIST 返回的 Command 列标识连接状态,Sleep 表示空闲等待,Query、Execute、Commit 等才代表正在工作。单纯看“数量”没意义,得筛掉长期 Sleep 的连接。
- 在 MySQL 5.7+ 中可结合
INFORMATION_SCHEMA.PROCESSLIST查询并过滤:SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND TIME > 0;
-
TIME列单位是秒,表示该线程持续当前状态的时间,> 0 通常意味着它正在执行或卡住 - 注意
INFORMATION_SCHEMA.PROCESSLIST是只读视图,不能加FOR UPDATE或写操作
连接数暴增时,怎么快速定位源头?
光看进程列表不够,得关联客户端信息和资源消耗。重点看 HOST、USER、TIME 和 STATE 四列组合。
-
HOST显示 IP + 端口(如192.168.1.10:54321),可反向排查是哪个应用实例发起的 - 频繁出现
State: Sending data或Copying to tmp table说明查询本身有性能问题,不是连接管理的问题 - 如果大量连接
Command: Connect且Time很小,大概率是连接池未复用或短连接滥用 - 用
mysqladmin -u root -p processlist -v命令行工具也能输出更紧凑的格式,适合脚本解析
真正难的不是查到连接,而是区分哪些是合理长连接、哪些是泄漏的僵尸连接——得结合应用架构看连接生命周期,比如 PHP-FPM 的 pm.max_children、Java 应用的 HikariCP maximumPoolSize 配置,都直接影响这里看到的数字。











