read_only=ON 对 SUPER 用户无效是 MySQL 的设计特性,因其仅拦截普通用户写操作,而 SUPER 用户可绕过该限制执行写入;唯一可靠约束方式是撤销其 SUPER 权限或启用 super_read_only(5.7.8+)。

read_only=ON 为什么对 SUPER 用户无效
MySQL 的 read_only 是个“软只读”开关,它只拦截普通用户的写操作,但会主动绕过拥有 SUPER 权限的账号(包括 root)。这不是 bug,是设计如此:MySQL 认为有 SUPER 的人理应能绕过限制做运维操作。
常见错误现象:SET GLOBAL read_only = ON; 后用 root 执行 UPDATE 依然成功,误以为设置失败;或者应用连的是普通用户,却没关掉其 SUPER 权限,导致只读形同虚设。
- 检查当前用户权限:
SELECT CURRENT_USER(), @@session.super_priv; - 确认是否真被限制:用非 SUPER 用户(如
app_user)连接后执行INSERT,看是否报错ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement - 不要依赖
read_only做安全隔离——它不是权限系统,只是操作拦截层
如何让 SUPER 用户也受只读约束
唯一可靠方式是移除用户的 SUPER 权限。MySQL 不提供“强制所有用户只读”的全局开关,read_only 本身就不覆盖 SUPER,所以必须从权限源头控制。
使用场景:主库切为只读状态做迁移准备、灾备库防止误写、审计合规要求“任何人不可写”。
- 先回收权限:
REVOKE SUPER ON *.* FROM 'root'@'%'; FLUSH PRIVILEGES; - 再设只读:
SET GLOBAL read_only = ON; - 注意:回收
SUPER后,SET GLOBAL、CHANGE MASTER TO、杀线程等操作将全部失效,需提前评估运维影响 - 如果必须保留
SUPER(例如需要动态调参),那就别指望read_only能拦住自己——此时应改用网络层或代理层拦截写流量
read_only 与 super_read_only 的区别和兼容性
super_read_only 是 MySQL 5.7.8+ 引入的增强开关,它在 read_only = ON 基础上,额外禁止 SUPER 用户执行写操作(但仍允许部分管理命令,如 SET GLOBAL)。
关键差异:super_read_only 依赖 read_only,必须两者都 ON 才真正生效;且它不改变权限,只加一层运行时拦截。
- 启用顺序很重要:
SET GLOBAL read_only = ON; SET GLOBAL super_read_only = ON;(反过来无效) - MySQL 5.6 及更早版本不支持
super_read_only,强行设置会报错Unknown system variable 'super_read_only' - Percona Server 和 MariaDB 实现略有不同,例如 MariaDB 用
super_read_only就足够,不一定需要先开read_only - 重启后需在配置文件中显式写入,否则丢失:
read_only = ON和super_read_only = ON都要加进my.cnf
配置文件 vs 动态 SET:哪个更可靠
仅靠 SET GLOBAL 修改 read_only 或 super_read_only 是临时的,实例重启就还原。生产环境必须写入配置文件,否则等于没设。
容易踩的坑:线上执行了 SET GLOBAL read_only = ON,以为万事大吉,结果半夜 mysqld 挂了自动拉起,只读状态消失,业务开始写入主库。
- 配置路径示例:
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段下添加: read_only = ON-
super_read_only = ON(MySQL ≥ 5.7.8) - 修改后必须重启或用
mysqladmin shutdown && mysqld_safe &,FLUSH PRIVILEGES不生效 - 注意配置语法:值写
ON、OFF、1、0都可以,但混用易出错,建议统一用ON/OFF
最常被忽略的一点:即使 read_only 和 super_read_only 都开了,DEFINER 为 SUPER 用户的存储过程、事件、触发器仍可能间接执行写操作——它们运行时权限上下文独立于调用者,得单独审计。


















