直接执行 SHOW PROCESSLIST 可查看当前 MySQL 非 Sleep 状态的活跃连接;需 SUPER/PROCESS 权限加 FULL 才能显示完整 SQL。Id、User、Host 用于定位会话来源,State 和 Time 组合判断异常(如 Sending data 超时、Sleep 时间过长),information_schema.PROCESSLIST 更适合脚本过滤,但 INFO 列通常为空。

如何用 SHOW PROCESSLIST 查看当前活跃连接
直接执行 SHOW PROCESSLIST 就能看到当前 MySQL 实例中所有非 Sleep 状态的连接(即正在执行或等待执行的会话)。默认只显示当前用户发起的连接;要查看全部,需有 SUPER 或 PROCESS 权限,并加 FULL 关键字(如 SHOW FULL PROCESSLIST)才能看到完整 SQL 语句(否则长查询会被截断)。
Id、User、Host 这几列怎么看
这几列是定位问题连接的关键:
-
Id是连接唯一标识,后续可用来KILL <code>Id终止指定会话 -
User显示登录用户名,注意区分应用连接池用的统一账号和实际业务逻辑归属 -
Host包含 IP 和端口(如10.20.30.40:56789),能帮你判断是否来自预期服务节点,或发现异常来源(比如开发机直连生产库) - 若
Host显示localhost,说明是 Unix socket 连接,不走 TCP/IP,常见于本地脚本或运维工具
重点关注 State 和 Time 列
这两列组合起来最能反映连接是否异常:
-
State = 'Sending data'持续几十秒以上,大概率是大结果集未分页或网络慢 -
State = 'Locked'或'Waiting for table metadata lock'表示被 DDL 或长事务阻塞 -
Time值很大但State = 'Sleep',说明连接空闲但没释放——这是连接池配置不当或应用未 close 的典型表现 -
Time > 0且Command = 'Sleep'的连接越多,越可能撑爆max_connections
替代方案:查 information_schema.PROCESSLIST 表
比命令行更灵活,适合写监控脚本或过滤特定条件:
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM information_schema.PROCESSLIST WHERE TIME > 60 AND COMMAND != 'Sleep';
注意:INFO 列默认为 NULL(权限限制),即使有 FULL 权限,在该视图中也看不到完整 SQL;想获取真实执行语句,还是得靠 SHOW FULL PROCESSLIST 或开启 Performance Schema。
真正难处理的不是“怎么查”,而是区分哪些连接该杀、哪些只是暂时卡住;尤其在读写分离或连接池复用场景下,Host 和 Time 的组合解读比单纯数连接数重要得多。


















