MGR启动必须严格满足5项基础配置:gtid_mode与enforce_gtid_consistency均需ON;binlog_format=ROW;transaction_write_set_extraction=XXHASH64;disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY";log_slave_updates=ON。

MGR不是改完配置重启就能跑的复制方案,5项基础参数缺一不可,否则节点卡在RECOVERING或直接报错Plugin 'group_replication' init function returned error。
必须硬性满足的5个MySQL启动前配置
这些不是建议项,是group_replication插件加载和组通信的前置门槛,动态SET GLOBAL无效,必须写进my.cnf并重启mysqld:
-
gtid_mode=ON且enforce_gtid_consistency=ON:MGR依赖GTID做事务追踪和冲突检测,任一关闭都会导致插件初始化失败 -
binlog_format=ROW:MGR只支持行格式,设成MIXED或STATEMENT时插件加载直接拒绝,日志明确提示Group Replication requires binlog_format = ROW -
transaction_write_set_extraction=XXHASH64:必须显式指定,不设、设空、或设成XXHASH32会导致节点无法完成写集认证,状态长期卡在RECOVERING -
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY":大小写敏感、英文逗号分隔、无空格;漏掉任意一个引擎,插件注册即失败 -
log_slave_updates=ON:即使是单主模式,所有节点也必须开启,否则新节点无法从 donor 获取 relay log 进行追平
group_replication_group_name必须是合法UUID
这个值不是占位符,填错会导致节点拒绝加入组,错误藏在错误日志里:Group replication: Invalid group name format:
- 正确做法是用真实UUID,例如:
a1b2c3d4-5678-90ab-cdef-1234567890ab - 生成方式:
SELECT UUID();或读取/var/lib/mysql/auto.cnf中的server-uuid - 三节点必须完全一致,不能带空格、中文、下划线,位数必须是32字符+4个短横
网络端口与引导操作最容易踩坑
group_replication_local_address 和 group_replication_group_seeds 是MGR内部组通信地址(默认端口33061),不是客户端连接地址,常被防火墙/Docker网络拦截:
-
group_replication_local_address必须填**其他节点能直连的IP+端口**,Docker容器不能填127.0.0.1或容器内网IP,得用宿主机可路由的地址 -
group_replication_group_seeds必须包含所有节点的local_address,少一个就可能导致新节点无法发现集群 - 首个节点启动必须手动引导:
SET GLOBAL group_replication_bootstrap_group = ON;→START GROUP_REPLICATION;→ 立即执行SET GLOBAL group_replication_bootstrap_group = OFF;,否则后续节点无法加入
新节点卡在RECOVERING怎么排查
这不是网络不通就是复制源不匹配,本质是“数据追平”失败:
- 检查 donor 节点是否在线且状态为
ONLINE,group_replication_group_seeds中至少包含一个健康 donor 地址 - 确认 donor 已开启
log_slave_updates=ON - 验证复制账号权限:如
repl@'%'必须有REPLICATION SLAVE权限,且 host 匹配(不能只开localhost) - MySQL 8.0.23+ 默认
group_replication_recovery_complete_at=TRANSACTIONS_CERTIFIED,若想加速上线可临时设为TRANSACTIONS_APPLIED,但会牺牲部分一致性保障
真正难的不是配置项本身,而是所有节点的my.cnf必须严格对齐、所有server_id互不重复、所有server-uuid唯一且不被覆盖——哪怕一个节点的disabled_storage_engines少写了MEMORY,整个集群就起不来。别信“差不多”,MGR认的是字节级精确匹配。


















