插件窝 干货文章 细述:通过Shell脚本定时自动备份MongoDB

细述:通过Shell脚本定时自动备份MongoDB

备份 MongoDB BACKUP MONGO 898    来源:    2025-05-22

MongoDB自动备份Shell脚本实现指南

1. 备份脚本基础实现

以下是一个完整的MongoDB自动备份Shell脚本示例:

#!/bin/bash

# MongoDB备份脚本
# 版本: 1.0
# 作者: [你的名字]
# 日期: $(date +%Y-%m-%d)

# 配置参数
MONGO_HOST="localhost"          # MongoDB主机
MONGO_PORT="27017"              # MongoDB端口
MONGO_USER=""                   # MongoDB用户名(如果有认证)
MONGO_PASS=""                   # MongoDB密码(如果有认证)
BACKUP_DIR="/data/backups/mongodb"  # 备份目录
DATE=$(date +%Y%m%d_%H%M%S)     # 当前日期时间
DAYS_TO_KEEP=7                  # 保留最近7天的备份

# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR

# 备份函数
backup_mongodb() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始MongoDB备份..."

    # 构建备份命令
    if [ -z "$MONGO_USER" ]; then
        # 无认证备份
        mongodump --host $MONGO_HOST --port $MONGO_PORT --out $BACKUP_DIR/mongodb_backup_$DATE
    else
        # 有认证备份
        mongodump --host $MONGO_HOST --port $MONGO_PORT --username $MONGO_USER --password $MONGO_PASS --out $BACKUP_DIR/mongodb_backup_$DATE
    fi

    # 检查备份是否成功
    if [ $? -eq 0 ]; then
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] MongoDB备份成功,保存到: $BACKUP_DIR/mongodb_backup_$DATE"

        # 压缩备份文件
        cd $BACKUP_DIR
        tar -czvf mongodb_backup_$DATE.tar.gz mongodb_backup_$DATE
        rm -rf mongodb_backup_$DATE

        # 清理旧备份
        find $BACKUP_DIR -name "mongodb_backup_*.tar.gz" -type f -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] 已清理超过$DAYS_TO_KEEP天的旧备份"
    else
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] MongoDB备份失败!"
        exit 1
    fi
}

# 执行备份
backup_mongodb

2. 脚本功能说明

  1. 基本备份功能

    • 使用mongodump工具备份MongoDB数据
    • 支持有认证和无认证两种备份方式
    • 自动创建备份目录
  2. 备份管理

    • 自动以日期时间命名备份文件
    • 自动压缩备份文件以节省空间
    • 自动清理超过指定天数的旧备份
  3. 日志记录

    • 每个关键步骤都有时间戳日志
    • 备份成功或失败都有明确提示

3. 设置定时任务

使用Linux的crontab设置定时任务,实现自动备份:

  1. 保存脚本为/usr/local/bin/mongodb_backup.sh
  2. 给脚本执行权限: bash chmod +x /usr/local/bin/mongodb_backup.sh
  3. 编辑crontab: bash crontab -e
  4. 添加以下行(示例为每天凌晨2点执行): bash 0 2 * * * /usr/local/bin/mongodb_backup.sh >> /var/log/mongodb_backup.log 2>&1

4. 高级功能扩展

4.1 备份特定数据库或集合

# 只备份特定数据库
mongodump --host $MONGO_HOST --port $MONGO_PORT --db mydatabase --out $BACKUP_DIR/mongodb_backup_$DATE

# 只备份特定集合
mongodump --host $MONGO_HOST --port $MONGO_PORT --db mydatabase --collection mycollection --out $BACKUP_DIR/mongodb_backup_$DATE

4.2 远程备份与SCP传输

# 备份完成后传输到远程服务器
REMOTE_USER="backupuser"
REMOTE_HOST="backup.server.com"
REMOTE_DIR="/remote/backup/path"

scp $BACKUP_DIR/mongodb_backup_$DATE.tar.gz $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR

4.3 邮件通知

# 备份完成后发送邮件通知
MAIL_TO="admin@example.com"
SUBJECT="MongoDB备份报告 - $(date +%Y-%m-%d)"

if [ $? -eq 0 ]; then
    echo "MongoDB备份成功完成于 $(date)" | mail -s "$SUBJECT" $MAIL_TO
else
    echo "MongoDB备份失败于 $(date)" | mail -s "$SUBJECT" $MAIL_TO
fi

4.4 使用配置文件

创建配置文件/etc/mongodb_backup.conf

MONGO_HOST="localhost"
MONGO_PORT="27017"
MONGO_USER=""
MONGO_PASS=""
BACKUP_DIR="/data/backups/mongodb"
DAYS_TO_KEEP=7

然后在脚本中读取配置:

# 读取配置文件
if [ -f "/etc/mongodb_backup.conf" ]; then
    source /etc/mongodb_backup.conf
fi

5. 恢复备份

备份的恢复可以使用mongorestore命令:

# 解压备份文件
tar -xzvf mongodb_backup_20230101_020000.tar.gz

# 恢复备份
mongorestore --host localhost --port 27017 mongodb_backup_20230101_020000/

6. 注意事项

  1. 权限问题

    • 确保运行脚本的用户有访问MongoDB和备份目录的权限
    • 对于认证数据库,确保用户有足够的权限
  2. 存储空间

    • 监控备份目录的磁盘空间使用情况
    • 考虑使用压缩减少空间占用
  3. 安全性

    • 不要将密码硬编码在脚本中,考虑使用配置文件或环境变量
    • 确保备份文件有适当的访问权限
  4. 测试

    • 定期测试备份文件的恢复过程
    • 监控备份日志确保备份正常运行
  5. 性能影响

    • 大型数据库备份可能影响生产性能,考虑在低峰期执行
    • 对于大型数据库,考虑使用--oplog选项进行增量备份

通过以上脚本和配置,你可以实现一个可靠、自动化的MongoDB备份解决方案,确保数据安全。