跨服务器备份恢复MongoDB集合:是否覆盖已有数据?
MongoDB 6备份恢复:覆盖 vs 合并现有数据
默认恢复行为(无特殊参数)
如果目标服务器上已存在xyz数据库和abc集合:
- 备份文档中**
_id不重复**的记录会被插入到目标集合中 - 备份文档中**
_id与现有记录重复**的记录会触发插入错误(不会覆盖现有记录) - 目标集合的原有索引会被替换为备份文件中的索引
主动触发完全覆盖(使用--drop参数)
如果执行恢复命令时添加--drop选项:
mongorestore --db xyz --collection abc /path/to/backup/files --drop
- 会先删除目标服务器上的
abc集合(包括所有文档、索引) - 再基于备份文件完全重建该集合
- 这种场景下,目标集合的原有数据会被彻底覆盖
实现数据合并的注意事项
如果想要保留现有数据并合并备份数据:
- 必须确保备份文档的
_id与目标集合现有文档无重复(避免插入报错) - 不要使用
--drop参数 - 若需保留目标集合的原有索引,需添加
--noIndexRestore参数(否则备份中的索引会替换原有索引),示例命令:
mongorestore --db xyz --collection abc /path/to/backup/files --noIndexRestore
- 若备份中存在
_id重复的文档,要么提前清理备份内的重复项,要么通过--writeConcern {w:0}忽略错误(不推荐,易引发数据不一致)
核心结论
- 默认恢复:不删除现有数据,仅插入新文档(
_id重复会报错),但会替换索引 - 加
--drop恢复:完全删除原有集合后重建,彻底覆盖所有数据 - 合并数据:需保证
_id无冲突,配合--noIndexRestore可保留原有索引
内容的提问来源于stack exchange,提问作者Vijay Muddu
相关产品推荐
相关产品推荐

