搜「MongoDB 迁移」的人,十个有九个其实是同一个问题:「这么多工具,我到底该用哪一个?」
官方文档给你列了一堆名字,第三方教程各说各话,但没有一篇把「在什么场景、选哪个工具、要付出什么代价」讲成一张能直接抄的表。
这篇不铺概念,直接给你答案。先把结论甩在前面,后面再逐个展开。
一、结论前置:5 种方案一张表看清
| 实时迁移(Atlas live migration) | 自建 Mongo → Atlas | 分钟级 | 近实时 | 低(Atlas 托管) | 目标是 Atlas、要不停机 |
| mongosync | Mongo → Mongo 集群间 | 分钟级 | 近实时 | 中 | 集群间一次性/持续搬迁 |
| mongodump + mongorestore | 任意 Mongo 备份恢复 | 小时级 | 否(快照) | 低 | 能接受停机、要简单可控 |
| Relational Migrator | 关系型 → MongoDB | 小时级 | 否(快照) | 中 | SQL 迁 Mongo,要智能建模 |
| 异构 CDC(如金仓 KFS) | Mongo → 国产/关系型库 | 秒~分钟级 | 实时 | 中(商用) | 目标端非 Mongo、要长期实时 |
选型第一问永远不是「哪个工具好」,而是「我的源端和目标端分别是什么」。
二、MongoDB 迁移有哪些方式?
按官方口径,MongoDB 迁移就两大类:
实时迁移的前提是源集群必须在线——它没法迁一个已经停机的库。这是很多二手教程漏掉的技术边界。
三、实时迁移是什么?pull 和 push 有什么区别?
- pull(拉取):Atlas 主动从源集群抽数据,适合源库能被外部访问的场景。
- push(推送):源侧(Cloud Manager 监控集群)主动向 Atlas 推数据,适合源库在内网、只能出不能进的场景。
怎么选:看源库网络是「能进」还是「只能出」。 内网机房有防火墙的,push 更顺;公网/云上的源,pull 更省事。
四、mongosync 和 mongorestore 有什么区别?什么时候用?
- mongosync:官方集群同步工具,做全量 + 增量,能追到源端位点再切,适合 Mongo → Mongo 的集群搬迁。
- mongodump/mongorestore:本质是备份 + 恢复,快照式,有明显停机窗口,数据量大时耗时。
| 定位 | 集群间迁移/同步 | 备份恢复式迁移 |
| 是否追增量 | 是(按位点) | 否(需二次补) |
| 断点续传 | 有 | 基本没有,断了重来 |
| 停机窗口 | 分钟级 | 小时级 |
五、从关系型数据库迁移到 MongoDB 用什么工具?
用官方 Relational Migrator。它专做 SQL → MongoDB 的迁移,核心价值是智能建模——把关系表、JOIN、约束翻译成文档模型和嵌入式数组,还能用生成式 AI 辅助转换。
几个关键行为要知道:
- 目前只支持快照迁移作业(一次性,不是持续同步);
- 作业默认不幂等,重复跑会插入重复数据;要防重得开启幂等模式;
- 它只在 MongoDB 侧建索引,不改源库,源库连接是只读的;
- 支持部分表迁移,可以先用小样本验证再全量。
六、迁移到国产库/关系型库用什么?(异构 CDC)
目标端不是 Mongo 生态(国产库、Oracle、数仓)时,用异构 CDC 工具。它挂在源库上解析 oplog,把变化实时翻译成目标端语句。我在信创项目里接触较多的是金仓 KFS:秒级延迟、按位点断点续传、内置在线数据比对。这类工具的代价是部署管理端 + 付费,适合「要长期实时同步、又不想养一套同步代码」的场景。
七、选型决策树:三步定位你的工具
第一步:目标端是谁?
├─ MongoDB / Atlas ──→ 第二步
└─ 国产库/关系型/数仓 ──→ 异构 CDC(如金仓 KFS)
第二步:目标是不是 Atlas?
├─ 是 Atlas ──→ 第三步
└─ 不是 Atlas(自建/其他云)──→ mongosync 或 mongorestore
第三步:能不能接受停机?
├─ 不能,要不停机 ──→ 实时迁移(pull/push 按网络方向选)
└─ 能接受停机窗口 ──→ mongodump + mongorestore
(SQL 迁 Mongo 是特殊分支,单独走 Relational Migrator,不与上面互斥。)
八、各方案停机窗口估算
| 实时迁移 | 分钟级 | 增量追平速度、切换动作 |
| mongosync | 分钟级 | 切换时停写 + 位点确认 |
| mongorestore | 小时级 | 数据量、带宽、索引重建 |
| Relational Migrator | 小时级 | 源表量、建模复杂度 |
| 异构 CDC | 秒~分钟级 | 延迟追平、切流设计 |
停机窗口不是工具决定的,是「数据量 ÷ 带宽」+「增量追平时间」决定的。工具只是把窗口的下限压到不同档位。
九、FAQ:高频长尾问题速答
Q1:MongoDB 迁移到 Atlas 需要满足哪些前置条件?
A:源集群版本在支持矩阵内、源集群保持在线(实时迁移)、网络可达(pull 需 Atlas 能访问源,push 需源能出网)、有足够带宽完成全量搬运。
Q2:迁移后 MongoDB 会自动创建索引吗?
A:Relational Migrator 会在 MongoDB 集合上建索引;但 mongorestore 只恢复 dump 里已有的索引。迁移前先核对源库索引清单,别漏。
Q3:可以只迁移关系数据库中的部分表吗?
A:可以。Relational Migrator 创建作业时可按表选取范围,先用小样本验证再分批推进。
Q4:迁移作业默认是幂等的吗?
A:不是。Relational Migrator 默认重复执行会再插一遍数据,需要防重就开启幂等模式(代价是大型作业有性能开销)。
Q5:怎样查看或停止正在运行的迁移作业?
A:Relational Migrator 的数据迁移页签里能创建、预检、监控和停止作业;实时迁移在 Atlas 界面看进度。
十、速查表:照着对号入座
| 自建 Mongo 迁 Atlas,不停机 | 实时迁移 |
| Mongo 集群 A 迁到集群 B | mongosync |
| 能停机,要简单可控 | mongodump + mongorestore |
| MySQL/Oracle 迁 MongoDB | Relational Migrator |
| Mongo 迁国产库/关系型,长期同步 | 异构 CDC(金仓 KFS) |
记住一句话:MongoDB 迁移选型,先看目标端是谁,再看能不能停机,工具自然就浮出来了。
我是DBA小马哥,十年一线数据库运维。写的东西都是生产环境里趟出来的,关注我,少踩坑。

