MySQL数据库的只读模式可以通过修改全局变量read_only来实现,开启后普通用户将无法执行写入、修改、删除等变更数据的操作,仅允许执行查询语句,常用于数据备份、主从同步从库配置等场景。

临时设置read_only为ON
临时设置的方式在MySQL服务重启后会失效,适合临时需要开启只读模式的场景,操作需要拥有SUPER权限的账户执行。
查看当前read_only状态
首先可以先查看当前read_only变量的状态,确认是否已经开启:
-- 查看全局read_only变量的值 SHOW GLOBAL VARIABLES LIKE 'read_only';
如果返回的结果中Value字段为OFF,说明当前未开启只读模式;如果是ON则说明已经开启。
修改read_only为ON
执行以下命令即可临时开启只读模式:
-- 修改全局read_only变量为ON,开启只读模式 SET GLOBAL read_only = ON;
执行完成后可以再次执行查看命令确认修改是否生效。
关闭临时只读模式
如果需要关闭临时只读模式,执行以下命令即可:
-- 修改全局read_only变量为OFF,关闭只读模式 SET GLOBAL read_only = OFF;
永久设置read_only为ON
永久设置的方式会在MySQL服务重启后依然保持只读状态,需要修改MySQL的配置文件。
修改配置文件
找到MySQL的配置文件my.cnf(Linux系统通常路径为/etc/my.cnf,Windows系统通常为my.ini),在[mysqld]节点下添加或修改read_only配置:
[mysqld] # 开启只读模式 read_only = ON
如果是已经存在read_only配置项,直接将值改为ON即可,不需要重复添加。
重启MySQL服务
修改完成配置文件后,需要重启MySQL服务让配置生效,不同系统的重启命令如下:
- Linux系统(systemd管理):
systemctl restart mysqld - Linux系统(sysvinit管理):
service mysqld restart - Windows系统:在服务管理器中重启MySQL服务,或执行
net stop mysql && net start mysql
设置只读模式的注意事项
用户权限差异
开启read_only为ON后,不同权限用户的操作限制如下:
| 用户权限 | 操作限制 |
|---|---|
| 普通用户(无SUPER权限) | 仅能执行查询操作,无法执行INSERT、UPDATE、DELETE、CREATE、DROP等变更数据的操作 |
| 拥有SUPER权限的用户 | 不受read_only限制,依然可以执行所有写入和修改操作 |
主从同步场景注意
如果是主从同步的从库,开启read_only为ON不会影响从库同步主库的变更日志,因为从库的同步线程拥有SUPER权限,不受只读模式限制。
super_read_only变量
如果需要让拥有SUPER权限的用户也无法执行写入操作,可以同时开启super_read_only变量,命令如下:
-- 开启super_read_only,限制SUPER权限用户的写入操作 SET GLOBAL super_read_only = ON;
super_read_only开启后,read_only会自动被设置为ON,关闭super_read_only时read_only不会自动关闭。
常见问题说明
修改时提示权限不足
如果执行SET GLOBAL read_only = ON时提示权限错误,说明当前登录的账户没有SUPER权限,需要切换到拥有SUPER权限的账户执行操作。
配置后未生效
如果是修改配置文件后重启服务依然没有生效,需要检查配置文件中read_only是否写在[mysqld]节点下,以及是否有其他配置覆盖了该设置,同时可以通过SHOW GLOBAL VARIABLES LIKE 'read_only';命令确认实际生效的值。
注意:开启只读模式前需要确认当前没有正在执行的重要写入事务,避免事务被中断导致数据不一致。