MySQL迁移减少停机时间的核心是“全量同步+增量追平”,停机仅用于校验和切换(秒级至分钟级);通过主从复制实时同步,监控延迟归零后,用FLUSH TABLES WITH READ LOCK获取位点并快速追平增量;切换需自动化脚本+校验+回退机制,旧库保留只读至少24小时。

MySQL迁移时减少停机时间,核心是把“全量同步 + 增量追平”拆解清楚,并在切换前尽可能压缩最终停机窗口。关键不在于完全避免停机,而在于让停机只用于校验和切换,通常控制在秒级到分钟级。
使用主从复制实现平滑过渡
在新库上搭建从库,指向旧库为主库,持续同步数据。这样迁移期间业务照常写旧库,新库实时追平。注意开启GTID或确保binlog格式为ROW,避免语句级复制导致的数据不一致。复制延迟需持续监控,延迟归零后再进入下一步。
- 旧库开启binlog(log-bin=ON),server-id唯一且非0
- 新库执行CHANGE REPLICATION SOURCE TO(或CHANGE MASTER TO)配置同步参数
- 用SHOW REPLICATION STATUS\G观察Seconds_Behind_Source是否稳定为0
停机前冻结写入并快速追平增量
真正停机前,不是直接停服务,而是先禁止新写入:可通过应用层灰度关闭写流量,或在旧库执行FLUSH TABLES WITH READ LOCK(仅需几秒获取一致性位点)。锁表后立刻记录当前binlog位置(SHOW BINLOG EVENTS LIMIT 1),然后解锁,再让新库基于该位点追最后的增量日志。
- FLUSH TABLES WITH READ LOCK会阻塞写,但不阻塞读,执行极快
- 解锁后立即用mysqlbinlog解析最后binlog,或靠复制线程自动追赶
- 确认新库SQL线程已执行到对应position,再进行切换
切换过程自动化+可回退
将DNS、VIP、连接池配置或应用配置的切换封装成脚本,包含前置检查(如复制延迟=0、校验行数/校验和)、切换动作、基础连通性验证。同时保留旧库至少24小时只读,确保能快速切回。建议提前演练整套流程,包括回滚步骤。
- 切换脚本中加入SELECT COUNT(*)对比关键表,或用pt-table-checksum做抽样校验
- 修改应用配置后,用简单INSERT+SELECT测试新库读写通路
- 旧库保留read_only=ON,防止误写;必要时可临时关闭只读快速回退
考虑逻辑导出+并行回放(适合中小库)
对几百GB以内的库,mysqldump配合--single-transaction和--master-data=2可获得一致性快照和起始位点;导入端用mydumper/myloader或并行mysql客户端加速恢复。导入完成后,再接续复制剩余binlog,大幅缩短主从同步等待时间。
- 避免单线程source大SQL文件,改用mysql --force -e "source xxx.sql" 或并行工具
- 导入时关闭autocommit、调整innodb_buffer_pool_size、禁用唯一键检查(谨慎)可提速
- 导入完毕后,用START REPLICA UNTIL指定位置,精准追到最后增量










