数据迁移方案
2021年某电商平台从Oracle迁移到MySQL,迁移过程中出现了严重的数据丢失问题:
迁移脚本写的是"DELETE FROM old_table",执行后发现新表的数据还没同步完,删掉了旧表的数据。
更糟糕的是,因为Oracle和MySQL的SQL语法有差异,部分查询在MySQL上执行报错,业务停了整整2小时。
这次迁移事故导致约5万条数据丢失,平台损失约10万元。
【面试官手记】
数据迁移是生产环境最危险的操作之一。我面试过的候选人里,能说清楚"迁移方案"的不超过30%,能说出"回滚方案"的不超过20%。数据迁移的关键是可回滚 + 可验证。
一、数据迁移的四种方案 🔴
1.1 四种方案
1.2 方案对比
二、停机迁移方案 🔴
2.1 流程
2.2 脚本示例
三、双写方案 🟡
3.1 原理
3.2 代码实现
3.3 数据校验
四、CDC方案 🟡
4.1 原理
4.2 Canal实现
五、回滚方案 🟡
5.1 回滚策略
5.2 回滚脚本
六、生产避坑 🟡
6.1 数据迁移的五大坑
坑1:迁移脚本有bug
坑2:迁移过程新数据丢失
坑3:迁移后查询性能下降
坑4:事务范围过大
坑5:没有回滚方案
6.2 迁移检查清单
七、真实面试回放 🟡
面试官:数据迁移怎么保证一致性?
候选人(小张):三种方案:
一是停机迁移。最简单,迁移期间停止写入,数据一致性高。但需要停服。
二是双写。应用同时写入新旧库,切换前校验数据,然后切换。双写期间可能不一致。
三是CDC。监听binlog实时同步,对业务影响最小,但实现复杂。
面试官:双写过程中数据不一致了怎么办?
小张:两个步骤:
一是发现差异。定期校验新旧库数据,找出不一致的记录。
二是修复差异。用旧库数据覆盖新库数据,或者修复后同步。
面试官:迁移失败了怎么回滚?
小张:三个原则:
一是迁移前必须备份。
二是迁移脚本要支持checkpoint,分批次执行。
三是要有回滚脚本,能一键切回旧库。
【面试官手记】
小张这场面试的亮点:
知道三种迁移方案及适用场景
知道双写期间的数据校验方法
知道回滚的三个原则
数据迁移是P6工程师必备技能,能完整回答的候选人,说明有生产运维经验。
数据迁移的核心是可回滚 + 可验证。记住三个要点:
- 方案选择:根据停服时间要求选择方案
- 数据校验:迁移后必须校验一致性
- 回滚方案:必须准备好回滚方案
数据迁移是生产环境最危险的操作,宁可慢一点,不可出错。