Skip to content

备份恢复

备份类型

类型说明优点缺点
文件系统快照复制数据文件速度快需要文件系统支持
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. 文档记录

  • 记录备份策略
  • 记录恢复步骤

下一步学习