<p>必须授予PROCESS全局权限才能让普通用户通过SHOW PROCESSLIST查看所有会话,唯一合法写法是GRANT PROCESS ON . TO 'user'@'host';,且需执行FLUSH PRIVILEGES生效;其他任何限定库、表或视图的写法均报ERROR 1221。</p>

必须用 GRANT PROCESS ON *.*,其他写法全报错
MySQL 把 PROCESS 归为全局权限(Global Privilege),它不作用于任何库或表。只要写成 ON db_name.* 或 ON performance_schema.*,就会触发 ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES。
-
GRANT PROCESS ON *.* TO 'monitor'@'localhost';✅ 唯一合法写法 -
GRANT PROCESS ON test.* TO 'monitor'@'localhost';❌ 报错 -
GRANT PROCESS ON performance_schema.processlist TO 'monitor'@'%';❌ 同样报错
host 部分可以是 'localhost'、'10.0.1.%' 或 '%',但权限生效范围始终是整个 MySQL 实例,和 host 无关。
授完权必须立刻执行 FLUSH PRIVILEGES
MySQL 权限缓存在内存中,GRANT 语句只是写入磁盘的权限表(mysql.user),不会自动重载。不执行 FLUSH PRIVILEGES,目标用户登录后仍只能看到自己的连接。
- 用 root 或高权限账号执行完
GRANT后,紧跟着执行FLUSH PRIVILEGES; - 验证方式:用目标用户登录,运行
SHOW PROCESSLIST; - 若结果里只有一行且
User列等于自己,说明权限未加载成功(常见于漏掉FLUSH或 host 不匹配)
别指望 SELECT FROM performance_schema.processlist 替代
MySQL 8.0+ 允许对 performance_schema.processlist 视图赋 SELECT 权限,但默认行为仍是行级过滤 —— 普通用户查这个视图,依然只能看到自己的会话。
-
GRANT SELECT ON performance_schema.processlist TO 'user'@'localhost';→ 结果仍是单行 - 想突破限制,必须额外授予
CONNECTION_ADMIN或SUPER,这两个权限远超必要,可 KILL 任意线程、修改连接属性 -
PROCESS是只读的“看一眼”,而CONNECTION_ADMIN是带控制权的“能动手”,违背最小权限原则
PROCESS 权限实际暴露面比想象中大
它不只是显示连接数量,而是把所有活跃会话的完整上下文都摊开:Info 字段含明文 SQL(包括带密码的 WHERE 条件)、User/Host 可用于探测内部账号体系、State 和 Time 能辅助判断慢查询或阻塞点。
真正容易被忽略的是:一旦开了这个口子,监控账号就具备了间接推断业务逻辑、识别敏感操作甚至定位凭证泄露路径的能力。不是不能给,而是得清楚——给的不是“列表”,是实时会话快照流。


















