必须用 revoke super on . from 'user'@'host',因super是全局权限且mysql 8.0.16+已废弃,需改用system_variables_admin等细粒度权限替代,并注意活跃连接、角色继承影响。

必须用 REVOKE SUPER ON *.* FROM 'user'@'host',其他写法全报错;MySQL 8.0.16+ 已废弃 SUPER,得换细粒度权限。
为什么 REVOKE SUPER ON mydb.* 一定失败
MySQL 把 SUPER 归为全局权限,只影响实例级操作(比如 KILL、SET GLOBAL、启动复制),不作用于库或表。语法强制要求作用域是 *.*——写成 mydb.* 或 mydb.users 都会触发错误:ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES。
-
REVOKE SUPER ON mydb.* FROM 'admin'@'%';❌ -
REVOKE SUPER ON * FROM 'admin'@'%';❌(缺点号) -
REVOKE SUPER FROM 'admin'@'%';❌(缺ON *.*) -
REVOKE SUPER ON *.* FROM 'admin'@'%';✅
MySQL 8.0+ 怎么撤?SUPER 已被移除
查版本:SELECT VERSION();。若 ≥ 8.0.16,执行 REVOKE SUPER ON *.* 会直接报错:ERROR 3715 (HY000): The SUPER privilege is obsolete。此时必须用替代权限逐个回收:
-
SYSTEM_VARIABLES_ADMIN→ 替代SET GLOBAL -
CONNECTION_ADMIN→ 替代KILL其他连接 -
SHUTDOWN→ 替代关实例 -
REPLICATION_APPLIER→ 替代从库线程控制
查当前用户真实权限:SHOW GRANTS FOR 'admin'@'%';,确认输出里没有 SYSTEM_VARIABLES_ADMIN 等项。别只看“没 SUPER”就以为安全了。
撤销后旧连接仍能执行高危操作
REVOKE 只影响新建立的连接。已存在的活跃连接(应用长连接、DBA 客户端)仍持有原权限,可继续 KILL、SET GLOBAL max_connections 等。
- 查活跃会话:
SELECT ID, USER, HOST, COMMAND, TIME FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'admin'; - 手动终止:
KILL [ID];或批量KILL CONNECTION - 让应用重启连接池,或客户端重连
-
FLUSH PRIVILEGES;在 8.0+ 中非必需,也不解决已存在连接问题
别漏掉角色间接授予的 SUPER
如果用户是通过角色获得权限(例如:GRANT SUPER ON *.* TO 'dba_role'; GRANT 'dba_role' TO 'admin'@'%';),那么只对用户执行 REVOKE SUPER ON *.* 毫无效果。
- 正确做法:先查角色归属:
SELECT * FROM mysql.role_edges WHERE TO_USER = 'admin'; - 再从角色剥离:
REVOKE 'dba_role' FROM 'admin'@'%'; - 或直接从角色撤权:
REVOKE SUPER ON *.* FROM 'dba_role';
权限回收最易被忽略的点:不是语法写错,而是忘了查活跃连接、忘了角色继承、忘了 8.0+ 权限已拆分——三者任一遗漏,SUPER 就还在生效。











