show processlist可查看当前活跃连接,需process权限才能查看全部;权限不足时结果为空或仅少量行;show full processlist显示完整sql;information_schema.processlist需select权限且mysql 8.0+默认隐藏info列;可用sql筛选特定用户或高耗时连接;kill connection/query终止异常连接;长期监控推荐performance_schema而非轮询processlist。

查当前在线用户用 SHOW PROCESSLIST
直接执行 SHOW PROCESSLIST 就能看到所有活跃连接,包括用户、主机、数据库、命令类型、运行时间、状态和正在执行的 SQL。默认只显示当前用户自己的连接;要看到全部,需要 PROCESS 权限(通常是 root 或有管理员权限的账号)。
常见错误现象:SHOW PROCESSLIST 返回结果为空或只有 1–2 行,大概率是权限不够,不是真没连接。
- 用
SHOW FULL PROCESSLIST可以显示完整 SQL(超长语句不被截断) -
information_schema.PROCESSLIST表也可查,但需要 SELECT 权限,且某些 MySQL 版本(如 8.0+)默认隐藏敏感字段(如INFO列可能为 NULL),需开启show_compatibility_56=ON或改用 performance_schema - 非 root 用户执行时,
USER和HOST列可能被脱敏(显示为???),这是安全限制,无法绕过
过滤特定用户或高耗时连接
线上排查经常要快速定位某个用户或卡住的长事务,不能靠肉眼扫。直接在 PROCESSLIST 结果里筛选效率低,建议用 SQL 查询 information_schema.PROCESSLIST 表。
示例:查用户 'app_user' 的所有连接,并按运行时间倒序:
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM information_schema.PROCESSLIST WHERE USER = 'app_user' ORDER BY TIME DESC;
注意点:
-
TIME是该线程空闲或执行的时间(秒),不是连接建立时间;COMMAND = 'Sleep'且TIME很大,说明连接空闲但没释放(可能是应用没正确 close) -
STATE = 'Sending data'持续很久,往往意味着查询扫描大量数据或没走索引 - MySQL 8.0+ 中,
information_schema.PROCESSLIST的INFO列默认为 NULL,得开performance_schema并查performance_schema.threads+performance_schema.events_statements_current
杀掉异常连接用 KILL 命令
确认某连接异常后,用 KILL [CONNECTION|QUERY] ID 终止它。ID 就是 PROCESSLIST 第一列的数字。
-
KILL CONNECTION 123:断开整个连接(等价于旧版KILL 123) -
KILL QUERY 123:只终止当前正在执行的语句,连接保持打开(适合误执行大查询但还想复用连接池的场景) - 普通用户只能杀自己的连接;root 可杀任意连接,但无法杀系统线程(如
USER = 'event_scheduler'或'system user') - 执行
KILL后不会立即消失,状态会变成Killed,实际清理依赖线程当前所处阶段(比如正在写 binlog 或刷脏页,会稍有延迟)
长期监控建议用 performance_schema 而非轮询 PROCESSLIST
如果要做自动化监控(比如每 5 秒抓一次活跃连接),别用定时跑 SHOW PROCESSLIST —— 它是快照,容易漏掉短生命周期连接,且频繁调用对性能有影响(尤其连接数多时)。
更稳的方式是启用 performance_schema 并配置相关消费者:
- 确保
performance_schema = ON(MySQL 5.6+ 默认开启) - 打开线程事件收集:
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME = 'events_threads_current'; - 查活跃线程:
SELECT THREAD_ID, PROCESSLIST_USER, PROCESSLIST_HOST, PROCESSLIST_DB, PROCESSLIST_COMMAND, PROCESSLIST_TIME FROM performance_schema.threads WHERE PROCESSLIST_ID IS NOT NULL; - 这个表能反映“此刻正在运行”的线程,比
PROCESSLIST更底层,也更稳定;但要注意它不包含已断开的连接历史
真正难的不是看到谁在线,而是区分哪些连接该留、哪些该杀——比如连接池保活的心跳、ORM 预编译语句的 idle 连接、还是真卡死的慢查询。这得结合应用逻辑看 COMMAND、STATE 和 INFO 综合判断,光看用户名和 IP 没用。











