Skip to content

MongoDB 单集合恢复

单集合恢复方法

使用 mongorestore 恢复

基本语法

bash
mongorestore --db <数据库名> --collection <集合名> <备份文件路>

详细步骤

  1. 准备备份文件:确保有包含目标集合的备份文件,格式可以是 BSON 或 JSON。

  2. 停止应用程序写入:在恢复前,建议停止对目标集合的写入操作,以避免数据冲突。

  3. 执行恢复命令

    bash
    # 从 BSON 文件恢复
    mongorestore --db mydb --collection mycollection /path/to/backup/mydb/mycollection.bson
    
    # 从 JSON 文件恢复
    mongoimport --db mydb --collection mycollection --file /path/to/backup/mydb/mycollection.json
  4. 验证恢复结果

    bash
    mongo mydb --eval "db.mycollection.count()"

使用文件系统快照恢复

适用场景

  • 使用 LVM 或 ZFS 等支持快照的文件系统
  • 备份是通过文件系统快照创建的

详细步骤

  1. 创建目标目录

    bash
    mkdir -p /tmp/mongodb-snapshot
  2. 挂载快照

    bash
    mount -o ro /dev/snapshot-device /tmp/mongodb-snapshot
  3. 复制集合文件

    bash
    cp /tmp/mongodb-snapshot/data/db/mydb.mycollection.* /var/lib/mongodb/mydb/
  4. 重启 MongoDB

    bash
    systemctl restart mongod
  5. 验证恢复结果

    bash
    mongo mydb --eval "db.mycollection.count()"

使用第三方工具恢复

Percona Backup for MongoDB

bash
# 安装 Percona Backup for MongoDB
pbm install

# 查看可用备份
pbm list

# 恢复特定集合
pbm restore --db mydb --collection mycollection <backup-name>

MongoDB Atlas 备份

  1. 登录 MongoDB Atlas 控制台
  2. 导航到 "Backups" 页面
  3. 选择要恢复的备份
  4. 选择 "Restore to Cluster"
  5. 在 "Collections" 选项卡中选择要恢复的集合
  6. 点击 "Restore" 开始恢复

单集合恢复最佳实践

备份策略

  • 定期备份:制定合理的备份计划,包括全量备份和增量备份
  • 备份验证:定期验证备份的完整性和可恢复性
  • 多副本存储:将备份存储在多个位置,包括本地和云端
  • 加密备份:对备份数据进行加密,确保数据安全

恢复前准备

  • 评估恢复影响:评估恢复操作对现有数据的影响
  • 备份当前数据:在恢复前,备份当前的集合数据,以防止恢复失败
  • 停止应用写入:停止对目标集合的写入操作,避免数据冲突
  • 准备恢复环境:确保恢复环境的 MongoDB 版本与备份兼容

恢复后验证

  • 数据完整性:验证恢复后的数据完整性,包括文档数量、字段完整性等
  • 索引完整性:验证恢复后索引是否完整
  • 应用兼容性:验证应用程序是否能正常访问恢复的数据
  • 性能测试:测试恢复后集合的查询性能

常见问题(FAQ)

Q1: 单集合恢复会影响其他集合吗?

A1: 单集合恢复只影响目标集合,不会影响其他集合。但需要注意,如果恢复过程中数据库处于写入状态,可能会导致数据冲突。

Q2: 如何恢复到特定时间点的单集合?

A2: 可以使用 MongoDB 的时间点恢复功能:

  • 使用 mongorestore 的 --oplogReplay 参数
  • 使用 Percona Backup for MongoDB 的时间点恢复功能
  • 使用 MongoDB Atlas 的时间点恢复功能

Q3: 单集合恢复需要停机吗?

A3: 对于副本集,可以在次要节点上进行恢复,然后进行切换,无需停机。对于单节点部署,建议在维护窗口进行恢复,以减少对业务的影响。

Q4: 如何处理恢复过程中的数据冲突?

A4: 可以通过以下方式处理数据冲突:

  • 在恢复前停止应用写入
  • 使用 --drop 参数先删除现有集合,再恢复
  • 使用 --upsert 参数进行更新插入

Q5: 如何恢复大型集合?

A5: 恢复大型集合时,可以:

  • 使用 --numInsertionWorkersPerCollection 参数增加并行插入线程
  • 分批恢复数据
  • 在非高峰时段进行恢复

Q6: 单集合恢复支持跨版本吗?

A6: MongoDB 支持向下兼容的恢复,即可以从旧版本恢复到新版本,但不支持从新版本恢复到旧版本。建议恢复前检查版本兼容性。

Q7: 如何监控单集合恢复进度?

A7: 可以使用以下方法监控恢复进度:

  • 使用 mongorestore --verbose 查看详细日志
  • 监控 MongoDB 进程的 CPU 和内存使用情况
  • 在另一个终端窗口查询集合的文档数量

Q8: 如何优化单集合恢复性能?

A8: 优化单集合恢复性能的方法:

  • 使用 SSD 存储
  • 增加 --numInsertionWorkersPerCollection 参数值
  • 关闭目标集合的索引,恢复后重新创建
  • 使用 --noIndexRestore 参数,恢复后手动创建索引