必须授予process全局权限才能查看所有连接,因其仅支持on .语法,不兼容数据库或表级限定,错误写法如on db.*会触发error 1221;授予权限后需flush privileges并用show processlist验证是否可见其他用户会话。

普通用户默认只能看到自己的连接,要让ta看到所有连接(即完整 SHOW PROCESSLIST 结果),必须显式授予 PROCESS 全局权限 —— 这不是数据库级或表级权限,不能写成 ON db.*,否则会报错 ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES。
为什么 GRANT PROCESS ON testdb.* 一定失败
因为 PROCESS 是全局权限(Global Privilege),只作用于整个 MySQL 实例,和具体数据库无关。MySQL 权限系统在解析时会直接拒绝把 PROCESS 绑定到某个库或某张表的写法。
- 错误示例:
GRANT PROCESS ON testdb.* TO 'user'@'localhost'; - 正确写法必须是:
GRANT PROCESS ON *.* TO 'user'@'localhost'; - 即使你只想让该用户查本机连接,
host部分仍可写'localhost',但权限范围仍是全局的
授予后如何验证权限是否生效
用目标用户登录后执行 SHOW PROCESSLIST;,观察结果中是否包含其他用户的连接行(比如 User 列出现 root、admin 等非当前用户名)。
- 若只看到自己的一两行,说明权限未生效或未
FLUSH PRIVILEGES - 若看到大量连接且
Info列有实际 SQL(非NULL),说明已成功 - 也可用
SHOW GRANTS FOR 'user'@'localhost';确认输出里含PROCESS ON *.*
PROCESS 权限带来的实际影响与风险
它不只是“看一眼进程”,而是暴露了当前所有连接的完整上下文,包括:
-
Info字段可能泄露敏感 SQL(如带明文条件的SELECT ... WHERE password = 'xxx') -
User和Host可被用于横向信息收集(比如发现内部管理账号) - 配合
KILL权限(需额外授予)可直接中断任意连接,构成可用性风险 - MySQL 8.0+ 中,
PROCESS还会影响performance_schema的部分视图可见性
真正容易被忽略的是:哪怕只给一个监控账号 PROCESS 权限,只要它能连上 MySQL(尤其是开放给内网服务时),就等于把实例的实时运行快照交了出去 —— 这个权限不该出现在应用账号里,也不该通过 % 主机泛授权。最小化原则在这里不是建议,是底线。











