Yihui’s Blog

如何实现数据库的不停服迁移?

日期:2026-07-11
难度:中等
标签:#面试 #MySQL #数据迁移 #CDC #场景题 #VIP

一句话答案

采用兼容性改造、全量快照、binlog/CDC 增量同步、持续校验和灰度切流,在短暂写栅栏下追平最后增量后切换,并保留旧库回滚窗口。

面试口语版

不停服迁移的核心是把历史数据和迁移期间的新写入都送到新库。先做容量、字符集、账号权限和 SQL 兼容评估,应用改为支持新旧数据源;在一致性快照位点做全量迁移,同时从该位点消费 binlog 增量。全量结束后持续追平并对行数、校验和与核心业务账目做核对。随后灰度读新库,对比结果;写切换前设置短暂写栅栏或可靠双写,等待 CDC 延迟归零,再切主写。切换后旧库只读保留一段时间,明确回切方向,避免双主无序写造成冲突。

原理拆解

flowchart LR
  A[兼容改造] --> B[全量快照]
  B --> C[CDC 增量追平]
  C --> D[持续校验]
  D --> E[灰度读新库]
  E --> F[写栅栏/最后追平]
  F --> G[切换写流量]
  G --> H[观察与回滚窗口]

关键细节

  • 全量与增量必须用同一一致性位点衔接,否则会丢数据或重复。
  • 双写要处理先后顺序、部分失败、幂等和补偿,不能把它当天然强一致。
  • 校验不仅看行数,还要分片 checksum、抽样字段和业务账务对账。
  • “不停服”通常允许极短写栅栏,不等于完全没有延迟或风险。

面试官追问

  1. 全量期间数据变化如何捕获?
  2. 双写一边失败怎么办?
  3. 切换后如何安全回滚?
  4. 主键冲突如何处理?

高分补充

迁移前要演练限速、暂停、续传和回滚;目标不是只完成切换,而是任何阶段都能解释数据状态。

学习清单

  • 能画出全量、CDC、校验、灰度、切写、回滚链路。
Maintained by · YihuiEdit on GitHub

Keep reading

View all posts