最直接方式是执行show processlist,可即时查看所有活跃及休眠连接的状态、sql语句和运行时长等;需process权限才能查看全部连接,info字段可能因权限或配置为空,time表示当前状态持续时间而非连接时长,state比command更细粒度反映执行阶段。

用 SHOW PROCESSLIST 查看当前连接进程
这是最直接的方式,能立刻看到所有活跃(及休眠)连接的状态、执行语句、运行时长等关键信息。默认只显示当前用户发起的连接;加 PROCESS 权限后,SHOW FULL PROCESSLIST 才能看到全部。
-
SHOW PROCESSLIST返回字段包括ID(进程ID)、USER、HOST、DB(当前数据库)、COMMAND(如Query、Sleep)、TIME(秒数)、STATE(如Sending data)、INFO(SQL语句,超长会被截断) - 如果
INFO显示为NULL,通常是因为该连接没在执行语句(比如处于Sleep状态),或用户权限不足无法读取他人查询内容 - 注意:
TIME是该线程持续空闲或执行的时间,不是连接建立时间;STATE比COMMAND更细粒度,比如同为Query,可能处于Copying to tmp table或Sorting result
用 information_schema.PROCESSLIST 做条件过滤
当连接数多、需要筛选特定状态或耗时连接时,SELECT 查询系统表比人工翻页更可靠。
- 例如查运行超过 60 秒的非 Sleep 连接:
SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 60 AND COMMAND != 'Sleep';
-
information_schema.PROCESSLIST的字段和SHOW PROCESSLIST一致,但支持WHERE、ORDER BY、LIMIT,也方便脚本调用 - 注意:该表不包含密码、敏感上下文,但
INFO字段仍受show_query_in_processlist系统变量控制——若设为OFF,所有INFO都是NULL,即使你有权限
识别并终止异常连接用 KILL
查到可疑连接后,靠 KILL 中止它,但得清楚杀的是线程 ID,不是连接 ID 或 PID。
- 语法很简单:
KILL <var>thread_id</var>(如KILL 12345),对应PROCESSLIST中的ID列 -
KILL QUERY <var>thread_id</var>只中断当前 SQL,线程保持连接;KILL CONNECTION <var>thread_id</var>(MySQL 5.7+)等价于KILL <var>thread_id</var>,断开整个连接 - 别误杀
system user或主从复制线程(COMMAND为Binlog Dump或Connect),否则可能中断复制 - 执行
KILL后,被杀线程不会立刻消失,STATE会短暂变为Killed,然后退出
为什么 SHOW PROCESSLIST 有时看不到某些连接?
这不是 bug,而是权限和配置共同作用的结果。
- 普通用户只能看到自己发起的连接;必须拥有
PROCESS权限才能看到全局列表(包括其他用户) - MySQL 8.0 默认开启
show_query_in_processlist,但若管理员显式关闭,所有用户的INFO字段都为空,哪怕你是 root - 某些云厂商(如阿里云 RDS)会限制
PROCESSLIST的可见性,或屏蔽部分字段,这是出于安全策略,不是你的权限问题
真正难的不是查连接,而是判断哪个该杀、哪个只是慢查询但还在合理范围内——TIME 和 STATE 要结合看,比如一个 Locked 状态持续 30 秒的 UPDATE,大概率是锁冲突,不是单纯慢。











