mysql 8.0+ 中 super 权限已废弃,需用 connection_admin(替代 kill)、system_variables_admin(替代 set global)等细粒度动态权限替代,grant super 会报错 error 3715。

MySQL 8.0+ 中 SUPER 权限已废弃,不能直接授予
直接执行 GRANT SUPER ON *.* TO 'user'@'host' 会报错:ERROR 3715 (HY000): The 'SUPER' privilege is obsolete and will be removed in a future release。这不是语法错误,而是 MySQL 8.0 权限模型重构的结果——SUPER 已被拆解为多个动态权限,且不再支持显式授予。
替代 SUPER 的常用动态权限组合
根据你要实现的具体操作,选对应权限,不叠加、不冗余:
-
CONNECTION_ADMIN:替代 KILL 线程(KILL CONNECTION/KILL QUERY),MySQL 8.0.14+ 支持,单权限即可,无需搭配PROCESS -
SYSTEM_VARIABLES_ADMIN:替代SET GLOBAL修改运行时变量(如max_connections、innodb_buffer_pool_size) -
PERSIST_RO_VARIABLES_ADMIN:替代SET PERSIST_ONLY写入只读配置项(需配合SYSTEM_VARIABLES_ADMIN才能生效) -
REPLICATION_SLAVE_ADMIN:替代旧版 SUPER 中的复制控制能力(如CHANGE MASTER TO、START SLAVE) -
BACKUP_ADMIN:替代mysqlbackup或物理备份相关操作(非mysqldump)
注意:PROCESS 单独存在时只能查看自己线程(SHOW PROCESSLIST 被过滤),无法 KILL;REPLICATION CLIENT 仅用于查看主从状态,不等于复制控制权。
给监控账号最小化授权示例
假设要让 monitor@'%' 能查所有连接并终止慢查询,但不能改系统变量、不能启停复制:
GRANT PROCESS, CONNECTION_ADMIN ON *.* TO 'monitor'@'%'; FLUSH PRIVILEGES;
常见误配:
- 只给
PROCESS→KILL操作报ERROR 1227 - 用
GRANT ALL PRIVILEGES→ 可能隐式包含已废弃权限,触发 warning,且违反最小权限原则 - 忘记
FLUSH PRIVILEGES→ 新权限不立即生效(尤其在低版本或特殊配置下)
函数创建不再需要 SUPER,靠变量控制
开发人员常因创建存储函数被要求开 SUPER,其实只需设置 log_bin_trust_function_creators=1 并授予 CREATE ROUTINE:
- 全局生效:
SET GLOBAL log_bin_trust_function_creators = 1;(需SYSTEM_VARIABLES_ADMIN) - 永久生效:在
my.cnf的[mysqld]段添加log_bin_trust_function_creators=1,重启生效 - 用户只需
CREATE ROUTINE+ALTER ROUTINE(后者用于修改)即可,无需任何高危动态权限
真正难的是权限收敛节奏——很多系统上线后从不清理历史账号,动态权限像灰尘一样越积越多,而 SHOW GRANTS FOR 'user'@'host' 输出里是否含 CONNECTION_ADMIN 或 SYSTEM_VARIABLES_ADMIN,往往被忽略。











