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