必须同时启用read_only和super_read_only才能实现真正严格只读;前者拦普通用户,后者拦包括root在内的所有SUPER权限用户,二者需按序配置、写入my.cnf并重启生效,缺一不可。
MySQL 从库要实现真正严格的只读,不能只靠 read_only = ON。它只能阻止普通用户写入,但拥有 SUPER 权限的账号(比如 root)依然能执行 INSERT、DROP TABLE、CREATE FUNCTION 等操作——这会破坏主从一致性,且 binlog 不记录,主库无法同步,数据永久不一致。
super_read_only 是 MySQL 5.7.8+ 引入的兜底机制,开启后连 SUPER 用户也无法写入,包括建存储过程、触发器、EVENT、甚至 ANALYZE TABLE(MySQL 8.0+ 对系统表也生效)。它和 read_only 是联动的:
super_read_only = ON 会自动把 read_only 设为 ON
read_only = OFF 会强制关闭 super_read_only
super_read_only = ON 必须写在 read_only = ON 之后,否则 MySQL 启动失败编辑 /etc/my.cnf(或 /etc/mysql/my.cnf),在 [mysqld] 段下添加:
[mysqld]read_only = ONsuper_read_only = ON
保存后重启服务:systemctl restart mysql。重启后检查是否生效:
SHOW VARIABLES LIKE 'read_only';SHOW VARIABLES LIKE 'super_read_only';
两个都返回 ON 才算成功。
动态设置需有 SUPER 权限:
SET GLOBAL read_only = ON;SET GLOBAL super_read_only = ON;注意:这类设置在 MySQL 重启后失效,生产环境务必用配置文件方式。
设好后,任何写操作都会立刻报错,这不是故障,是保护机制正常工作。典型错误:
ERROR 1290 (HY000): The MySQL server is running with the read-only option so it cannot execute this statement
测试语句包括:INSERT、UPDATE、TRUNCATE、DROP TABLE、CREATE TEMPORARY TABLE(部分版本)、CREATE FUNCTION 等。建议用 root 账号实测,确认连高权限用户也被拦截。