在 Ubuntu 上迁移 MongoDB 数据的推荐流程
一 迁移方式选择
- 逻辑迁移:使用 mongodump/mongorestore 导出为 BSON(或归档流),适合大多数场景,跨版本、跨平台通用,操作简便。
- 物理迁移:直接拷贝数据文件或使用文件系统/块级快照,停机时间短、性能影响小,但对运维要求高,需严格一致性控制。
- 云上到自建/自建到云:可先逻辑导出再导入,或借助 DTS 做在线迁移与增量同步。
- 工具选择建议:小规模或可接受短暂停写用逻辑工具;大规模、低影响要求用快照/Cloud/Ops Manager;分片集群需按官方流程执行。
以上做法与注意点在官方手册与云厂商文档中均有明确说明与实践建议。
二 同一台 Ubuntu 主机内迁移
- 步骤
- 备份源库
- 全库:mongodump --out /var/backups/mongobackups/$(date +‘%F’)
- 单库:mongodump --db --out /var/backups/mongobackups/_$(date +‘%F’)
- 如需迁移到新库名,先确保目标库不存在或在恢复时改名(见下条命令示例)。
- 恢复到目标库(示例将备份恢复到新库 newdb2)
- 推荐:mongorestore --nsInclude=newdb2.* --drop /var/backups/mongobackups/<日期>/
- 兼容旧参数示例:mongorestore --db newdb2 --drop /var/backups/mongobackups/<日期>/
- 校验:mongosh --eval “db.<集合>.count()” 对比源/目标集合文档数。
- 说明
- 使用 –drop 可在恢复前清理目标集合,避免重复数据。
- 新版 mongorestore 对 –db/–collection 的使用有限制,跨库迁移优先用 –nsInclude。
- 建议在低峰期执行,避免对线上性能产生影响。
三 跨主机或跨网络迁移
- 场景 A 公网/内网直连源库
- 在源库所在 Ubuntu 上导出:mongodump --host <源主机> --port <端口> --username <用户> --password <密码> --out /backup/
- 将备份目录或归档文件拷贝到目标 Ubuntu。
- 在目标 Ubuntu 恢复:mongorestore --host <目标主机> --port <端口> --username <用户> --password <密码> /backup//
- 校验数据一致性与索引是否恢复。
- 场景 B 云数据库迁移到本地/自建
- 若云侧支持按库/按时间点备份,先下载备份或创建手动备份。
- 将备份恢复到自建 MongoDB(逻辑备份通常先恢复到自建,再按需迁移至云实例)。
- 若需在线迁移与最小化停机,使用 DTS 从云库迁移至自建或从自建迁移至云库。
- 说明
- 逻辑工具适合跨网络迁移;云到自建/自建到云的流程与限制以云厂商文档为准。
- 迁移后务必做集合计数、抽样查询与索引完整性检查。
四 进阶与注意事项
- 一致性保障
- 副本集:为保证一致性,使用 mongodump --oplog 捕获备份期间的写入,或在备份窗口内暂停写入。
- 分片集群:先停止负载均衡器、停止写入与模式变更,再按官方流程进行数据库转储/恢复,降低不一致风险。
- 性能影响与替代方案
- mongodump/mongorestore 会与运行中的 mongod 交互并产生读负载,可能影响业务;对大规模或低影响要求的场景,优先使用文件系统/块级快照或 MongoDB Atlas 云备份/Cloud Manager/Ops Manager。
- 自动化与保留策略
- 可用 cron 定期执行 mongodump,并清理过期备份,例如:
- 每日 03:03 备份:3 3 * * * mongodump --out /var/backups/mongobackups/$(date +‘%F’)
- 每日 03:01 清理 7 天前:1 3 * * * find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} ;
- 加密存储引擎提示
- 使用 AES256-GCM 的加密引擎做冷备份恢复时,MongoDB 4.2+ 需使用 –eseDatabaseKeyRollover 避免密钥重用风险。
以上要点均来自官方手册与最佳实践。