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"}]