mysql数据库的只读模式配置是运维场景中常见的需求,通过修改全局只读参数可以快速实现数据库只读状态的切换,适用于数据保护、从库同步保障等多种场景。

mysql全局只读参数说明
mysql中控制全局只读状态的核心参数是read_only,该参数为全局动态参数,修改后不需要重启数据库即可生效。当read_only参数设置为1时,普通用户(非超级权限用户)的所有写操作都会被拒绝,仅允许执行查询操作;超级权限用户不受该参数限制,仍然可以执行写操作。
另外还有一个扩展参数super_read_only,当该参数设置为1时,即使是超级权限用户的写操作也会被拒绝,进一步强化了只读限制。通常如果只是限制普通用户写操作,只需要配置read_only即可;如果需要完全禁止所有写操作,需要同时开启super_read_only。
临时修改全局只读参数方案
临时修改指的是修改后仅在当前数据库运行周期内生效,数据库重启后会恢复为原来的配置,适合临时维护场景使用。
操作步骤
- 登录mysql数据库,使用具有超级权限的账号连接
- 查看当前只读参数状态,执行如下命令:
-- 查看read_only参数当前值 SHOW GLOBAL VARIABLES LIKE 'read_only'; -- 查看super_read_only参数当前值 SHOW GLOBAL VARIABLES LIKE 'super_read_only';
- 修改只读参数,执行如下命令:
-- 开启普通用户只读限制 SET GLOBAL read_only = 1; -- 如果需要开启超级用户只读限制,执行以下命令 SET GLOBAL super_read_only = 1;
- 验证只读状态是否生效,使用普通用户账号连接数据库,尝试执行写操作,比如插入数据:
-- 普通用户执行插入操作,预期会报错 INSERT INTO test_table (id, name) VALUES (1, 'test');
注意事项
临时修改的参数在数据库重启后会失效,如果需要长期保持只读状态,需要使用永久修改方案。另外临时修改super_read_only参数时,如果read_only参数当前为0,会自动将read_only设置为1,不需要手动修改read_only。
永久修改全局只读参数方案
永久修改指的是修改配置文件,让数据库每次启动时都加载对应的只读参数配置,适合需要长期保持只读状态的场景,比如从库节点。
操作步骤
- 找到mysql的配置文件,Linux系统通常是
/etc/my.cnf或者/etc/mysql/my.cnf,Windows系统通常是my.ini - 编辑配置文件,在
[mysqld]区块下添加只读参数配置:[mysqld] # 开启普通用户只读限制 read_only=1 # 如果需要开启超级用户只读限制,添加以下配置 super_read_only=1
- 保存配置文件后重启mysql服务,Linux系统执行命令:
systemctl restart mysqld # 或者 service mysql restart
Windows系统可以在服务管理器中重启mysql服务,或者在命令行执行net stop mysql后执行net start mysql - 重启后登录数据库验证参数是否生效,执行和临时修改方案相同的查询命令即可
注意事项
修改配置文件前建议先备份原配置文件,避免配置错误导致数据库无法启动。如果只需要临时开启只读,不建议使用永久修改方案,避免重启后忘记恢复配置影响业务。
两种方案对比
以下是临时修改和永久修改两种方案的对比:
| 方案类型 | 生效周期 | 适用场景 | 是否需要重启数据库 |
|---|---|---|---|
| 临时修改 | 当前运行周期,重启后失效 | 临时维护、数据迁移校验 | 否 |
| 永久修改 | 长期生效,重启后保持配置 | 从库节点、长期数据保护 | 是 |
常见问题说明
1. 开启read_only后,超级用户执行写操作会报错吗?不会,read_only仅限制普通用户,超级用户仍然可以正常执行写操作,如果需要限制超级用户,需要开启super_read_only。
2. 从库开启只读模式会影响同步吗?不会,从库的同步线程属于超级权限,不受read_only限制,开启只读模式后可以正常接收主库的同步数据。
3. 如何关闭只读模式?临时关闭执行SET GLOBAL read_only = 0;和SET GLOBAL super_read_only = 0;,永久关闭则修改配置文件删除对应参数或者将参数值改为0,然后重启数据库即可。