普通用户执行SHOW PROCESSLIST默认只能看到自身线程,必须显式授予PROCESS ON .权限才能查看全部连接;该权限为全局权限,且information_schema.PROCESSLIST查询受同等限制。

普通用户执行 SHOW PROCESSLIST 只能看到自己的连接,这是默认行为
哪怕你给用户授予了 SELECT 权限或 ALL PRIVILEGES,只要没显式给 PROCESS 权限,SHOW PROCESSLIST 就只会返回该用户自己发起的线程。这不是 bug,是 MySQL 的权限隔离设计——它把“看别人在干啥”当作高危操作,默认禁止。
必须显式授予 PROCESS 权限才能看到全部连接
授予方式只有一种:用高权限账号(如 root)执行:
GRANT PROCESS ON *.* TO 'your_user'@'%';
然后刷新权限:
FLUSH PRIVILEGES;
注意以下几点:
-
ON *.*不能省略,PROCESS是全局权限,不支持库级或表级粒度 - 如果用户 host 是
'your_user'@'localhost',授权时 host 必须完全匹配,不能写成'%' - MySQL 8.0+ 中,即使你是 root,若没被显式授予过
PROCESS,首次执行SHOW PROCESSLIST也只会看到自己的线程 - 授完权后,用户仍需执行
SHOW FULL PROCESSLIST才能避免Info字段被截断(默认只显示前 100 字符)
为什么 information_schema.PROCESSLIST 查询也受同样限制?
很多人以为查系统表能绕过权限,其实不行:SELECT * FROM information_schema.PROCESSLIST 的可见性规则和 SHOW PROCESSLIST 完全一致——没 PROCESS 权限,照样只能看到本用户的行。这个视图不是“绕过”,而是“镜像”。真正不受权限过滤的是 performance_schema.threads,但它需要额外开启消费者且字段名不同(比如 PROCESSLIST_INFO 而非 INFO),普通运维场景里不如直接授 PROCESS 简单可靠。
KILL 权限要单独给,且不能只靠 PROCESS
能看到进程 ≠ 能杀进程。PROCESS 权限只管“查看”,KILL 是另一个独立权限:
GRANT KILL ON *.* TO 'your_user'@'%';
否则用户执行 KILL 12345 会报错:ERROR 1045 (28000): Access denied for user ... (using password: YES)。另外注意:KILL 对某些状态(如 Committing、Waiting for table metadata lock)不会立即生效,这是引擎层行为,和权限无关。
权限这事没有中间态——要么明确给 PROCESS,要么就只能看自己。别指望换条 SQL 或改个配置就能绕过去。











