Appearance
备份恢复
备份类型
| 类型 | 说明 | 优点 | 缺点 |
|---|---|---|---|
| 文件系统快照 | 复制数据文件 | 速度快 | 需要文件系统支持 |
| mongodump | 逻辑备份 | 灵活方便 | 速度较慢 |
| 增量备份 | 只备份变化 | 占用空间小 | 恢复复杂 |
| 全量备份 | 完整备份 | 恢复简单 | 占用空间大 |
mongodump 备份
基本语法
bash
mongodump --host localhost --port 27017 --out /backup/dump备份单个数据库
bash
mongodump --host localhost --port 27017 --db mydb --out /backup/dump备份单个集合
bash
mongodump --host localhost --port 27017 --db mydb --collection users --out /backup/dump备份所有数据库
bash
mongodump --host localhost --port 27017 --out /backup/dump带认证备份
bash
mongodump --host localhost --port 27017 \
--username admin --password secret \
--authenticationDatabase admin \
--out /backup/dump压缩备份
bash
mongodump --host localhost --port 27017 --gzip --out /backup/dump
mongodump --host localhost --port 27017 --archive=/backup/mongo_backup.gz --gzip归档文件备份
bash
mongodump --host localhost --port 27017 --archive=/backup/mongo_backup.archive常用参数
| 参数 | 说明 |
|---|---|
| --host | 主机地址 |
| --port | 端口号 |
| --db | 数据库名 |
| --collection | 集合名 |
| --out | 输出目录 |
| --archive | 归档文件 |
| --gzip | 压缩输出 |
| --username | 用户名 |
| --password | 密码 |
| --authenticationDatabase | 认证数据库 |
| --query | 查询条件 |
| --oplog | 包含 oplog |
完整备份示例
bash
mongodump --host localhost --port 27017 \
--username admin --password secret \
--authenticationDatabase admin \
--oplog \
--gzip \
--out /backup/dump_$(date +%Y%m%d)mongorestore 恢复
基本语法
bash
mongorestore --host localhost --port 27017 /backup/dump恢复单个数据库
bash
mongorestore --host localhost --port 27017 --db mydb /backup/dump/mydb恢复单个集合
bash
mongorestore --host localhost --port 27017 \
--db mydb --collection users \
/backup/dump/mydb/users.bson从归档恢复
bash
mongorestore --host localhost --port 27017 --archive=/backup/mongo_backup.archive
mongorestore --host localhost --port 27017 --archive=/backup/mongo_backup.gz --gzip带认证恢复
bash
mongorestore --host localhost --port 27017 \
--username admin --password secret \
--authenticationDatabase admin \
/backup/dump常用参数
| 参数 | 说明 |
|---|---|
| --host | 主机地址 |
| --port | 端口号 |
| --db | 目标数据库 |
| --collection | 目标集合 |
| --drop | 恢复前删除现有数据 |
| --gzip | 解压输入 |
| --archive | 归档文件 |
| --oplogReplay | 重放 oplog |
| --stopOnError | 遇错停止 |
| --numInsertionWorkersPerCollection | 并行插入线程数 |
完整恢复示例
bash
mongorestore --host localhost --port 27017 \
--username admin --password secret \
--authenticationDatabase admin \
--drop \
--gzip \
--oplogReplay \
/backup/dump_20240115文件系统快照
LVM 快照
bash
lvcreate -L 10G -s -n mongo_snapshot /dev/vg0/mongodb
mount -o ro /dev/vg0/mongo_snapshot /mnt/snapshot
tar -czf /backup/mongo_snapshot.tar.gz /mnt/snapshot
umount /mnt/snapshot
lvremove /dev/vg0/mongo_snapshot恢复快照
bash
tar -xzf /backup/mongo_snapshot.tar.gz -C /var/lib/mongodb快照要求
- 数据文件在 LVM 卷上
- 开启 journaling
- 执行 fsyncLock 锁定写入
javascript
db.fsyncLock();
db.fsyncUnlock();增量备份
使用 oplog
bash
mongodump --host localhost --port 27017 \
--oplog \
--out /backup/full增量备份 oplog
bash
mongodump --host localhost --port 27017 \
-d local -c oplog.rs \
--query '{"ts":{"$gt":{"$timestamp":{"t":1705312200,"i":1}}}}' \
--out /backup/incremental恢复增量
bash
mongorestore --host localhost --port 27017 \
--oplogReplay \
/backup/full
mongorestore --host localhost --port 27017 \
--oplogReplay \
/backup/incremental云备份
MongoDB Atlas 备份
Atlas 提供自动备份功能:
- 云备份
- 增量快照
- 时间点恢复
Atlas 备份命令
bash
atlas backups snapshots create <clusterName> --desc "Manual backup"
atlas backups snapshots list <clusterName>
atlas backups snapshots restore <clusterName> <snapshotId>备份策略
全量 + 增量策略
周日:全量备份
周一至周六:增量备份备份保留策略
| 备份类型 | 保留时间 |
|---|---|
| 每日备份 | 7 天 |
| 每周备份 | 4 周 |
| 每月备份 | 12 月 |
自动备份脚本
Bash 脚本
bash
#!/bin/bash
BACKUP_DIR="/backup/mongodb"
DATE=$(date +%Y%m%d_%H%M%S)
MONGO_HOST="localhost"
MONGO_PORT="27017"
MONGO_USER="admin"
MONGO_PASS="password"
MONGO_AUTHDB="admin"
mkdir -p $BACKUP_DIR
mongodump --host $MONGO_HOST \
--port $MONGO_PORT \
--username $MONGO_USER \
--password $MONGO_PASS \
--authenticationDatabase $MONGO_AUTHDB \
--gzip \
--oplog \
--archive=$BACKUP_DIR/mongodb_$DATE.gz
find $BACKUP_DIR -name "*.gz" -mtime +7 -delete
echo "Backup completed: mongodb_$DATE.gz"定时任务
bash
crontab -e
0 2 * * * /scripts/mongodb_backup.sh备份验证
验证备份文件
bash
mongorestore --dryRun --archive=/backup/mongodb_20240115.gz --gzip测试恢复
bash
mongorestore --host localhost --port 27018 \
--archive=/backup/mongodb_20240115.gz --gzip验证数据
javascript
db.users.countDocuments();
db.users.stats();
db.users.validate();备份监控
检查备份状态
bash
ls -la /backup/mongodb/
du -sh /backup/mongodb/备份日志
bash
#!/bin/bash
LOG_FILE="/var/log/mongodb_backup.log"
echo "$(date): Starting backup" >> $LOG_FILE
mongodump ... 2>&1 | tee -a $LOG_FILE
if [ $? -eq 0 ]; then
echo "$(date): Backup completed successfully" >> $LOG_FILE
else
echo "$(date): Backup failed" >> $LOG_FILE
mail -s "MongoDB Backup Failed" admin@example.com < $LOG_FILE
fi恢复场景
场景1:误删除数据库
bash
mongorestore --host localhost --port 27017 \
--db mydb --drop \
/backup/dump/mydb场景2:误删除集合
bash
mongorestore --host localhost --port 27017 \
--db mydb --collection users --drop \
/backup/dump/mydb/users.bson场景3:时间点恢复
bash
mongorestore --host localhost --port 27017 \
--oplogReplay \
--oplogLimit 1705312200:1 \
/backup/dump场景4:恢复到新数据库
bash
mongorestore --host localhost --port 27017 \
--db mydb_restored \
/backup/dump/mydb备份最佳实践
1. 定期备份
- 设置自动备份任务
- 保留多个时间点的备份
2. 验证备份
- 定期测试恢复
- 验证数据完整性
3. 安全存储
- 异地备份
- 加密敏感数据
- 限制访问权限
4. 监控告警
- 监控备份任务
- 设置失败告警
5. 文档记录
- 记录备份策略
- 记录恢复步骤