show processlist 返回当前mysql实例中正在运行的线程快照,仅显示用户有权限查看的活跃线程,不含已断开或历史连接,且受process权限控制。

SHOW PROCESSLIST 返回的是什么数据
SHOW PROCESSLIST 查出来的不是“所有连接历史”,而是当前 MySQL 实例里正在运行的线程快照。它只显示你有权限看到的线程(比如普通用户看不到其他用户的线程),且不包含已断开但尚未被回收的连接。
常见错误现象:SHOW PROCESSLIST 看不到某个“明明还在跑”的查询,大概率是它已经结束、被 kill 掉了,或者你没权限看(比如非 root 用户查不到系统用户线程)。
- 状态列(
State)比命令列(Command)更重要——Command是线程类型(如Query、Sleep),而State才反映真实执行阶段(如Sending data、Locked、Copying to tmp table) -
Time是该线程处于当前状态的秒数,不是总运行时间;超过 60 秒的Sleep线程通常是应用没正确关闭连接 - 如果
Host显示localhost,不代表是本地登录——可能是通过 socket 连接,也可能是127.0.0.1经过解析后的结果
为什么 root 用户也看不到全部线程
MySQL 5.7+ 默认开启 performance_schema,但 SHOW PROCESSLIST 本身仍受 PROCESS 权限控制。即使你是 root,如果账号被显式 REVOKE PROCESS ON *.* 过,也会被限制。
使用场景:排查慢查询时发现关键线程“消失”,先确认权限:SHOW GRANTS FOR CURRENT_USER;,检查输出里有没有 PROCESS。
- 没有
PROCESS权限时,SHOW PROCESSLIST只返回自己的线程,且Info列为空(看不到 SQL) - 想绕过权限限制?不行。但可以查
performance_schema.threads表(需SELECT权限),它更全,不过PROCESSLIST字段是模拟的,不一定实时 -
information_schema.PROCESSLIST表也能查,但它底层就是SHOW PROCESSLIST的封装,权限要求一致
SHOW FULL PROCESSLIST 和 SHOW PROCESSLIST 有什么区别
就一件事:SHOW FULL PROCESSLIST 会把 Info 列的 SQL 截断取消(默认最多显示 100 字符),而 SHOW PROCESSLIST 会截断。
性能影响很小,但要注意:长 SQL 被截断后可能看不出关键条件,比如 WHERE id IN (1,2,3,...) 后面全是省略号,实际是百万级 ID 列表。
- 如果
Info列是NULL,不是 SQL 被隐藏了,而是线程当前没在执行语句(比如刚连上还没发 query,或处于Committing状态) -
SHOW FULL PROCESSLIST不会显示更“多”线程,只是显示更“长”的 SQL;别指望靠它看到锁等待链之类的信息 - 某些客户端(如旧版 MySQL Workbench)默认用
SHOW PROCESSLIST,得手动切命令栏才能打FULL版本
如何快速定位卡住的查询线程
光扫 SHOW PROCESSLIST 输出容易漏,重点盯三列:State、Time、Info。真正卡住的线程往往卡在 Waiting for table metadata lock 或 Updating 但 Time 持续上涨。
实操建议:加 WHERE 过滤,别人工肉眼找:
SELECT * FROM information_schema.PROCESSLIST WHERE COMMAND != 'Sleep' AND TIME > 30;
或者直接用命令行管道过滤:
mysql -e "SHOW PROCESSLIST" | grep -E "(Locked|metadata|Sending|Creating)"
-
State是Locked不一定真锁表,可能是 MyISAM 表级锁,也可能是 InnoDB 行锁升级成表锁(比如全表扫描更新) - 看到大量
State: Sleep+ 高Time,说明应用连接池没配置maxLifetime或idleTimeout,连接长期空闲却不释放 -
KILL [ID]前务必先SELECT Info确认 SQL 内容,误杀一个大事务的 COMMIT 可能导致主从延迟突增
最常被忽略的一点:SHOW PROCESSLIST 结果里的 ID 是线程 ID,不是事务 ID;InnoDB 事务信息得去 information_schema.INNODB_TRX 查,两者 ID 不对应。











