MySQL 从库怎样进行只读模式的严格设置

作者:袖梨 2026-07-07
必须同时启用read_only和super_read_only才能实现真正严格只读;前者拦普通用户,后者拦包括root在内的所有SUPER权限用户,二者需按序配置、写入my.cnf并重启生效,缺一不可。

MySQL 从库要实现真正严格的只读,不能只靠 read_only = ON。它只能阻止普通用户写入,但拥有 SUPER 权限的账号(比如 root)依然能执行 INSERT、DROP TABLE、CREATE FUNCTION 等操作——这会破坏主从一致性,且 binlog 不记录,主库无法同步,数据永久不一致。

必须同时启用 read_only 和 super_read_only

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 启动失败

永久生效:写进 my.cnf 配置文件

编辑 /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

测试语句包括:INSERTUPDATETRUNCATEDROP TABLECREATE TEMPORARY TABLE(部分版本)、CREATE FUNCTION 等。建议用 root 账号实测,确认连高权限用户也被拦截。

相关文章

精彩推荐