mgr集群异常触发的保护性只读,根本原因是member_state非online(如error/unreachable/offline),此时super_read_only被自动置on,强行set global read_only/super_read_only=off无效;必须先查performance_schema.replication_group_members确认真实状态,并修复网络、版本、权限或磁盘等底层问题。

MySQL 8.0 中 MGR 集群异常导致的只读,不是 read_only 被手动设为 ON,而是集群自动触发的保护性只读 —— 必须先确认 MEMBER_STATE 是否已失联或降级,否则调 SET GLOBAL read_only = OFF 毫无意义。
查 performance_schema.replication_group_members 确认真实成员状态
这是唯一可信的集群视图来源。其他方式(如 SHOW STATUS LIKE 'group_replication%'、information_schema.GROUP_REPLICATION_MEMBERS)在节点失联但尚未被踢出时可能返回空或陈旧数据。
-
MEMBER_STATE = OFFLINE:说明该节点group_replication插件根本没启动,START GROUP_REPLICATION前必须确保配置正确、端口通、用户权限完备 -
MEMBER_STATE = RECOVERING:节点正在同步事务,但卡住超过group_replication_unreachable_majority_timeout(默认 0,即立即超时)后会转为ERROR;检查MEMBER_VERSION是否与集群其他节点一致(如 8.0.45 节点加入 8.0.43 组会卡在此状态) -
MEMBER_STATE = ERROR或UNREACHABLE:立刻查错误日志中MY-011582(连接 donor 失败)、MY-011499(成员被移除)等关键错误码 - 注意:
MEMBER_ROLE在单主模式下为PRIMARY的节点才允许写入;但若其MEMBER_STATE ≠ ONLINE,它仍会被集群拒绝写入请求,且整个组会进入只读冻结
为什么 super_read_only 是只读的真正开关?
在单主 MGR 模式下,非 PRIMARY 节点会自动设置 super_read_only = ON,这比 read_only 更严格:连 root 用户也无法绕过。而当 PRIMARY 节点异常退出,选举未完成时,剩余节点仍维持 super_read_only = ON,导致全组不可写。
- 执行
SELECT @@global.super_read_only, @@global.read_only;—— 若前者为ON,后者为OFF,说明不是人为设只读,而是 MGR 自动施加的限制 - 不要直接
SET GLOBAL super_read_only = OFF:这会破坏集群一致性,可能导致数据分裂;应先恢复 PRIMARY 节点或手动引导新主(SET GLOBAL group_replication_bootstrap_group = ON) -
super_read_only只有在集群达成多数派共识后才会自动切换,强行修改不会生效,且下次重启或状态变更时会被插件重置
别碰 replication_group_member_stats 做故障判断
这张表看起来字段多(如 COUNT_TRANSACTIONS_IN_QUEUE),但它只反映本节点本地缓存,不参与集群共识。一旦节点断连或 XCom 崩溃,它可能卡住、返回全 NULL,甚至持续显示“正常”而实际已掉线。
- 它不能告诉你其他节点是否存活,也不能替代
replication_group_members做状态判断 - 仅适合做本节点实时负载观察:比如
COUNT_TRANSACTIONS_IN_QUEUE > 100且持续上升,说明回放慢或写入太快,但需结合MEMBER_STATE才能定位是本节点问题还是集群问题 - 高并发下频繁查这张表会显著增加
performance_schema内存压力,建议采样间隔 ≥ 5 秒
磁盘满、OOM、引擎不兼容也会触发只读,但表现不同
这些是系统层/存储层触发的只读,和 MGR 无关,但现象都是写入失败,容易混淆。
- 磁盘空间耗尽时,InnoDB 强制只读,错误日志里会有
Disk is full或OS error code 28,且df -h /var/lib/mysql显示 100% - OOM 后 MySQL 重启,可能残留
read_only = ON状态,但此时replication_group_members通常为空或全OFFLINE,因为插件根本没加载成功 - 存在 MyISAM 表时,MGR 插件加载后会直接拒绝 DDL,并报
ERROR 3098 (HY000);此时即使集群其他节点正常,该节点也会被标记为ERROR,拖垮多数派
最常被忽略的是:MGR 触发的只读状态,super_read_only 和 read_only 都只是结果,不是原因。真正要盯住的,永远是 MEMBER_STATE 字段值,以及它背后对应的网络、版本、权限、磁盘四类基础条件 —— 这些不恢复,改变量毫无作用。











