<p>必须用 REVOKE SYSTEM PRIVILEGE PROCESS ON . FROM 'u'@'%'; 因 PROCESS 是 MySQL 8.0.16+ 动态权限,旧语法报错;需先查 SHOW GRANTS 和角色依赖,连带撤销 CONNECTION_ADMIN(若存在),并要求用户重连生效。</p>

直接撤销 PROCESS 权限必须用 REVOKE SYSTEM PRIVILEGE
MySQL 8.0.16+ 把 PROCESS 归为动态权限(dynamic privilege),不能用传统 REVOKE SELECT ON *.* 那套语法。执行 REVOKE PROCESS ON *.* FROM 'u'@'%' 会报错 ERROR 3724 (HY000): Cannot revoke dynamic privilege 'PROCESS' using old-style REVOKE。正确写法必须带 SYSTEM PRIVILEGE 关键字,且作用域只能是 *.*。
先确认用户是否真有 PROCESS 权限
别凭记忆操作,直接查:
SHOW GRANTS FOR 'u'@'%';
输出里若出现 GRANT PROCESS ON *.* TO 'u'@'%',说明已授;若没这行,可能权限来自角色或更高权限(如 SUPER、CONNECTION_ADMIN)。还要检查角色:
SELECT * FROM mysql.role_edges WHERE TO_USER = 'u' AND TO_HOST = '%';- 对每个匹配的
FROM_USER,再查SHOW GRANTS FOR 'role_name'@'localhost';
撤销 PROCESS 的完整命令和注意事项
执行这条命令即可:
REVOKE SYSTEM PRIVILEGE PROCESS ON *.* FROM 'u'@'%';
注意以下几点:
- 必须显式指定
ON *.*,不接受ON mysql.*或省略 - 不能批量撤销多个动态权限,比如
REVOKE SYSTEM PRIVILEGE PROCESS, SUPER ON *.*是非法语法 - 如果用户还持有
CONNECTION_ADMIN,它隐式包含PROCESS,得一并撤:REVOKE SYSTEM PRIVILEGE CONNECTION_ADMIN ON *.* FROM 'u'@'%'; - 撤销后立即生效,但当前连接仍能看到线程列表,需重连或
KILL当前会话才能彻底失权
为什么撤销后 SHOW PROCESSLIST 还能执行?
常见现象:命令执行成功,但用户下次登录还能跑 SHOW PROCESSLIST。原因通常是:
- 用户实际靠
CONNECTION_ADMIN或SUPER获得该能力,只撤PROCESS不够 - 旧连接未断开,缓存权限未刷新——这不是权限没撤,而是 session 还在用旧上下文
-
partial_revokes=ON开启后,部分撤销规则可能干扰判断,但PROCESS不受其影响(它不属于可部分撤销的权限列表)
真正干净的做法是:查清来源 → 逐个撤销动态权限 → 让用户重连。别指望一条命令扫清所有路径。


















