能,但需严格控制主从延迟和切换时机:须确认Seconds_Behind_Master稳定为0超30秒、从库read_only=ON、binlog_format=ROW;停写需应用层优雅断开并校验GTID或位点一致;切换应通过中间件而非直连,并重置从库配置。

主从复制能不能直接当热迁移用
能,但不是“配好就自动切”,核心是主从延迟和切换时机控制。很多团队误以为启用了 CHANGE MASTER TO 就算完成热迁移,结果切完发现从库缺了几秒事务,业务报错写冲突或查不到最新数据。
- 必须确认
Seconds_Behind_Master稳定为0(且持续 30 秒以上),不能只看某次SHOW SLAVE STATUS的快照值 - 从库必须开启
read_only=ON,否则人为写入会破坏一致性,后续切主后可能丢数据 - 主库的
binlog_format必须是ROW,MIXED或STATEMENT在涉及函数、临时表、非确定性语句时会丢事件
如何安全停写并确认同步完成
“停写”不是 kill 连接,而是让应用层优雅断开写流量,同时确认所有 binlog 已被从库重放完毕。直接 FLUSH TABLES WITH READ LOCK 会卡住主库,对线上服务影响极大。
- 先在主库执行
FLUSH BINARY LOGS,确保当前 binlog 文件不再追加新事件 - 查主库
SHOW MASTER STATUS记下File和Position;再查从库SHOW SLAVE STATUS对比Master_Log_File和Read_Master_Log_Pos是否完全一致 - 真正停写前,用
SELECT @@global.gtid_executed(如果启用了 GTID)做最终校验,比文件+位点更可靠
切换时怎么避免应用连错库
DNS 切换有缓存,VIP 漂移要防脑裂,硬改连接字符串风险高——最稳妥的是通过中间件或配置中心下发新地址,但前提是应用支持运行时重连。
- 不要依赖
mysql -h old_ip这类直连方式,必须走统一入口(如 ProxySQL、HAProxy 或应用内的数据源路由) - 从库提升为主库后,立刻执行
RESET SLAVE ALL,清掉旧主信息,否则下次再配从库可能复用错误的master_host - 检查新主库的
server_id是否全局唯一,重复会导致后续从库同步失败,错误信息通常是Got fatal error 1236 from master
为什么 GTID 比传统位点更适合热迁移
因为位点切换要人工比对文件名和偏移量,出错概率高;GTID 把事务打上唯一 ID,从库只要告诉主库“我已执行到哪些 ID”,主库就知道该从哪继续发。
- 启用前必须确保所有节点
gtid_mode=ON且enforce_gtid_consistency=ON,否则启动复制会报错ERROR 1785 - 切换时用
CHANGE MASTER TO MASTER_AUTO_POSITION = 1,不用填MASTER_LOG_FILE和MASTER_LOG_POS - GTID 不解决主从延迟,只是让“确认同步完成”这件事更原子——但如果你没等
Retrieved_Gtid_Set == Executed_Gtid_Set,照样切飞
真正卡住热迁移的,从来不是配置命令写得对不对,而是谁来判断“现在可以切了”。这个判断点需要监控介入、人工核验、超时熔断三者配合,光靠 SQL 命令没法兜底。


















