用 show full processlist 查看完整 sql,需 process 权限;root 在 mysql 8.0+ 需显式授权才能跨用户查看;kill 失败多因线程处于 locked 等不可中断状态。

show processlist 看不到完整 SQL 怎么办
默认 SHOW PROCESSLIST 只显示前 100 个字符的 Info 字段,长 SQL 被截断,根本看不出在执行什么。这不是 bug,是 MySQL 的默认行为。
- 用
SHOW FULL PROCESSLIST(注意加FULL)——它会显示完整的 SQL 文本,不受 100 字符限制 - 权限要求:需要
PROCESS权限,普通业务账号通常没有,得找 DBA 或用高权限账号登录 - 如果连
FULL版也显示为NULL,说明该线程当前没在执行语句(比如处于Sleep、Locked或等待 I/O 状态)
为什么 root 用户执行 show processlist 却看不到其他用户连接
MySQL 8.0+ 默认开启 show_compatibility_56=OFF,且 performance_schema 的权限模型更严格了。root 不一定自动拥有查看所有线程的权限。
- 确认是否启用全局可见:执行
SELECT @@show_processlist,返回ON才表示允许跨用户查看 - 检查权限:运行
SHOW GRANTS FOR CURRENT_USER,确保包含PROCESS权限;若缺失,需由 super 用户执行GRANT PROCESS ON *.* TO 'user'@'%' - MySQL 5.7 及以前版本中,root 默认有此权限;8.0+ 必须显式授权,不能只靠
SUPER或SYSTEM_USER
查到慢查询但 kill 不掉,常见原因和应对
KILL [CONNECTION] id 失败不一定是权限问题,更多是状态卡死或内部锁等待。
- 线程状态是
Query但Time很高,可能是磁盘 I/O 阻塞或大事务未提交,KILL会等语句自然结束,不会立即中断 - 状态为
Locked或Waiting for table flush:说明被 DDL(如ALTER TABLE)阻塞,此时KILL无效,得先杀掉持有元数据锁(MDL)的线程 - 安全做法:先用
SELECT * FROM performance_schema.threads WHERE PROCESSLIST_ID = ?查线程详情,再结合events_statements_current看最后执行语句
替代方案:用 performance_schema 查更细粒度信息
SHOW PROCESSLIST 是快照式命令,信息有限;performance_schema 能看到历史、等待事件、资源消耗,适合定位真实瓶颈。
- 查当前活跃会话(含完整 SQL 和等待事件):
SELECT THREAD_ID, PROCESSLIST_USER, PROCESSLIST_HOST, PROCESSLIST_INFO, STATE, WORK_COMPLETED FROM performance_schema.threads t JOIN performance_schema.events_statements_current e USING (THREAD_ID) WHERE t.PROCESSLIST_STATE = 'Executing' - 注意:需提前开启相关消费者,例如
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE 'events_statements%' - 开销比
SHOW PROCESSLIST略高,生产环境建议按需开启,避免长期全量采集
真正卡住的往往不是命令本身,而是你没意识到 FULL 关键字必须显式写、PROCESS 权限要单独授、以及 KILL 对某些状态根本不起作用。这些细节不试一次,光看文档很难记住。











