当前位置: 首页 > news >正文

SET GLOBAL read_only = ON;的庖丁解牛

SET GLOBAL read_only = ON;是 MySQL 中用于将实例置于只读模式的关键命令。其作用远不止“禁止写入”,而是一套涉及权限、复制、高可用切换的系统级机制。


一、命令本质与作用机制

1.功能定义
  • 开启后除具有SUPER权限(MySQL 8.0 为SYSTEM_USER/SYSTEM_VARIABLES_ADMIN)的用户外,所有会话禁止执行写操作
  • 写操作包括
    • DML:INSERTUPDATEDELETEREPLACE
    • DDL:CREATEALTERDROP
    • 权限变更:GRANTREVOKE
    • 事务控制:BEGIN/START TRANSACTION仍允许,但COMMIT若含写操作则失败
2.内部实现
  • 状态标志:MySQL 服务器维护全局变量read_only(布尔值)。
  • 权限检查点
    SQL 层解析后、执行前,调用check_readonly()函数:
    if(read_only&&!thd->security_context->has_super()){my_error(ER_OPTION_PREVENTS_STATEMENT,...);returntrue;// 拒绝执行}
  • 不涉及存储引擎:InnoDB/MyISAM 本身无“只读”状态,完全由 Server 层拦截。

二、作用域与权限控制

用户类型是否受read_only限制说明
普通用户✅ 是所有写操作被拒绝
SUPER权限用户(MySQL 5.7-)❌ 否可正常写入
SYSTEM_USER+SYSTEM_VARIABLES_ADMIN(MySQL 8.0+)❌ 否替代SUPER的精细权限
复制 SQL 线程❌ 否自动豁免(即使无 SUPER)
Event Scheduler✅ 是事件中的写操作会被拒绝(除非用 SUPER 用户定义)

关键设计
复制线程必须能写入,否则主从架构崩溃。MySQL 内部对复制线程有特殊标识(thd->slave_thread = true),自动绕过检查。


三、典型应用场景

1.主从切换(Failover)
  • 流程
    1. 原主库执行SET GLOBAL read_only = ON;→ 禁止新写入
    2. 等待从库追平(Seconds_Behind_Master = 0
    3. 提升从库为主库
    4. 原主库(现从库)执行CHANGE MASTER指向新主
  • 目的:防止切换过程中双写导致数据不一致。
2.从库保护
  • 永久设置:在从库my.cnf中配置:
    [mysqld] read_only = ON
  • 效果:即使应用误连从库,也无法写入(除非用 SUPER 用户)。
3.紧急只读维护
  • 场景:主库负载过高,需临时禁止写入以排查问题。
  • 操作
    SETGLOBALread_only=ON;-- 立即生效-- 排查完成后SETGLOBALread_only=OFF;

四、重要限制与陷阱

1.不阻止临时表操作
  • 允许CREATE TEMPORARY TABLEDROP TEMPORARY TABLE
  • 原因:临时表仅当前会话可见,不影响其他用户或复制。
2.不阻止非事务性操作
  • 允许
    • SET变量(会话级)
    • SELECTSHOWEXPLAIN
    • ANALYZE TABLEOPTIMIZE TABLE(MyISAM)
3.GTID 模式下的特殊行为
  • MySQL 5.7+ GTID
    即使read_only=ONGTID_PURGED等复制相关操作仍可能被允许(需 SUPER)。
4.不持久化
  • 重启失效SET GLOBAL仅运行时生效。
  • 持久化方法
    • 写入my.cnfread_only = ON
    • MySQL 8.0+:SET PERSIST read_only = ON;(写入mysqld-auto.cnf

五、与类似机制的区别

机制作用是否影响复制线程是否需 SUPER
read_only = ON禁止用户写入❌ 不影响❌ 普通用户被禁
super_read_only = ON禁止所有写入(含 SUPER)❌ 不影响✅ 仅复制线程可写
FLUSH TABLES WITH READ LOCK全局读锁(FTWRL)✅ 阻塞复制❌ 所有写入阻塞

⚠️super_read_only更严格
用于MGR(组复制)InnoDB Cluster,确保实例完全只读(连 DBA 也不能写)。


六、验证与监控

1.检查当前状态
SHOWVARIABLESLIKE'read_only';-- +---------------+-------+-- | Variable_name | Value |-- +---------------+-------+-- | read_only | ON |-- +---------------+-------+
2.测试写入是否被拒
INSERTINTOtest.tVALUES(1);-- ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement
3.监控只读状态(运维)
  • Prometheusmysql_global_variables_read_only
  • 日志:无直接日志,但应用会报ER_OPTION_PREVENTS_STATEMENT

七、总结:核心要点

  • 目的保护数据一致性,而非性能优化。
  • 豁免:复制线程、SUPER 用户(或 MySQL 8.0 精细权限)。
  • 场景:主从切换、从库保护、紧急维护。
  • 风险
    • 误开read_only导致应用写入失败
    • 未持久化导致重启后失效
  • 最佳实践
    • 从库永久配置read_only=ON
    • 主库切换时先设只读,再切从库
    • 使用super_read_only替代(如用 InnoDB Cluster)

💡本质
read_onlyMySQL 复制架构的基石安全机制,确保“一主多从”模型的数据流向可控。

http://www.jsqmd.com/news/219131/

相关文章:

  • 多引擎翻译系统:CSANMT作为备选引擎的集成方案
  • 玩赚AI艺术:基于阿里通义Z-Image-Turbo的NFT生成系统快速搭建
  • 轻松掌握电子课本下载完整教程:高效获取PDF教材的终极指南
  • Windows系统终极优化指南:RyTuneX完整使用手册
  • APK Installer:Windows平台安卓应用无缝安装全攻略
  • MPV播放器终极配置指南:3步完成Windows平台完美设置
  • Bootstrap日期时间选择器完整配置与使用指南
  • 基于Java的实验室智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • Mac百度网盘提速革命:从蜗牛爬行到极速飞驰的蜕变之旅
  • 如何为venera添加自定义漫画源:完整配置指南
  • 百度文库文档优化工具使用指南
  • CSANMT模型输入分段:处理超长文本的实用方案
  • 智能翻译在跨国社交平台的应用
  • Fiddler中文版终极指南:3分钟掌握网络调试神器
  • 终极百度文库优化神器:一键免费获取完整文档的完整指南
  • XPipe终极指南:快速掌握免费服务器管理工具
  • Easy-Scraper终极指南:零代码网页数据采集完全解决方案
  • 如何用CSANMT实现网页内容的实时翻译插件?
  • Mac百度网盘SVIP免费解锁终极提速方案
  • Ultimate ASI Loader:游戏MOD管理的革命性突破
  • 专业级Windows系统优化工具RyTuneX深度使用指南
  • 军事后勤管理:装备铭牌OCR快速清点库存
  • 无需GPU也能跑OCR:轻量级CPU版镜像部署全教程
  • XPipe终极指南:跨平台远程连接管理工具快速上手
  • 5分钟精通音频解密:Unlock Music完整使用教程
  • 如何实现企业微信智能打卡:3种高效定位解决方案
  • 终极指南:快速在Linux上配置个性化键盘音效
  • 智能翻译质量反馈:CSANMT模型的持续改进机制
  • 英雄联盟智能管家Akari:重新定义你的游戏效率革命
  • AI办公自动化入口:部署OCR镜像实现合同信息提取