最近遇到一个奇葩的需求,需要将mysql的主从复制模式由ABB修改为ABC,恰好这个mysql集群没有开启GTID,当时是在B上做了一次全量备份,然后使用该全量备份恢复C的方式进行的。做完之后在想有没有简单的方式实现,最终有了结果。
假设原主从复制拓扑为 A -- B1 -- B2,最终要求 B2作为 B1的从库存在:
对于非GTID模式的集群:
1. B2上执行 stop slave io_thread;
2. 确保 B1 上的数据要比 B2要接近主节点;
3. 在B1上执行stop slave io_thread; 待B1节点上的relay log应用完全之后
执行 show master status;命令得到B1节点当前binlog的点位信息 B1_log1 和 B1_pos1。
再执行 show slave status;命令通过 Master_Log_File 和 Read_Master_Log_Pos 得到当前相对于主节点的binlog的点位信息 A_log1 和 A_pos1。
而后执行 start slave io_thread;恢复 B1的复制状态。
4. 在 B2 上执行 start slave until master_log_file='${A_log1}',master_log_pos=A_pos1; 待A_log1 和 A_pos1该点位前的数据全部重放完成之后,将 B2按照 B1_log1 B1_pos1的点位作为 B1的从库挂在 B1上。
对于 GTID 模式的集群,因为 GTID在整个集群中都是一致的,直接挂载即可。