必须用REVOKE SUPER ON . FROM 'admin'@'%';,其他写法均报错;MySQL 8.0.16+中SUPER已废弃,需改用SYSTEM_VARIABLES_ADMIN等细粒度权限替代,并清理活跃连接及角色间接授权。

不能只执行 REVOKE SUPER 就算完事——它要么语法报错,要么撤不干净,还可能留后门。
必须用 REVOKE SUPER ON *.*,其他写法全报错
SUPER 是全局权限,MySQL 强制要求作用域只能是 *.*。任何带库名、表名或缺省作用域的写法都会失败:
-
REVOKE SUPER ON myapp.* FROM 'admin'@'%';→ 报错:ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES -
REVOKE SUPER FROM 'admin'@'%';→ 报错:缺少ON *.*,语法不合法 -
REVOKE ALL PRIVILEGES ON *.* FROM 'admin'@'%';→SUPER不在ALL PRIVILEGES里,完全没影响
唯一合法写法:REVOKE SUPER ON *.* FROM 'admin'@'%';
MySQL 8.0.16+ 中 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→ 替代从库线程控制
推荐回收组合:REVOKE SYSTEM_VARIABLES_ADMIN, CONNECTION_ADMIN, SHUTDOWN ON *.* FROM 'admin'@'%';
撤销后旧连接仍持有权限,必须主动清理
REVOKE 只更新权限元数据,不影响已建立的连接。那些长连接、DBA 客户端、应用连接池里的活跃会话,还能继续执行 KILL、SET GLOBAL 等操作。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
必须手动干预:
- 查活跃会话:
SELECT ID, USER, HOST, COMMAND, TIME FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'admin'; - 逐个终止:
KILL CONNECTION [ID];(MySQL 5.7+ 推荐带CONNECTION) - 让应用重启连接池,或客户端手动重连
FLUSH PRIVILEGES; 在 8.0+ 对动态权限变更无效,且不解决连接残留问题,别依赖它。
别漏掉角色间接授予的权限
如果用户是通过角色获得高危能力(例如:GRANT SUPER ON *.* TO 'dba_role'; GRANT 'dba_role' TO 'admin'@'%';),那么只对用户执行 REVOKE 完全无效。
要查清路径:
- 查角色绑定:
SELECT FROM_HOST, FROM_USER FROM mysql.role_edges WHERE TO_USER = 'admin' AND TO_HOST = '%'; - 解绑角色:
REVOKE 'dba_role' FROM 'admin'@'%'; - 必要时也对角色本身撤销权限:
REVOKE SYSTEM_VARIABLES_ADMIN ON *.* FROM 'dba_role';
权限回收最易被忽略的点,从来不是语法,而是“谁真正持有着它”——连接没断、角色没剥、权限没查实,撤了等于没撤。










