MySQL 8.0 中 SUPER 权限已被废弃,GRANT/REVOKE SUPER 均报错 ERROR 3715;须改用 CONNECTION_ADMIN、SYSTEM_VARIABLES_ADMIN 等动态权限按需替代,并通过角色统一管理。

MySQL 8.0 中不能“禁用” SUPER 权限——它已被彻底废弃,不是开关能关掉的东西;你真正要做的,是停止授予、主动回收,并用 CONNECTION_ADMIN、SYSTEM_VARIABLES_ADMIN 等动态权限按需替代。
GRANT SUPER 会直接报错 ERROR 3715
执行 GRANT SUPER ON *.* TO 'user'@'%' 时,MySQL 不会静默忽略,而是明确返回:ERROR 3715 (HY000): The 'SUPER' privilege is obsolete。这不是连接或语法问题,是权限模型已重构的硬性限制。
- 所有 MySQL 8.0.16+ 版本(含当前 2026 年主流部署)均不支持显式授予
SUPER -
ALL PRIVILEGES也不包含SUPER,哪怕你GRANT ALL ON *.*,用户仍无法KILL或SET GLOBAL - 若旧脚本中残留
GRANT SUPER,必须逐行替换为对应动态权限,否则初始化失败
REVOKE SUPER ON *.* 在 8.0.16+ 也失效
即使你之前在 5.7 升级上来的实例中还存有 SUPER 权限,执行 REVOKE SUPER ON *.* FROM 'user'@'%' 也会触发同一条 ERROR 3715。MySQL 不再识别这个权限名,回收动作必须转向细粒度权限。
- 先查用户当前实际持有的动态权限:
SHOW GRANTS FOR 'user'@'%' - 常见需回收的替代项:
SYSTEM_VARIABLES_ADMIN(改全局变量)、CONNECTION_ADMIN(KILL)、REPLICATION_SLAVE_ADMIN(拉 binlog) - 回收命令示例:
REVOKE SYSTEM_VARIABLES_ADMIN, CONNECTION_ADMIN ON *.* FROM 'user'@'%' - 注意:回收只影响新连接,已有活跃会话仍保有原权限,需手动
KILL CONNECTION或让应用重连
按操作场景匹配动态权限,别堆砌
给用户授一堆动态权限,和当初乱给 SUPER 没本质区别。必须对照具体行为,只开最小集。
- 只要能
KILL其他连接 → 只授CONNECTION_ADMIN,无需SYSTEM_VARIABLES_ADMIN - 监控账号查主从状态 →
REPLICATION_CLIENT足够,REPLICATION_SLAVE_ADMIN属于高危权限,不应开放 - 备份工具需要
BACKUP_ADMIN+LOCK TABLES+SELECT,但禁止PROCESS(防窥探其他会话) - 函数/存储过程创建者 → 关键是
CREATE ROUTINE+ALTER ROUTINE,并确保log_bin_trust_function_creators=1已设,而非求SUPER
角色(Role)是管理动态权限的实际落地方案
直接对每个用户反复 GRANT/REVOKE 动态权限,极易出错且不可审计。MySQL 8.0 原生角色机制才是规模化落地的关键。
- 先建角色:
CREATE ROLE 'kill_role'; - 授动态权限到角色:
GRANT CONNECTION_ADMIN ON *.* TO 'kill_role'; - 再把角色分配给用户:
GRANT 'kill_role' TO 'monitor'@'%'; - 用户登录后需激活:
SET DEFAULT ROLE 'kill_role' TO 'monitor'@'%';(否则权限不生效) - 后续权限调整只需改角色,所有绑定用户自动同步,无需遍历用户列表
最容易被忽略的一点:动态权限变更后,CURRENT_USER() 和 CURRENT_ROLE() 必须重连才能刷新;很多权限看似没生效,其实是客户端还连着旧会话。别信 FLUSH PRIVILEGES——它对动态权限完全无效。


















