做数据库迁移这事儿,干过的都知道,表面上看起来就是搬数据,实际上每一步都可能踩坑。我见过太多项目,前期规划时信心满满,结果一上线就崩了——数据对不上、服务中断、业务投诉,全员加班到凌晨三点。说白了,数据库迁移不是技术活,而是细心活。今天我就把那些年见过的坑,结合 5 个关键步骤,一次性讲透。

第一步:盘点存量,别让数据“裸奔”
很多人做迁移,上来就写脚本,结果跑到一半发现某个表有几百 GB,或者某个字段全是乱码。正确的做法是,先搞清楚手里到底有多少数据。不是只看总大小,要细化到每个库、每张表、每个字段。比如,哪些表是核心业务表,哪些是日志表,哪些可以延迟迁移。我见过一个电商项目,把用户行为日志和订单表混在一起迁移,结果日志表占了 80% 的流量,订单表反而卡住了。更坑的是,有些表有自增 ID,迁移后如果没处理好主键冲突,新写入的数据会直接报错。所以,第一步必须做一次完整的“数据普查”,包括表结构、索引、存储过程、触发器,甚至那些“脏数据”——比如空字符串、特殊字符、超长字段。这些细节往往是迁移后出问题的根源。
第二步:选对工具,别迷信“万能方案”
市面上数据库迁移工具很多,但没有任何一个能解决所有问题。比如,MySQL 到 MySQL,用官方自带的 mysqldump 或 MySQL Workbench 就够用;但要是 Oracle 到 PostgreSQL,就得考虑 ora2pg、AWS DMS 这类专门工具。关键是,别听厂商吹得天花乱坠,要自己测试。我有个朋友为了省事,用了一个号称“一键迁移”的云工具,结果数据量一上去,工具直接超时,还丢了一部分记录。后来发现,那工具对大表只做全量拷贝,不做增量同步,业务一写数据就全乱了。所以,选工具前先弄清楚场景:是停机迁移还是在线迁移?是全量还是增量?源库和目标库版本是否兼容?最好先在测试环境跑一遍,用真实数据压测,别拿几条记录糊弄。
第三步:制定迁移策略,停机还是不停机?
这是最核心的决策,直接决定项目成败。停机迁移最简单:在业务低谷期停掉写操作,全量复制数据,验证完再切。但很多业务根本不允许停机超过几分钟,比如金融、电商、直播平台,停机一分钟可能损失几十万。这时就得考虑在线迁移——使用 CDC(变更数据捕获)工具,如 Debezium、Canal,实时同步源库的 binlog,然后逐步切换。在线迁移有个大坑:延迟。如果源库写入压力大,CDC 可能跟不上,导致目标库数据落后几秒钟。对某些业务来说,这几秒就可能导致订单重复或金额对不上。所以,策略上要留余地:先做全量迁移,再开启增量同步,然后设置灰度切流,让一部分流量先走新库,验证没问题再全量切换。千万别想着一步到位,那是在赌命。
很多团队迁移前只做“假跑”:导入几条记录,看结构对不对,就认为万事大吉。结果上线后才发现业务逻辑对不上。比如,有个系统用了存储过程,迁移后存储过程里的日期函数在新库里不兼容,直接报错。更隐蔽的是索引顺序变了,导致查询变慢,原来 1 秒出的结果,现在要 10 秒。所以,测试必须覆盖三个层面:第一,数据完整性——每张表记录数、校验和、关键字段分布是否一致;第二,性能——在目标库上跑一遍核心查询,对比响应时间;第三,业务逻辑——用真实的用户行为模拟,下单、支付、退款全流程跑一遍。我见过最崩溃的案例:迁移后所有数据都在,但用户登录时,密码加密算法因为库版本不同导致验证失败,导致全体用户无法登录。这种坑完全可以在测试阶段发现,只是没人去测。
数据库迁移最大的风险不是失败,而是失败后不知道怎么恢复。很多人觉得“反正有备份”,但备份恢复本身也是技术活:如果备份文件损坏、恢复时间过长、或者恢复后数据不一致,就彻底凉了。所以,迁移前必须制定回滚预案。最简单的做法是保留源库的完整副本,迁移期间禁止源库被清理;同时在目标库上做好全量备份和增量日志,万一出问题能快速切回源库。但回滚不是简单的“倒回去”,而是要考虑业务连续性。比如,迁移过程中业务已经写入了新数据,回滚时这些数据该怎么处理?是丢弃还是同步回源库?我见过一个团队回滚时只恢复了源库,结果新库上产生的几万条订单全丢了,被业务部门追了三个月。所以,回滚预案要写清楚:触发回滚的条件、回滚步骤、回滚后数据如何对齐,甚至准备一份“应急话术”,供客服和业务部门使用。
数据库迁移这事儿,没有完美的方案,只有最适合你的方案。关键不是追求零风险,而是把风险控制在可接受的范围内。比如,业务允许停机 2 小时,就别折腾在线迁移,省下的时间多跑几轮测试;数据量只有几十 GB,就别上复杂的 CDC 工具,用简单脚本反而更稳。另外,别忘了和业务部门提前沟通:什么时候切、切多久、万一出问题怎么办,别等投诉了再解释。我见过最成功的迁移项目,团队花了 80% 的时间在测试和预案上,真正迁移只用了 10 分钟。老板后来说了一句话:“不折腾,就是最快的迁移。”所以,下次做数据库迁移,别急着敲键盘,先把这 5 步走踏实了。踩坑少一点,下班早一点。


