必须授予process全局权限才能让普通用户通过show processlist查看所有会话,语法为grant process on . to 'user'@'host';,且需执行flush privileges生效;其他写法(如指定库或表)均报错,select performance_schema.processlist也无法替代。

普通用户默认只能看到自己的连接,要让ta执行 SHOW PROCESSLIST 查看所有会话,必须授予 PROCESS 全局权限 —— 这不是可选方案,而是唯一合规路径。
GRANT PROCESS ON *.* 是唯一合法写法
MySQL 把 PROCESS 归类为全局权限(Global Privilege),它不作用于任何具体数据库或表。一旦写成 ON db_name.* 或 ON db_name.table_name,就会触发错误:ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES。
-
GRANT PROCESS ON *.* TO 'monitor'@'localhost';✅ 正确 -
GRANT PROCESS ON testdb.* TO 'monitor'@'localhost';❌ 报错 -
GRANT PROCESS ON performance_schema.* TO ...❌ 同样报错,performance_schema不是例外
host 部分可以写 'localhost'、'10.0.1.%' 或 '%',但权限范围始终是实例级,和 host 无关。
授予权限后必须 FLUSH PRIVILEGES
MySQL 权限缓存不会自动刷新,即使 GRANT 执行成功,目标用户仍可能看不到其他连接。不执行 FLUSH PRIVILEGES;,权限就处于“已记录但未加载”状态。
- 用 root 或高权限账号执行完
GRANT后,立刻跟一句FLUSH PRIVILEGES; - 验证是否生效:用目标用户登录,执行
SHOW PROCESSLIST;,检查结果中是否出现非当前用户的User值(如root、admin) - 若只看到一行且
User列等于自己,说明权限未加载或被拒绝(比如 host 不匹配)
为什么不能用 SELECT ON performance_schema.processlist 替代
MySQL 8.0+ 允许对 performance_schema.processlist 视图赋 SELECT 权限,但普通用户查这个视图默认仍只能看到自己的会话 —— 想突破行级限制,必须额外授予 CONNECTION_ADMIN 或 SUPER,这两个权限远比 PROCESS 危险,且违背最小权限原则。
-
GRANT SELECT ON performance_schema.processlist TO 'user'@'localhost';→ 依然只返回本用户会话 - 加
CONNECTION_ADMIN就等于开了连接管理闸门,可KILL任意线程、修改连接属性 -
PROCESS至少是单向只读,而CONNECTION_ADMIN是双向控制权
真正容易被忽略的是权限暴露面
PROCESS 看似只是“看一眼”,但它让持有者能实时拿到所有连接的完整上下文:Info 字段含明文 SQL(包括带密码的 WHERE 条件)、User 和 Host 可用于探测内部账号体系、配合 KILL 权限还能中断任意连接。哪怕只给一个监控账号,只要它能连上 MySQL(尤其是内网服务暴露时),整个实例的运行快照就等同于公开。
别把 PROCESS 塞进应用账号,也别用 '%' 泛授权;host 应精确到 IP 段或跳板机,且定期审计谁拥有该权限。











