我见过太多人在 MongoDB 迁移上栽跟头。去年有个朋友,信誓旦旦地说他们团队花了两周时间规划迁移,结果上线当天直接翻车——数据丢了,三个小时才找回来,老板差点让他卷铺盖走人。说白了,MongoDB 迁移这事儿,看着文档挺全,真上手处处是坑。今天我把这五个最常见的坑扒出来,从规划到落地,你照着避就行。

第一个坑:上来就选工具,而不考虑数据一致性。很多人一听说要迁移,第一反应是“用 mongodump 还是 mongorestore?”兄弟,工具只是手段,核心问题是你的数据能不能对得上。我见过最离谱的案例:有人用 mongodump 导出了一份数据,然后在目标库用 mongorestore 恢复,结果因为源库还在写入,导出的数据根本不是同一时间点的快照。这就像拍全家福,你妈还在化妆你就按了快门,回头一看照片里少个人。正确的做法是,迁移前先评估业务对数据一致性的容忍度。如果是日志类数据,丢几条无所谓,那直接跑工具就行;但如果是订单、用户信息这类核心数据,必须用复制集的方式做增量同步,确保源库和目标库在某个时间点完全一致。我建议你第一步不是选工具,而是画个迁移拓扑图,把数据流向、延迟容忍度、回滚方案都标清楚。
第二个坑:不评估索引就开干,迁移完发现查询慢如蜗牛。有个做电商的朋友,把 MongoDB 从 3.6 迁移到 5.0,数据迁移完一切正常,结果第二天用户投诉说商品搜索页面打开要 10 秒。查询后才发现,老库里的索引在迁移过程中没有被正确重建,或者新版本的索引结构变了。MongoDB 各版本的索引策略差异很大,比如 4.2 之后默认使用 WiredTiger 存储引擎,索引压缩率更高,但如果直接迁移数据不带索引定义,重建时容易踩坑。更糟的是,有些人在迁移前清理了一堆“无用索引”,结果上线后才发现某个查询全靠那个索引撑着。我的建议是,迁移前先导出一份索引清单,逐个确认每个索引的业务用途。迁移后第一时间在测试环境跑慢查询日志,对比迁移前后的性能,别等用户骂上门才想起来查索引。
第三个坑:忽略文档模型差异,迁移后数据查不出来。MongoDB 的文档模型很灵活,但不同版本对字段类型、数组嵌套的支持有细微差异。我见过一个案例:有人把 MongoDB 4.0 的数据迁移到 6.0,结果原本能正常查询的嵌套文档在新版本里报错“字段路径不合法”。原因很简单——6.0 对点号(.)和美元符号($)的字段名做了更严格的限制,老数据里恰好有个字段名叫 “price.old”,在老版本没问题,新版本直接报错。另一个常见问题是时间字段的存储格式。有人习惯用字符串存时间,老版本能正常排序,但新版本按字符串排序,日期顺序全乱了。迁移前务必跑一遍数据验证脚本,检查字段名是否包含特殊字符、时间字段是否统一、数组嵌套层级是否超过新版本限制。这些细节看似不起眼,真出事就要排查好几天。
第四个坑:网络带宽和延迟没算清楚,迁移时间翻倍。很多人觉得“只要数据能传过去就行”,结果一跑才发现,几十 TB 的数据通过公网传输,带宽只有 100 Mbps,算下来要几天。更麻烦的是,如果用 Oplog 做增量同步,网络延迟稍高,Oplog 堆积就会导致同步跟不上。我见过最夸张的例子:有人从阿里云迁移到腾讯云,两个机房之间延迟 20 ms,结果增量同步延迟从几分钟慢慢涨到几小时,Oplog 被清理,只能全量重来。正确做法是,迁移前先做网络压测,算清楚在现有带宽下需要多久。如果超过业务允许的停机窗口,就考虑物理快递硬盘或专线。另外,务必为迁移过程实现断点续传,别因为一次网络抖动前功尽弃。还有一点:迁移时最好在业务低峰期操作,但别只盯着国内时间,如果服务的是全球用户,低峰期可能只有凌晨两三点。
第五个坑:没有回滚方案,出事只能硬扛。这是最要命的坑。我见过太多团队,迁移方案写了一大堆,但回滚方案只留了一句“如果失败,恢复备份”。兄弟,恢复备份不是不行,但你要想清楚:如果迁移过程中源库还在写入,恢复备份意味着丢失迁移期间产生的新数据。更麻烦的是,迁移后新库跑了一周才发现问题,这时想回滚,你拿什么回滚?正确的做法是,迁移前就设计好灰度切换策略。比如先把 10% 的读流量切到新库,观察几天没问题再切写流量;或者采用双写模式,新库老库同时写入,等数据一致后再切流量。回滚方案不是“失败了怎么办”,而是“怎么在不停服的情况下把流量切回来”。我建议至少准备两套回滚方案:一套是快照回滚,适合短时间故障;另一套是反向同步,使用 CDC 工具把新库的增量实时同步回老库,这样即使切回老库,数据也不丢。
写到这里,我想说一句:MongoDB 迁移看起来是技术活,本质上是项目管理活。你花 80% 的时间做规划、验证、预案,20% 的时间执行,反而最安全。别想着“先跑起来再说”,等跑起来了,数据丢了、服务挂了,老板的刀就架在脖子上了。这五个坑,你避一个,就少一分风险。下次有人跟你吹他 MongoDB 迁移多顺利,你可以问他一句:回滚方案写了几页?


