MySQL 8.0.16+ 中 SYSTEM_VARIABLES_ADMIN 是独立权限,ALL PRIVILEGES 不包含它,需显式授予;同时需同步撤销 CONNECTION_ADMIN、SESSION_VARIABLES_ADMIN 和 SUPER 才能彻底限制变量修改。

MySQL 8.0+ 中 SYSTEM_VARIABLES_ADMIN 是独立权限
不是权限没给全,而是 ALL PRIVILEGES 在 MySQL 8.0.16+ 版本中明确不包含 SYSTEM_VARIABLES_ADMIN。这个权限被拆出来单独管控,哪怕你用 GRANT ALL ON *.* TO 'user'@'host',也不会自动获得修改全局或持久化变量的能力。
常见错误现象是执行 SET GLOBAL max_connections = 2000 或 SET PERSIST innodb_buffer_pool_size = 1G 时直接报错:ERROR 1227 (42501): Access denied; you need (at least one of) the SYSTEM_VARIABLES_ADMIN privilege(s)。
-
SYSTEM_VARIABLES_ADMIN控制SET GLOBAL和SET PERSIST -
SESSION_VARIABLES_ADMIN控制SET SESSION(注意:普通用户默认就能用SET SESSION,但该权限控制的是“能否为其他会话设置”,实际影响较小) -
PERSIST_RO_VARIABLES_ADMIN是额外权限,专用于SET PERSIST_ONLY修改只读变量的持久化值
为什么 SHOW GRANTS 看不到权限却还能改变量?
因为权限可能来自角色继承,而不是直接授予用户。比如用户属于内置角色 mysql.session 或自定义角色,而该角色拥有 CONNECTION_ADMIN、SYSTEM_VARIABLES_ADMIN 等权限——SHOW GRANTS FOR 'user'@'host' 不会显示角色内的权限,必须查系统表确认。
容易踩的坑是只看 SHOW GRANTS 输出就下结论。真实权限是叠加生效的,必须交叉验证:
- 查角色授予权限:
SELECT * FROM information_schema.role_table_grants WHERE grantee = "'user'@'host'" AND privilege_type IN ('SYSTEM_VARIABLES_ADMIN', 'CONNECTION_ADMIN', 'SESSION_VARIABLES_ADMIN'); - 查是否属于高危角色:
SELECT * FROM mysql.role_edges WHERE TO_USER = 'user' AND TO_HOST = 'host'; - 查直接授权:
SHOW GRANTS FOR 'user'@'host';,确认没有漏掉CONNECTION_ADMIN(它隐式允许变量修改)
CONNECTION_ADMIN 和 SUPER 权限会绕过 SYSTEM_VARIABLES_ADMIN 检查
即使你显式 REVOKE SYSTEM_VARIABLES_ADMIN,只要用户还持有 CONNECTION_ADMIN 或未清理的 SUPER,SET GLOBAL 依然能成功。这不是 bug,是 MySQL 8.0+ 的设计事实:
-
CONNECTION_ADMIN隐式包含变量修改能力,且优先级高于SYSTEM_VARIABLES_ADMIN撤销结果 -
SUPER虽标记为 deprecated,但在 8.0.12+ 仍完全有效;旧账号若未显式REVOKE,就是后门 -
SESSION_VARIABLES_ADMIN允许SET PERSIST(写入mysqld-auto.cnf),效果等同于SET GLOBAL+ 重启生效
所以精准回收必须四者同步撤销:SYSTEM_VARIABLES_ADMIN、SESSION_VARIABLES_ADMIN、CONNECTION_ADMIN、SUPER,缺一不可。
权限匹配严格依赖 user@host 组合
MySQL 校验权限时,不是按用户名或 host 单独匹配,而是完整比对连接时使用的 'user'@'host' 字符串。如果应用用的是 'app_user'@'10.20.30.5' 连接,而你只撤销了 'app_user'@'%' 的权限,那它依然能执行 SET GLOBAL。
验证方式很简单:用相同账号和 host 连进 MySQL,然后执行 SELECT @@global.max_connections; —— 如果返回值,说明权限还在;如果报 Access denied,才算真正生效。
最容易被忽略的是 host 部分的精确性。生产环境里,容器 IP、负载均衡出口 IP、跳板机地址都可能是具体 IP 段,不能图省事全用 %。


















