MongoDB备份与恢复 #

一、备份概述 #

1.1 备份类型 #

类型 说明
全量备份 备份所有数据
增量备份 备份变化的数据
日志备份 备份操作日志

1.2 备份方法 #

方法 说明
mongodump 逻辑备份工具
文件系统快照 物理备份
复制集备份 从节点备份
MongoDB Atlas 云备份

二、mongodump备份 #

2.1 基本备份 #

bash
# 备份所有数据库
mongodump --out /backup/$(date +%Y%m%d)

# 备份指定数据库
mongodump --db mydb --out /backup/$(date +%Y%m%d)

# 备份指定集合
mongodump --db mydb --collection users --out /backup/$(date +%Y%m%d)

2.2 认证备份 #

bash
# 使用用户名密码
mongodump -u admin -p password123 --authenticationDatabase admin --out /backup

# 使用连接字符串
mongodump --uri "mongodb://admin:password@localhost:27017/mydb?authSource=admin" --out /backup

2.3 压缩备份 #

bash
# 压缩备份
mongodump --archive=/backup/mydb.gz --gzip

# 备份指定数据库并压缩
mongodump --db mydb --archive=/backup/mydb.gz --gzip

2.4 复制集备份 #

bash
# 从从节点备份
mongodump --host rs0/secondary1:27017,secondary2:27017 --out /backup

# 指定读偏好
mongodump --readPreference secondary --out /backup

2.5 备份选项 #

bash
# 常用选项
mongodump \
    --host localhost \
    --port 27017 \
    --db mydb \
    --collection users \
    --query '{"status": "active"}' \
    --out /backup \
    --gzip \
    --oplog \
    --numParallelCollections 4

选项说明:

选项 说明
–host 主机地址
–port 端口号
–db 数据库名
–collection 集合名
–query 查询条件
–out 输出目录
–gzip 压缩
–oplog 包含oplog
–numParallelCollections 并行集合数

三、mongorestore恢复 #

3.1 基本恢复 #

bash
# 恢复所有数据库
mongorestore /backup/20240101

# 恢复指定数据库
mongorestore --db mydb /backup/20240101/mydb

# 恢复指定集合
mongorestore --db mydb --collection users /backup/20240101/mydb/users.bson

3.2 从压缩文件恢复 #

bash
# 从压缩文件恢复
mongorestore --archive=/backup/mydb.gz --gzip

# 恢复指定数据库
mongorestore --db mydb --archive=/backup/mydb.gz --gzip

3.3 恢复选项 #

bash
# 常用选项
mongorestore \
    --host localhost \
    --port 27017 \
    --db mydb \
    --drop \
    --gzip \
    --stopOnError \
    /backup/mydb

选项说明:

选项 说明
–drop 恢复前删除集合
–gzip 解压缩
–stopOnError 遇到错误停止
–noIndexRestore 不恢复索引
–maintainInsertionOrder 保持插入顺序

3.4 时间点恢复 #

bash
# 使用oplog恢复到指定时间点
mongorestore --oplogReplay --oplogLimit "1234567890:1" /backup

四、文件系统快照 #

4.1 快照备份 #

bash
# 1. 锁定数据库(可选)
db.fsyncLock()

# 2. 创建快照
lvcreate -L 10G -s -n mongodb_snapshot /dev/vg0/mongodb

# 3. 解锁数据库
db.fsyncUnlock()

4.2 快照恢复 #

bash
# 1. 停止MongoDB
systemctl stop mongod

# 2. 恢复快照
lvconvert --merge /dev/vg0/mongodb_snapshot

# 3. 启动MongoDB
systemctl start mongod

4.3 快照注意事项 #

text
1. 确保journal启用
2. 快照期间数据库可能短暂不可用
3. 快照大小可能大于实际数据
4. 定期测试恢复流程

五、复制集备份 #

5.1 从节点备份 #

bash
# 在从节点执行备份
mongodump --out /backup/$(date +%Y%m%d)

# 优点:
# - 不影响主节点性能
# - 不影响生产服务

5.2 隐藏节点备份 #

javascript
// 配置隐藏节点专门用于备份
rs.conf().members[2].hidden = true
rs.conf().members[2].priority = 0
rs.reconfig(rs.conf())

5.3 延迟节点备份 #

javascript
// 配置延迟节点
rs.conf().members[2].hidden = true
rs.conf().members[2].priority = 0
rs.conf().members[2].slaveDelay = 3600  // 延迟1小时
rs.reconfig(rs.conf())

六、备份策略 #

6.1 全量+增量备份 #

bash
# 全量备份(每周)
mongodump --oplog --archive=/backup/full_$(date +%Y%m%d).gz --gzip

# 增量备份(每日)
# 复制oplog
mongodump --db local --collection oplog.rs --out /backup/incr_$(date +%Y%m%d)

6.2 备份脚本 #

bash
#!/bin/bash

# 备份脚本
BACKUP_DIR="/backup/mongodb"
DATE=$(date +%Y%m%d)
MONGO_URI="mongodb://admin:password@localhost:27017/admin?authSource=admin"

# 创建备份目录
mkdir -p $BACKUP_DIR/$DATE

# 执行备份
mongodump --uri "$MONGO_URI" \
    --archive=$BACKUP_DIR/$DATE/mongodb.gz \
    --gzip \
    --oplog

# 删除7天前的备份
find $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} +

# 记录日志
echo "$(date) - Backup completed" >> $BACKUP_DIR/backup.log

6.3 自动备份(Cron) #

bash
# 编辑crontab
crontab -e

# 每天凌晨2点备份
0 2 * * * /scripts/mongodb_backup.sh

七、恢复测试 #

7.1 测试恢复流程 #

bash
# 1. 创建测试数据库
mongosh
use test_restore
db.test.insertOne({ name: "test" })

# 2. 执行备份
mongodump --db test_restore --out /backup/test

# 3. 删除测试数据
db.dropDatabase()

# 4. 执行恢复
mongorestore --db test_restore /backup/test/test_restore

# 5. 验证数据
db.test.find()

7.2 定期恢复演练 #

text
恢复演练计划

1. 每月执行一次完整恢复演练
2. 验证备份数据完整性
3. 记录恢复时间
4. 更新恢复文档

八、备份监控 #

8.1 监控备份状态 #

bash
# 检查备份文件
ls -lh /backup/mongodb/

# 检查备份大小
du -sh /backup/mongodb/*

# 检查备份时间
stat /backup/mongodb/latest

8.2 备份告警 #

bash
# 检查备份是否过期
if [ $(find /backup/mongodb -name "*.gz" -mtime +1 | wc -l) -eq 0 ]; then
    echo "Backup is outdated!"
    # 发送告警
fi

九、云备份 #

9.1 MongoDB Atlas备份 #

text
Atlas备份功能

1. 云备份
   - 自动备份
   - 时间点恢复
   - 跨区域复制

2. 按需快照
   - 手动创建快照
   - 保留期可配置

3. 备份计划
   - 每日备份
   - 每周备份
   - 每月备份

9.2 云存储备份 #

bash
# 上传到S3
aws s3 cp /backup/mongodb.gz s3://my-bucket/mongodb/

# 上传到OSS
ossutil cp /backup/mongodb.gz oss://my-bucket/mongodb/

十、最佳实践 #

10.1 备份建议 #

text
1. 定期备份
   - 每日增量备份
   - 每周全量备份

2. 多地备份
   - 本地备份
   - 异地备份
   - 云存储备份

3. 验证备份
   - 定期测试恢复
   - 验证数据完整性

4. 监控备份
   - 监控备份状态
   - 设置告警通知

5. 文档记录
   - 记录备份策略
   - 记录恢复流程

10.2 恢复建议 #

text
1. 恢复前准备
   - 确认备份版本
   - 准备恢复环境

2. 恢复步骤
   - 停止应用
   - 执行恢复
   - 验证数据
   - 启动应用

3. 恢复后验证
   - 数据完整性检查
   - 应用功能测试

十一、总结 #

备份恢复操作速查表:

操作 命令
备份所有数据库 mongodump --out /backup
备份指定数据库 mongodump --db mydb --out /backup
压缩备份 mongodump --archive=backup.gz --gzip
恢复数据库 mongorestore /backup
从压缩恢复 mongorestore --archive=backup.gz --gzip

下一步,让我们学习性能优化!

最后更新:2026-03-27