MySQL只读模式通过read_only参数防止意外写入,普通用户无法执行写操作但SUPER用户可绕过;永久生效需配置文件设置,super_read_only可进一步限制SUPER用户。

MySQL 的只读模式(read-only)主要用于防止意外写入,常见于从库、备份节点或高可用架构中的只读实例。开启后,普通用户无法执行 INSERT、UPDATE、DELETE、DROP、CREATE 等写操作,但 SUPER 权限用户仍可绕过限制。
一、设置全局 read_only 参数
这是最常用的方式,通过修改系统变量 read_only 实现。该参数动态生效,无需重启 MySQL 服务:
- 临时启用(重启后失效):
SET GLOBAL read_only = ON; - 临时禁用:
SET GLOBAL read_only = OFF; - 查看当前状态:
SELECT @@global.read_only;(返回 1 表示开启)
二、永久生效:写入配置文件
为避免服务重启后失效,需在 MySQL 配置文件(如 my.cnf 或 my.ini)的 [mysqld] 段落下添加:
然后重启 MySQL 服务。注意:仅对非 SUPER 用户生效;SUPER 用户(如 root)默认不受限制,若需限制,应配合 super_read_only 使用。
三、增强只读控制:启用 super_read_only
MySQL 5.7.8+ 支持 super_read_only,它在 read_only 基础上进一步限制 SUPER 权限用户的写操作:
- 启用:
SET GLOBAL super_read_only = ON; - 该参数依赖 read_only=ON 才能生效,且同样支持配置文件持久化:
super_read_only = ON - 启用后,连 root 用户执行写操作也会报错:
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement
四、验证与注意事项
设置完成后,建议用普通账号测试写操作是否被拒绝,并确认复制状态未受影响(尤其在主从环境中):
- 检查复制线程是否正常:
SHOW SLAVE STATUS\G(确保Slave_SQL_Running: Yes) - 普通用户执行 INSERT INTO t1 VALUES (1); 应报错:
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement - 注意:read_only 不影响临时表操作、日志清理(如 PURGE BINARY LOGS)、或存储过程内部逻辑,需结合权限体系综合管控










