以下是 MongoDB 中使用 mongodump
和 mongorestore
进行数据库逻辑备份与恢复的完整指南:
一、mongodump
备份工具
1. 核心功能
- 逻辑备份:将 MongoDB 中的数据以 BSON/JSON 格式导出到本地文件。
- 灵活性:支持按数据库、集合、条件过滤备份。
- 低影响:默认在后台运行,对线上服务影响较小。
2. 常用命令及参数
mongodump \
--host <hostname:port> \ # 目标实例地址(默认 localhost:27017)
--db <database> \ # 指定备份的数据库(默认备份所有)
--collection <collection> \ # 指定备份的集合
--query <JSON> \ # 按查询条件过滤文档(需指定集合)
--out <path> \ # 备份文件输出目录(默认 ./dump)
--gzip \ # 启用压缩(减少备份体积)
--oplog \ # 记录备份期间的 oplog(确保时间点恢复)
--readPreference=secondary \ # 从副本集从节点备份
--username <user> \ # 认证用户
--password <password> \ # 认证密码
--authenticationDatabase=admin # 认证数据库
示例
# 备份整个实例到 gzip 压缩文件(跳过 local 数据库)
mongodump --host 127.0.0.1:27017 --gzip --out /backup/mongo/
# 仅备份 test 数据库的 orders 集合,且 amount > 100 的文档
mongodump --db test --collection orders --query '{"amount": {"$gt": 100}}' --out /backup/
二、mongorestore
恢复工具
1. 核心功能
- 将
mongodump
生成的备份文件还原到 MongoDB。 - 支持选择性恢复(数据库/集合/文档)。
2. 常用命令及参数
mongorestore \
--host <hostname:port> \ # 目标实例地址
--db <database> \ # 还原到指定数据库(默认按备份名)
--collection <collection> \ # 指定恢复的集合
--gzip \ # 解压 gzip 备份文件
--drop \ # 恢复前删除已存在的集合
--noIndexRestore \ # 跳过索引恢复(仅恢复数据)
--oplogReplay \ # 重放 oplog(需与 --oplog 备份配合)
--username <user> \ # 认证用户
--password <password> \ # 认证密码
--authenticationDatabase=admin
示例
# 恢复整个备份文件到新实例
mongorestore --host 10.0.0.2:27017 --gzip /backup/mongo/
# 仅恢复 test.orders 集合,且删除已存在的同名集合
mongorestore --db test --collection orders --drop /backup/mongo/test/orders.bson.gz
三、关键场景操作指南
场景 1:全量备份与恢复
# 全量备份(压缩)
mongodump --host 127.0.0.1 --gzip --out /backup/full/
# 全量恢复
mongorestore --host 127.0.0.1 --gzip /backup/full/
场景 2:备份时记录 oplog(确保时间点一致性)
# 备份(包含 oplog)
mongodump --host rs0/127.0.0.1:27017 --oplog --gzip --out /backup/oplog_backup/
# 恢复时重放 oplog
mongorestore --host 127.0.0.1 --oplogReplay --gzip /backup/oplog_backup/
场景 3:跳过索引以加速恢复
# 备份时不记录索引(提升速度,节省空间)
mongodump --db test --noIndexes --out /backup/no_index/
# 恢复数据后手动创建索引
mongorestore --db test --noIndexRestore /backup/no_index/
mongo test --eval "db.orders.createIndex({order_id: 1})"
四、备份策略优化
1. 分片集群备份
方案 1:逐个分片备份
# 备份 config server(元数据) mongodump --host configsvr:27019 --out /backup/config/ # 备份每个分片主节点 mongodump --host shard1:27018 --out /backup/shard1/ mongodump --host shard2:27018 --out /backup/shard2/
方案 2:使用
mongos
直接备份(需过滤 system 集合)mongodump --host mongos:27017 --out /backup/mongos/
2. 增量备份
- 官方无原生支持,但可通过以下方式模拟:
- 首次全量备份。
- 定期备份 oplog(需副本集):
mongodump --db local --collection oplog.rs --query '{"ts": {"$gte": Timestamp(...)}}'
五、常见问题处理
问题 1:备份时锁表导致服务阻塞
- 方案:添加
--forceTableScan
跳过锁检查(仅适用于 WiredTiger 引擎)mongodump --forceTableScan --out /backup/
问题 2:备份文件损坏
- 验证备份完整性:
# 检查 BSON 文件元数据 bsondump --objcheck /backup/test/orders.bson
问题 3:版本不兼容
- 规则:
mongodump/mongorestore
大版本需与 MongoDB 实例一致。
六、物理备份对比
对比项 | 逻辑备份 (mongodump ) |
物理备份(文件快照) |
---|---|---|
备份类型 | 集合/文档级 | 整个数据目录(包括索引、oplog) |
速度 | 慢(遍历数据逻辑层) | 快(直接复制文件) |
恢复粒度 | 灵活(可恢复部分数据) | 全量恢复 |
适用场景 | 小规模数据迁移/选择性恢复 | 大型数据库/灾难恢复 |
工具 | mongodump /mongorestore |
文件系统工具 (cp , rsync )、云快照 |
七、备份验证流程
- 校验元数据:
ls /backup/mongo/ # 确认数据库目录结构完整
- 抽样检查数据:
bsondump /backup/mongo/test/orders.bson | jq -c '.[0]' # 查看首条记录
- 恢复后验证:
use test db.orders.count({}) // 统计文档数 db.orders.validate() // 验证集合完整性
总结
- 常规备份:使用
mongodump --gzip --oplog
确保效率和一致性。 - 大型集群:优先采用物理备份或分片逐节点逻辑备份。
- 恢复优化:通过
--noIndexRestore
分离数据与索引重建。 - 关键原则:定期验证备份文件,制定恢复演练计划。