MongoDB 数据库的备份与恢复

发布于:2025-07-05 ⋅ 阅读:(15) ⋅ 点赞:(0)

以下是 MongoDB 中使用 mongodumpmongorestore 进行数据库逻辑备份与恢复的完整指南:


一、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. 增量备份
  • 官方无原生支持,但可通过以下方式模拟:
    1. 首次全量备份。
    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 文件系统工具 (cprsync)、云快照

七、备份验证流程

  1. 校验元数据
    ls /backup/mongo/  # 确认数据库目录结构完整
  2. 抽样检查数据
    bsondump /backup/mongo/test/orders.bson | jq -c '.[0]'  # 查看首条记录
  3. 恢复后验证
    use test
    db.orders.count({})     // 统计文档数
    db.orders.validate()    // 验证集合完整性

总结

  • 常规备份:使用 mongodump --gzip --oplog 确保效率和一致性。
  • 大型集群:优先采用物理备份或分片逐节点逻辑备份。
  • 恢复优化:通过 --noIndexRestore 分离数据与索引重建。
  • 关键原则:定期验证备份文件,制定恢复演练计划。

网站公告

今日签到

点亮在社区的每一天
去签到