如何从超5000万文档的全量备份中恢复误删的两个数据库集合?
恢复MongoDB中被删除的指定集合(全量备份场景)
首先,因为你已经关闭了journal archiving,没法通过oplog做增量回滚,所以只能从全量备份里提取需要的集合。下面是具体操作步骤,全程建议先在非生产环境测试一遍,避免影响线上数据:
步骤1:搭建临时MongoDB实例
为了不干扰生产库,先启动一个临时MongoDB服务专门用来恢复全量备份:
- 创建临时数据目录:
mkdir -p /tmp/mongo_temp_data - 启动临时实例(端口和生产库区分开,比如用27018):
mongod --port 27018 --dbpath /tmp/mongo_temp_data --bind_ip 127.0.0.1
步骤2:从全量备份恢复到临时实例
假设你的全量备份是mongodump生成的,备份目录为/path/to/full_backup,用mongorestore恢复到临时实例:
mongorestore --port 27018 /path/to/full_backup
如果备份是压缩格式(备份时用了--gzip),记得加上对应参数:
mongorestore --port 27018 --gzip /path/to/full_backup
步骤3:导出需要恢复的两个集合
用mongodump单独导出目标集合(相比mongoexport,能更好保留BSON数据类型,更可靠):
假设数据库名为your_db,被删集合是collection1和collection2:
mongodump --port 27018 --db your_db --collection collection1 --out /tmp/target_collections mongodump --port 27018 --db your_db --collection collection2 --out /tmp/target_collections
步骤4:将导出的集合导入生产数据库
现在把备份的集合导入生产库(默认端口27017):
mongorestore --port 27017 --db your_db /tmp/target_collections/your_db/collection1.bson mongorestore --port 27017 --db your_db /tmp/target_collections/your_db/collection2.bson
注意:如果生产库中已存在同名集合(比如误删后又重建),需要先删除该集合,或者在命令后加
--drop参数(会覆盖现有数据,务必谨慎操作)
步骤5:清理临时资源
完成恢复后,清理临时实例和文件:
- 关闭临时MongoDB服务:
mongo --port 27018 --eval "db.adminCommand({ shutdown: 1 })" - 删除临时目录:
rm -rf /tmp/mongo_temp_data /tmp/target_collections
额外提醒
- 恢复完成后,一定要验证数据完整性:比如查询集合计数、随机抽查几条关键数据。
- 后续建议开启journal archiving,同时定期做增量备份,下次遇到类似问题可以用oplog快速回滚,无需全量恢复。
内容的提问来源于stack exchange,提问作者thichxai
相关产品推荐
相关产品推荐

