首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >数据迁移零停机:双写、校验与回滚三件套

数据迁移零停机:双写、校验与回滚三件套

原创
作者头像
PikeTalk
发布于 2026-11-04 07:37:18
发布于 2026-11-04 07:37:18
1680
举报

数据迁移零停机:双写、校验与回滚三件套

「周末停机六小时迁库」——在 2026 年还说这话的团队,要么业务真的可以停(内部系统),要么就是没做迁移方案设计。数据迁移的核心要求就一条:业务全程可用,数据分毫不差。实现这一点的标准套路已经非常成熟:双写切换。本文完整拆解这套方案,重点讲三个最容易死人的环节:双写的一致性、校验的完备性、回滚的可执行性。

一、为什么是双写:停写窗口的取舍

零停机迁移的难点在于「数据在搬家过程中还在被写入」。解法空间就三种:

停写窗口:停业务 → 迁移 → 恢复。实现简单但停机时长不可控(数据量大时校验就要几小时),对在线业务不可接受。

CDC 追平:全量拷贝存量 → binlog 增量追平 → 追平后切换。优雅但有个隐藏问题:切流那一刻,应用还在写旧库,binlog 的最后一截需要继续追——切换瞬间存在秒级的写入漂移,处理不好就是数据丢失。

双写:应用同时写新旧两库(同步写旧为主、异步写新),迁移期间双写追平差异 → 切读 → 观察无误 → 停写旧 → 下线。双写把「最后一公里」的漂移窗口消掉了:两边都在写,切换只是改读。

生产主流是 CDC 追平 + 双写切换的组合:CDC 做存量迁移和基础追平,双写覆盖切换期。纯双写(不用 CDC,靠双写自己追平存量)也行,但存量差异修复期长。

二、双写的实现细节:比想象难的地方

双写不是写两份 insert 这么简单,四个细节决定成败:

写路径的主从与失败处理:双写期以旧库为权威——写旧库成功才算成功,写新库失败只记日志(异步补偿任务重放)。绝对不能「两边都成功才返回」,否则新库抖动就把业务打挂了。

自增 ID 的统一:新库的自增 ID 会和旧库冲突。双写前把 ID 生成策略改为全局唯一(雪花 ID 或号段分配),迁移期间两边生成同 ID 不同冲突。这一步必须在双写开始前改造完成,不然数据迁移过去主键就乱了。

更新和删除的覆盖:insert 好办,update 和 delete 呢?同步双写要保证「同一个 update 在两边执行同样的效果」——新库结构与旧库一致时没问题,但迁移往往伴随分库分表改造(旧库单表 → 新库 64 张表),update 语句要按新路由规则改写。这就是为什么双写通常在 DAO 层实现而不是 SQL 层:路由逻辑只有应用层清楚。

双写的灰度范围:全量双写的风险是一旦代码 bug 两边数据一起错。稳的做法是灰度双写:按用户 ID 灰度 1% → 10% → 100%,每级观察差异率。灰度期间未双写的用户走老路径,数据在 CDC 追平链路里兜底。

三、校验:迁移正确性的唯一证明

「应该没问题」在数据迁移里是禁语。上线切换前必须回答「两边数据一致的证明」:

全量校验:分批拉两边同主键记录,逐字段对比(注意 NULL、时区、浮点精度、字符集的处理——这些是假差异的重灾区)。量大时分片并行,每天跑一个范围,全量校验通过才允许切读。

增量校验:全量校验通过后,双写继续产生增量,切换前再做一次「近 24 小时增量」的校验。增量校验比全量快得多,是切换决策的最后依据。

指标对账:切换后业务指标级对账——两边订单量的日报对比、金额总和对比。行级校验过了但业务数对不上,说明校验范围漏了(比如某张关联表没迁)。

校验差异的分类:发现差异先分类——时间性差异(双写异步延迟,等追平即消)、结构差异(字段类型转换造成,评估可接受性)、真实差异(迁移 bug,必须修复后重校)。真实差异的修复要写修复脚本并评审,人肉改数据是事故之源。

四、切换与回滚:为失败做的准备

切读的步骤:读流量切到新库(写仍在双写)→ 观察期(至少一个业务高峰,指标对账 + 错误率监控)→ 无误后停写旧库 → 旧库只读保留两周 → 下线。

回滚的三个检查点:a. 切读后观察期发现问题 → 读流量切回旧库(分钟级操作,这就是为什么停写旧库要留到最后);b. 停写后发现新库丢数据 → 用双写期间旧库的完整数据补齐(旧库此时还是权威数据源,这是双写方案最大的保险);c. 下线后发现问题 → 这时就只剩恢复了,所以下线前务必完成全库备份。

回滚演练:切读前的演练不是可选项——在预发环境完整走一遍「切读 → 制造故障 → 切回」,验证回滚路径真的通。没演练过的回滚方案等于没有回滚方案。

五、时间线:一次典型迁移的节奏

以 5 亿行数据、64 张分表的迁移为例:T-30 天完成 ID 改造和双写代码;T-21 天开启 1% 灰度双写;T-14 天 CDC 存量追平完成,全量校验开始(分片跑 5 天);T-7 天全量校验通过,灰度到 100% 双写;T-3 天增量校验 + 切读演练;T-1 天切读,观察 48 小时;T+2 天停写旧库;T+14 天旧库下线。每个检查点有明确的数据指标(差异率 < 0.001%)作为 gate,不过 gate 不进下一步。

数据迁移没有魔法,全部功夫就在这套流程的执行纪律上:双写保可用、校验保正确、回滚保安全。三件套都有,迁移才敢说「零风险」。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 数据迁移零停机:双写、校验与回滚三件套
    • 一、为什么是双写:停写窗口的取舍
    • 二、双写的实现细节:比想象难的地方
    • 三、校验:迁移正确性的唯一证明
    • 四、切换与回滚:为失败做的准备
    • 五、时间线:一次典型迁移的节奏
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档