MongoDB 备份(mongodump)与恢复(mongorestore)全面指南
mongodump 和 mongorestore 是 MongoDB 官方提供的 逻辑备份/恢复工具,适用于 迁移、备份、灾备、版本升级、数据抽取 等场景。
一、核心概念对比
| 工具 | 类型 | 格式 | 适用场景 |
|---|---|---|---|
mongodump | 逻辑备份 | BSON / JSON | 迁移、部分恢复、开发测试 |
mongorestore | 逻辑恢复 | BSON | 恢复 mongodump 产生的备份 |
| 文件系统快照 | 物理备份 | 二进制 | 生产级大集群、近零 RTO |
mongoexport / mongoimport | 文本导出 | JSON / CSV | 数据分析、跨系统迁移 |
生产环境推荐:
mongodump+ 文件系统快照 双保险
二、mongodump 基本语法
mongodump [options]
常用选项
| 选项 | 说明 |
|---|---|
--host / -h | 主机(含副本集/分片) |
--port | 端口 |
--uri | 连接字符串(推荐) |
--db / -d | 备份指定数据库 |
--collection / -c | 备份指定集合 |
--out / -o | 输出目录(默认 dump/) |
--gzip | 压缩每个文件(强烈推荐) |
--archive | 输出为 单个归档文件(支持流式传输) |
--query / -q | 按条件导出(配合 --collection) |
--excludeCollection | 排除集合 |
--numParallelCollections | 并行导出集合数(默认 4) |
三、常见备份场景与命令
1. 备份整个实例(所有数据库)
mongodump \
--uri="mongodb://host1:27017,host2:27018/?replicaSet=rs0" \
--gzip \
--archive=/backup/full_$(date +%Y%m%d_%H%M%S).archive
输出:单个
.archive文件,可直接管道传输到 S3 / NAS
2. 备份单个数据库
mongodump \
--uri="mongodb://localhost:27017" \
--db=mydb \
--gzip \
--out=/backup/mydb_$(date +%Y%m%d)
输出结构:
/backup/mydb_20251109/ ├── users/ │ ├── collection.bson.gz │ └── metadata.json └── orders/
3. 备份单个集合 + 条件过滤
mongodump \
--uri="mongodb://localhost:27017" \
--db=logs \
--collection=access \
--query='{"date": {"$gte": {"$date": "2025-11-01T00:00:00Z"}}}' \
--gzip \
--out=/backup/logs
4. 从分片集群备份(通过 mongos)
mongodump \
--uri="mongodb://mongos1:27017,mongos2:27017/?readPreference=secondaryPreferred" \
--db=analytics \
--gzip \
--archive \
| aws s3 cp - s3://my-bucket/backup/analytics.archive
注意:
mongodump通过mongos备份分片数据,会自动并行从各 shard 拉取
5. 仅备份结构(无数据)
mongodump --db=mydb --out=/backup/schema --archive --noData
四、mongorestore 恢复语法
mongorestore [options]
常用选项
| 选项 | 说明 |
|---|---|
--uri | 目标连接 |
--archive | 恢复 .archive 文件 |
--gzip | 自动解压 .gz |
--db | 恢复到指定数据库(可重命名) |
--collection | 恢复到指定集合 |
--drop | 恢复前删除目标集合 |
--numInsertionWorkers | 并行插入线程(默认 1) |
--objCheck | 验证 BSON 有效性 |
--dryRun | 预演,不实际写入 |
五、恢复实战案例
1. 恢复整个归档文件到新集群
mongorestore \
--uri="mongodb://new-host:27017" \
--archive=/backup/full_20251109_120000.archive \
--gzip \
--drop \
--numInsertionWorkers=8
2. 恢复单个数据库到不同名称
mongorestore \
--uri="mongodb://localhost:27017" \
--nsInclude="mydb.*" \
--nsFrom="mydb.*" \
--nsTo="mydb_prod.*" \
--drop \
/backup/mydb_20251109/
将
mydb恢复为mydb_prod
3. 仅恢复集合结构(索引)
mongorestore \
--uri="mongodb://localhost:27017" \
--db=mydb \
--noData \
/backup/mydb_20251109/
4. 流式恢复(从 S3 直接恢复)
aws s3 cp s3://my-bucket/backup/full.archive - \
| mongorestore --archive --gzip --drop
六、生产级备份策略
| 频率 | 方式 | 存储 | 保留 |
|---|---|---|---|
| 每日全量 | mongodump --archive --gzip | S3 / NAS | 7 天 |
| 每小时增量 | 文件系统快照(LVM/XFS) | 本地磁盘 | 24 小时 |
| 关键库实时 | mongodump --oplog(点-in-time) | 异地备份 | 30 天 |
七、点-in-time 恢复(PITR)
需要 oplog 备份,实现任意时间点恢复
# 1. 备份全量 + oplog
mongodump \
--host=rs0/localhost:27017 \
--archive \
--gzip \
--oplog \
> /backup/pitr_$(date +%Y%m%d_%H%M%S).archive
# 2. 恢复到指定时间点
mongorestore \
--archive=/backup/pitr_20251109_030000.archive \
--gzip \
--oplogReplay \
--oplogLimit="2025-11-09T04:30:00Z"
--oplogLimit指定恢复截止时间
八、性能优化建议
| 场景 | 建议 |
|---|---|
| 大集合(>100GB) | 使用 --numParallelCollections=8 + --gzip |
| 高并发写入 | 备份时加 --readPreference=secondary |
| 分片集群 | 通过 mongos 备份,避免单点压力 |
| 磁盘 IO 瓶颈 | 备份到 /tmp 再 rsync 到 NAS |
九、自动化备份脚本(Bash + Cron)
#!/bin/bash
# backup.sh
URI="mongodb://user:pass@host:27017/?replicaSet=rs0&authSource=admin"
BACKUP_DIR="/backup/mongodb"
DATE=$(date +%Y%m%d_%H%M%S)
S3_BUCKET="s3://my-mongo-backup"
# 创建目录
mkdir -p $BACKUP_DIR
# 全量备份 + oplog
mongodump \
--uri="$URI" \
--archive="$BACKUP_DIR/full_$DATE.archive" \
--gzip \
--oplog \
--quiet
# 上传 S3
aws s3 cp "$BACKUP_DIR/full_$DATE.archive" "$S3_BUCKET/"
# 清理 7 天前备份
find $BACKUP_DIR -name "*.archive" -mtime +7 -delete
# crontab -e
0 3 * * * /path/to/backup.sh >> /var/log/mongo_backup.log 2>&1
十、常见问题排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
connection refused | 连接字符串错误 | 检查 --uri、防火墙 |
not authorized | 无权限 | 添加 ?authSource=admin |
BSON too large | 单文档 > 16MB | 拆分文档 |
archive read error | 文件损坏 | 重新备份 |
| 恢复后索引丢失 | 使用 --noIndexRestore | 移除该选项 |
十一、补充工具对比
| 工具 | 优势 | 劣势 |
|---|---|---|
mongodump | 灵活、支持条件导出 | 逻辑备份,慢 |
| Percona Backup for MongoDB | 支持物理备份、增量 | 需额外部署 |
| MongoDB Ops Manager / Atlas | 自动化、PITR、云存储 | 付费 |
| 文件系统快照 | 秒级 RTO | 需停写或一致性快照 |
十二、学习资源
- 官方文档:mongodump
- 官方文档:mongorestore
- Atlas 备份:Cloud Backups
- Percona 备份:PBM
你想实现什么?
- 每日自动备份到 S3?
- 跨集群数据迁移?
- 生产环境 PITR 方案?
- 备份性能优化?
欢迎提供:
- 集群类型(单节点/副本集/分片)
- 数据量(GB/TB)
- 备份窗口(夜间?实时?)
- 存储目标(本地/S3/NAS)
我可以为你定制 完整备份策略 + 自动化脚本 + 灾备演练!