操作前关键准备
- 备份数据库
执行任何写操作前,使用以下命令备份(以MySQL为例):mysqldump -u [用户名] -p --all-databases > full_backup.sql
- 检查只读状态
登录数据库确认当前状态:SHOW VARIABLES LIKE 'read_only'; -- MySQL SELECT pg_is_in_recovery(); -- PostgreSQL(返回 f 表示非只读)
**二、取消只读模式的具体步骤
MySQL/MariaDB
方法1:动态修改(无需重启)
SET GLOBAL read_only = OFF; -- 取消全局只读 SET GLOBAL super_read_only = OFF; -- 若启用超级只读需额外关闭
方法2:修改配置文件(需重启)
编辑 /etc/my.cnf
或 /etc/mysql/my.cnf
:
[mysqld] read_only = OFF # 删除或设为OFF super_read_only = OFF # 同上
重启服务生效:
systemctl restart mysqld
PostgreSQL
步骤:
- 结束恢复模式(如主从架构中的从库):
pg_ctl promote -D /var/lib/pgsql/data/ # 提升从库为主库
- 单机环境修改配置:
编辑postgresql.conf
:default_transaction_read_only = off # 确保为off
重启服务:
systemctl restart postgresql
Redis
redis-cli 127.0.0.1:6379> CONFIG SET replica-read-only no # 关闭副本只读 127.0.0.1:6379> CONFIG REWRITE # 持久化配置
MongoDB
use admin db.adminCommand({ setParameter: 1, readOnly: false }) // 取消只读
验证是否成功
- MySQL:
SHOW VARIABLES LIKE 'read_only'; -- 结果应为 OFF
- PostgreSQL:
INSERT INTO test_table (col) VALUES ('write_test'); -- 测试写入
- 通用检查:
观察应用日志或使用监控工具(如Prometheus)确认写操作恢复。
常见问题解决
-
权限不足导致失败
ERROR 1227 (42000): Access denied; need SUPER privilege
解决方案:使用具有
SUPER
权限的账户操作。 -
PostgreSQL从库无法取消只读
需先停止主从同步:pg_ctl stop -D /var/lib/pgsql/data/ rm -f /var/lib/pgsql/data/standby.signal # 删除触发恢复的信号文件 pg_ctl start -D /var/lib/pgsql/data/
-
配置文件修改后未生效
- 检查配置路径是否正确:
mysql --help | grep "my.cnf"
- 确认服务重启:
systemctl status mysqld
- 检查配置路径是否正确:
安全建议
- 只读场景推荐
- 从库查询分离时保持只读
- 数据备份期间启用只读防误操作
- 操作后监控
使用top
、htop
或vmstat
观察服务器负载,避免突发写入导致资源过载。
重要提示:生产环境操作前必须备份数据并制定回滚方案,如遇复杂架构(如集群、主从复制),建议结合数据库文档操作。
引用说明:
- MySQL 8.0 Reference Manual: read_only System Variable
- PostgreSQL Documentation: Recovery Configuration
- Redis Commands: CONFIG SET
- MongoDB Manual: readOnly Mode
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/6375.html