MySQL 8.0 实现业务零停机平滑切换的核心方案是基于主从复制(Replication)构建新实例,待数据同步追平后,在应用层切换数据源。该方案适用于大多数在线业务,主要风险边界在于切换瞬间的写停顿和数据一致性校验。
先说结论:通过搭建从库同步数据,在业务低峰期短暂禁写完成主从切换,可实现感知层面的零停机。
- 适合:在线业务迁移、实例升级、机房搬迁场景
- 先准备:确保 GTID 模式开启、网络连通性、从库配置不低于主库
- 验收:切换后验证主从延迟为零、应用连接正常、数据 checksum 一致
命令速用版
以下命令用于在 MySQL 8.0.22 及以上版本配置复制关系,旧版本请将 SOURCE 替换为 MASTER,REPLICA 替换为 SLAVE。
-- 在从库执行,指向新主库 IP
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.1.100', SOURCE_USER='repl', SOURCE_PASSWORD='password', SOURCE_AUTO_POSITION=1;
-- 启动复制
START REPLICA;
-- 切换时临时禁写
SET GLOBAL read_only=ON;
SET GLOBAL super_read_only=ON;为什么会这样
直接导出导入数据需要锁表,会导致业务中断,而主从复制利用 Binlog 异步同步,允许源库在同步期间继续提供服务。MySQL 8.0 默认开启 GTID(全局事务标识),使得主从切换时不需要手动计算 Binlog 位置,降低了切换出错风险。公开资料中没有看到可靠的量化数据表明具体切换耗时,实际时长取决于数据延迟和网络状况。
分步处理
第一步:检查源库配置。确认源库 gtid_mode=ON 且 enforce_gtid_consistency=ON,这是安全切换的前提。
第二步:搭建从库实例。安装相同版本的 MySQL 8.0,配置 server_id 唯一,使用 mysqldump 或物理拷贝初始化基础数据。
第三步:建立复制链路。在从库执行 CHANGE REPLICATION SOURCE TO 命令,指定源库账号密码,开启 SOURCE_AUTO_POSITION=1 自动定位位点。
第四步:观察同步延迟。等待从库追上源库,期间业务可正常读写源库。
第五步:执行切换操作。在业务低峰期,先将源库设为 read_only=ON 停止写入,确认从库 Seconds_Behind_Source 为 0 后,将从库设为可写,修改应用连接地址指向新库。
第六步:回滚准备。若切换失败,保持源库数据不变,将应用连接改回源库,确保业务恢复。
怎么验证是否生效
使用 SHOW REPLICA STATUS\G 检查 Replica_IO_Running 和 Replica_SQL_Running 均为 Yes。切换后在应用端执行写入操作,查询新库确认数据实时可见。使用 pt-table-checksum 工具对比主从表数据一致性,确保无差异。
常见坑
MySQL 8.0.22 版本前后复制命令术语不一致,脚本需兼容 SOURCE/REPLICA 与 MASTER/SLAVE。若源库存在无主键表,复制效率会显著下降且容易冲突,建议迁移前优化表结构。应用层连接池缓存旧 IP 会导致切换后连接失败,需确认连接池配置了重试机制或手动刷新。
常见问题
切换过程中业务会中断吗?
读写操作在最终切换瞬间会有短暂停顿,通常用于确保数据一致性的禁写操作耗时秒级。
MySQL 8.0 低版本能迁移到高版本吗?
支持跨小版本迁移,但建议目标库版本不低于源库,避免 Binlog 格式兼容性问题。
切换失败如何快速回滚?
只要源库数据未被清空,将应用连接地址改回源库 IP 即可恢复,前提是源库未执行破坏性操作。
参考来源
- MySQL Official Documentation, Replication Configuration, https://dev.mysql.com/doc/refman/8.0/en/replication-howto.html
- MySQL Official Documentation, Switching Replication Source, https://dev.mysql.com/doc/refman/8.0/en/replication-howto-replicasetup.html