日期:2026-07-11
标签:#面试 #八股 #后端 #MySQL #数据库 #场景题
一句话答案
通过全量迁移、增量 CDC、持续校验、灰度切读、短期双写或写转发、最终切写和回滚窗口,实现业务不停服迁移。
面试口语版
先冻结表结构变更并建立迁移任务,在不阻塞业务的快照点做全量复制,同时记录 binlog 位点;随后用 CDC 持续同步增量。全量完成后比较行数、校验和和关键业务数据,先灰度读新库并保留旧库兜底。确认稳定后切写,切写阶段要确保只有一个写入事实源,可用短暂停写窗口、写代理或受控双写。继续反向同步和观察一段时间,最后下线旧库。每一步都要可回滚、幂等并有数据对账。
迁移流程
flowchart LR
A[全量快照] --> B[CDC增量同步]
B --> C[持续校验]
C --> D[灰度切读]
D --> E[切换写入]
E --> F[观察与回滚窗口]
F --> G[下线旧库]
关键细节
- 全量和增量必须通过一致快照与 binlog 位点无缝衔接。
- 应避免无约束双写;两次写无法天然原子,失败会造成不一致。
- 自增 ID、时区、字符集、排序规则和默认值需要专项校验。
- 大表复制要限速,监控主库延迟、复制 Lag 和磁盘水位。
面试官追问
- 双写失败造成不一致怎么办?
- 如何验证新旧库数据一致?
- 切写时如何避免两边同时成为主库?
面试官追问参考答案
1. 双写失败造成不一致怎么办?
更稳妥的是单写旧库并通过 CDC 同步,切换后再单写新库。若必须双写,以一个库为事实源,记录失败事件并异步补偿,通过版本号或更新时间避免旧数据覆盖新数据,持续做差异校验。
2. 如何验证新旧库数据一致?
先比表级行数和分片范围,再按主键范围计算聚合校验和,并抽查关键字段;在线阶段持续比较增量事件和影子读结果。发现差异后按主键定位、重放或修复,校验任务必须限速。
3. 切写时如何避免两边同时成为主库?
使用统一配置或代理控制写路由,并以 Epoch/fencing token 标识当前写主,旧主拒绝新 Epoch 写入。切换步骤要原子、可审计,必要时设置几秒只读窗口排空在途写,再开放新库。
学习清单
- 理解一致快照、binlog 位点和 CDC。
- 能说清切读、切写及回滚方案。