MongoDB自动备份脚本

代码脚本 · 数据库

MongoDB数据库自动备份脚本,使用mongodump全量备份,支持指定数据库、自动压缩、清理旧备份、备份验证和告警通知

详细内容

#!/bin/bash # ========================================== # MongoDB自动备份脚本 # 用途:使用mongodump自动备份MongoDB数据库 # 使用方法:加入crontab每天凌晨执行 # ========================================== # ========== 配置 ========== MONGO_HOST="127.0.0.1" MONGO_PORT=27017 MONGO_USER="" MONGO_PASSWORD="" MONGO_AUTH_DB="admin" BACKUP_DIR="/backup/mongodb" BACKUP_PREFIX="mongo_backup" KEEP_DAYS=7 DB_NAME="" # 留空备份所有数据库 LOG_FILE="/var/log/mongo_backup.log" ALERT_EMAIL="" # ========================== mkdir -p "$BACKUP_DIR" mkdir -p "$(dirname "$LOG_FILE")" log_msg() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } send_alert() { local title="$1" local content="$2" log_msg "【告警】$title: $content" if [ -n "$ALERT_EMAIL" ]; then echo -e "$content" | mail -s "【MongoDB备份】$title" "$ALERT_EMAIL" 2>/dev/null fi } # 检查mongodump if ! command -v mongodump >/dev/null 2>&1; then log_msg "❌ mongodump未安装,请安装MongoDB Database Tools" exit 1 fi # 构建连接参数 CONN_URI="mongodb://" if [ -n "$MONGO_USER" ] && [ -n "$MONGO_PASSWORD" ]; then CONN_URI="${CONN_URI}${MONGO_USER}:${MONGO_PASSWORD}@" fi CONN_URI="${CONN_URI}${MONGO_HOST}:${MONGO_PORT}/" if [ -n "$MONGO_USER" ]; then CONN_URI="${CONN_URI}?authSource=${MONGO_AUTH_DB}" fi DATE=$(date '+%Y%m%d_%H%M%S') BACKUP_NAME="${BACKUP_PREFIX}_${DATE}" BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME" log_msg "===== MongoDB备份开始 =====" log_msg "MongoDB: $MONGO_HOST:$MONGO_PORT" log_msg "备份目标: ${DB_NAME:-所有数据库}" # 执行备份 DUMP_CMD="mongodump --uri='$CONN_URI' --out='$BACKUP_PATH'" if [ -n "$DB_NAME" ]; then DUMP_CMD="$DUMP_CMD --db='$DB_NAME'" fi log_msg "执行: mongodump ..." if eval "$DUMP_CMD" >> "$LOG_FILE" 2>&1; then log_msg "✓ mongodump执行成功" else log_msg "✗ mongodump执行失败" send_alert "MongoDB备份失败" "mongodump执行失败,请查看日志: $LOG_FILE" rm -rf "$BACKUP_PATH" exit 1 fi # 验证备份 if [ -d "$BACKUP_PATH" ]; then FILE_COUNT=$(find "$BACKUP_PATH" -type f | wc -l) log_msg "备份文件数: $FILE_COUNT" if [ "$FILE_COUNT" -eq 0 ]; then log_msg "✗ 备份目录为空,备份可能失败" send_alert "MongoDB备份异常" "备份目录为空,请检查" rm -rf "$BACKUP_PATH" exit 1 fi else log_msg "✗ 备份目录不存在" send_alert "MongoDB备份失败" "备份目录未创建" exit 1 fi # 压缩备份 log_msg "正在压缩备份..." tar -czf "${BACKUP_PATH}.tar.gz" -C "$BACKUP_DIR" "$BACKUP_NAME" if [ -f "${BACKUP_PATH}.tar.gz" ]; then BACKUP_SIZE=$(du -h "${BACKUP_PATH}.tar.gz" | awk '{print $1}') log_msg "✓ 压缩完成: ${BACKUP_PATH}.tar.gz ($BACKUP_SIZE)" # 删除未压缩的目录 rm -rf "$BACKUP_PATH" else log_msg "✗ 压缩失败,保留未压缩目录" fi # 清理旧备份 log_msg "--- 清理旧备份 ---" DELETED=$(find "$BACKUP_DIR" -name "${BACKUP_PREFIX}_*" -mtime +$KEEP_DAYS -print -delete | wc -l) log_msg "已删除 $DELETED 个超过${KEEP_DAYS}天的旧备份" # 备份统计 TOTAL_FILES=$(find "$BACKUP_DIR" -name "${BACKUP_PREFIX}_*" | wc -l) TOTAL_SIZE=$(du -sh "$BACKUP_DIR" | awk '{print $1}') log_msg "备份文件总数: $TOTAL_FILES" log_msg "备份目录大小: $TOTAL_SIZE" log_msg "===== MongoDB备份完成 ✓ ====="

适配环境

适配系统:CentOS 7+,Ubuntu 18.04+,Debian 10+

依赖环境:bash 4.0+

参数说明

[{"name": "MONGO_HOST", "label": "MongoDB\u4e3b\u673a", "default": "127.0.0.1"}, {"name": "MONGO_PORT", "label": "MongoDB\u7aef\u53e3", "default": "27017"}, {"name": "MONGO_USER", "label": "\u7528\u6237\u540d(\u53ef\u9009)", "default": ""}, {"name": "MONGO_PASSWORD", "label": "\u5bc6\u7801(\u53ef\u9009)", "default": ""}, {"name": "DB_NAME", "label": "\u6570\u636e\u5e93\u540d(\u7559\u7a7a\u5907\u4efd\u6240\u6709)", "default": ""}, {"name": "BACKUP_DIR", "label": "\u5907\u4efd\u76ee\u5f55", "default": "/backup/mongodb"}, {"name": "KEEP_DAYS", "label": "\u4fdd\u7559\u5929\u6570", "default": "7"}]
MongoDB备份数据库mongodump数据恢复

更多数据库