第一章 数据迁移概述:定义、重要性与常见场景

大家好,我是这次课程的主讲。开场咱们先聊点实际的——数据迁移这件事,说白了就是把数据从一个地方搬到另一个地方。听起来简单吧?我早年做项目时也这么想,直到有一次凌晨三点还在回滚数据库,才明白这四个字背后有多少坑。

不是所有搬数据的行为都叫迁移。你手动导个 CSV 文件发邮件,那叫搬运。你写脚本把 MySQL 表同步到 Elasticsearch,那叫同步。真正的数据迁移,是一个有始有终、可验证、可回滚的工程过程。它要解决的不只是「把数据拷过去」,而是「如何让业务不停、数据不丢、结果可对账」。

数据迁移的定义

从技术角度定义,数据迁移是指将数据从源系统(Source)完整、准确地传输到目标系统(Target),并确保目标系统能正常承载业务访问的工程活动。它通常包含三个阶段:评估与规划、执行与校验、切换与收尾。

核心三要素:
完整性(数据不丢)
一致性(数据不脏)
可用性(业务不停)
术语 说明 我常说的比喻
源系统 数据的原始存放位置,如旧 MySQL 实例 「老房子」
目标系统 数据要迁往的目的地,如新 TiDB 集群 「新家」
迁移方案 包含工具、脚本、校验逻辑、回滚步骤的完整文档 「搬家图纸」
增量同步 全量迁移后,持续同步源库新增的变化数据 「补货」
回滚方案 当迁移失败时,将业务切回源系统的操作流程 「后悔药」

嗯,这里要注意一个误区。很多人觉得数据迁移就是「同步工具 + 脚本」,做完就完了。我个人习惯把迁移拆成两阶段:全量迁移和增量追平。全量搬过去只是开始,增量追平到秒级,才算真正具备切换条件。

为什么需要重视数据迁移

你想想看,现在哪个系统不是迭代了好几年?数据库从单机到集群,存储从本地盘到云盘,业务从单体到微服务。每一次技术架构的演进,背后几乎都要走一次数据迁移。

我记得有个电商客户,双十一前把核心订单库从 MySQL 迁到分布式数据库。方案评估很充分,但忽略了数据校验的时间窗口。切过去后发现两张表差了 3000 条记录,业务已经跑起来了,回滚损失超过两小时交易数据。那一次之后,我给自己定了个规矩:没有回滚方案的迁移,等于赌博。

我的经验:数据迁移不只是技术活,更是项目管理。你至少要留出 20% 的工期给「验证和回滚演练」。别急着切,切之前先跑一遍完整的回滚流程,证明它能工作。

数据迁移的重要性可以归纳为三点:

  1. 避免业务中断:迁移期间目标系统不可用,源系统还要正常运行,怎么做到无缝?
  2. 保证数据一致:源和目标的数据必须对账,任何一条偏差都可能是线上事故。
  3. 降低升级风险:数据迁移往往伴随版本升级或架构变更,回滚策略是最后的保险。

常见业务场景与模式

做过几年迁移的朋友应该能感受到,场景十个人有九个样,但抽离出来无非这几类模式:

场景 典型例子 我踩过的坑
数据库升级 MySQL 5.6 → 8.0,PgSQL 9.6 → 15 字符集不兼容,迁移后中文乱码
存储迁移 本地 SSD 迁到云 EBS,OSS 到 COS 文件元数据时间戳丢失
系统合并/拆分 两个业务库合并为一个,或一个库拆成多个 唯一键冲突,主键重复插不进去
数据上云/下云 自建机房迁到云数据库,或云到本地 网络延迟导致增量同步积压
格式转换 JSON 转关系表,Redis 转 Pika 序列化版本差异,反序列化失败
脱敏搬迁 生产数据脱敏后导入测试环境 身份证号脱敏后长度变短,业务报错

说到场景,我想起一个经典问题:什么时候需要做增量迁移,什么时候只用全量就够了?

全量迁移适合离线、允许停机、数据量不大的情况。比如凌晨三点你停服两个小时,一次性把几百万条记录倒过去。但凡业务要求灰度切换、分钟级回滚、或者数据量上亿,就得走「全量 + 增量」的模式。全量把存量数据搬完,增量同步把切换期间的变更补上,最后在秒级内完成割接。

注意:我曾经遇到一个项目,全量迁移跑了 12 个小时,增量同步工具只支持单线程写入。源库每小时产生 50 万新记录,增量根本追不上。后来被迫改成批量写入加并行管道。做方案时一定要算好流量差值,源库写入速度 / 增量同步速度不能大于 1。

知识框架一览

下面这张图是我画的一个概念骨架。它会贯穿咱们整个课程,后面每讲都会往这个骨架里填细节。

数据迁移知识框架 数据迁移知识框架 数据迁移工程 评估与规划 执行与校验 切换与收尾 回滚与复盘 数据字典 全量迁移 增量同步 一致性校验 核心原则 可回滚 · 可校验 · 可灰度

从图里你能看到,我把数据迁移拆成四个关键阶段——评估与规划、执行与校验、切换与收尾、回滚与复盘。大部分教程只讲中间两步,但我认为规划和回滚才是决定成败的 60%。

举个例子,你花三天写迁移脚本,但没做源数据字典的字段级映射。上线前测试发现目标库表结构少了一个字段 —— 这种坑我栽过。

后面章节我会手把手带你拆每一步怎么做,包括怎么用 SDK 封装迁移能力、怎么设计回滚策略、怎么把校验逻辑固化到代码里。嗯,今天先到这里,内容不少,建议你自己动手画一遍这个框架,把每个阶段下你可能遇到的问题列出来。