MariaDB服务器宕机后无法重新加入为从节点的问题求助
MariaDB故障转移后GTID不兼容导致节点无法重连的问题分析与解决
问题原因
- GTID域不匹配:原主节点server2的
server_id=1,所有节点GTID为0-1-853336(格式为domain-server_id-sequence);server3成为新主后,其server_id=200,生成了以自己server_id为标识的GTID0-200-3,而server1/2的GTID仍停留在旧主的0-1-853336,两者GTID域无交集,被判定为不兼容。 - 新主生成独立GTID事件:server3升主后,哪怕是系统级的写操作(如元数据变更)都会生成新的GTID序列,导致其
gtid_binlog_pos与旧节点的gtid_current_pos完全脱节,触发自动重连/手动重连的兼容性校验失败。
解决方法
方法一:重置GTID后重新同步(适用于无数据冲突场景)
- 在server1和server2上执行以下SQL:
-- 停止复制进程 STOP SLAVE; -- 重置本地GTID历史与binlog RESET MASTER; -- 设置新主节点并启动复制,MASTER_USE_GTID=slave_pos表示从新主的当前GTID位置开始同步 CHANGE MASTER TO MASTER_HOST='server3', MASTER_USER='your_repl_user', MASTER_PASSWORD='your_repl_pass', MASTER_USE_GTID=slave_pos; START SLAVE; - 用MaxCtrl将节点重新加入监控:
maxctrl call command mariadbmon rejoin DatabaseMonitor server1 maxctrl call command mariadbmon rejoin DatabaseMonitor server2
方法二:手动合并GTID域(适用于需要保留旧数据的场景)
- 先确认server3未生成旧主GTID域(
0-1)的事件:-- 在server3上查看binlog事件,跳过前3个格式描述事件 SHOW BINLOG EVENTS IN 'mysql-bin.000001' FROM 4; - 在server1和server2上临时开启GTID去重,避免冲突报错:
SET GLOBAL gtid_ignore_duplicates=ON; - 设置新主并启动复制,让节点自动合并GTID:
CHANGE MASTER TO MASTER_HOST='server3', MASTER_USER='your_repl_user', MASTER_PASSWORD='your_repl_pass', MASTER_USE_GTID=current_pos; START SLAVE; - 复制正常启动后,关闭GTID去重:
SET GLOBAL gtid_ignore_duplicates=OFF; - 执行MaxCtrl命令重新加入监控(同方法一)
注意事项
- 故障转移后需确认新主未产生与旧节点冲突的写操作,否则可能导致数据不一致。
auto_rejoin=true仅在节点GTID与新主兼容时生效,跨server_id的GTID域变更会触发兼容性校验失败。- 建议提前规划集群内所有节点的
server_id,避免故障转移后出现GTID域冲突。
内容的提问来源于stack exchange,提问作者Nandni
相关产品推荐
相关产品推荐

