备份到阿里云OSS
提前做好认证,运行ossutil config命令

1、备份mongo到阿里云oss,备份文件只存3个
vim /home/ecs-user/crontab/mongodb-backup.sh
#!/bin/bash # 配置参数 NAMESPACE="cicd" POD_NAME="mongodb-community-instance-0" OSS_BUCKET="lowcoder-stg-mongodb-backup" MONGODB_USER="admin" MONGODB_PASSWORD="djkj@2025" # 备份保留数量 MAX_BACKUPS=3 # 生成备份文件名 BACKUP_NAME="mongodb-backup-$(date +%Y%m%d-%H%M%S)" LOCAL_BACKUP_DIR="/tmp/mongodb-backup" mkdir -p $LOCAL_BACKUP_DIR # 日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" } # 清理本地旧备份 cleanup_local_backups() { log "清理本地旧备份,只保留最新 $MAX_BACKUPS 个..." # 获取本地备份文件列表,按时间倒序排序 local_files=$(ls -t $LOCAL_BACKUP_DIR/mongodb-backup-*.tar.gz 2>/dev/null || true) local_count=$(echo "$local_files" | wc -w) if [ $local_count -gt $MAX_BACKUPS ]; then # 计算需要删除的文件数 delete_count=$((local_count - MAX_BACKUPS)) files_to_delete=$(echo "$local_files" | tail -n $delete_count) for file in $files_to_delete; do log "删除本地备份: $(basename $file)" rm -f "$file" done fi log "本地备份清理完成,当前有 $(ls $LOCAL_BACKUP_DIR/*.tar.gz 2>/dev/null | wc -w || echo 0) 个备份文件" } # 清理 OSS 旧备份 cleanup_oss_backups() { log "清理 OSS 旧备份,只保留最新 $MAX_BACKUPS 个..." # 获取 OSS 备份文件列表,按最后修改时间排序 oss_backup_list=$(ossutil ls oss://$OSS_BUCKET/ | grep "oss://$OSS_BUCKET/mongodb-backup-" | awk '{print $NF}' | sort -r) oss_count=$(echo "$oss_backup_list" | grep -v "^$" | wc -l) if [ $oss_count -gt $MAX_BACKUPS ]; then # 计算需要删除的文件数 delete_count=$((oss_count - MAX_BACKUPS)) files_to_delete=$(echo "$oss_backup_list" | tail -n $delete_count) for file in $files_to_delete; do log "删除 OSS 备份: $file" ossutil rm "$file" done fi log "OSS 备份清理完成" } log "开始 MongoDB 备份: $BACKUP_NAME" # 在 MongoDB Pod 中执行完整备份,并获取临时目录名 log "在 Pod $POD_NAME 中执行备份..." # 生成唯一的临时目录名 TEMP_DIR_NAME="mongobackup_$(date +%s)" BACKUP_FILE_NAME="${BACKUP_NAME}.tar.gz" # 在 Pod 中执行备份并压缩 kubectl exec -n $NAMESPACE $POD_NAME -- bash -c " # 创建临时目录 TEMP_DIR=\"/tmp/$TEMP_DIR_NAME\" mkdir -p \$TEMP_DIR echo '开始 MongoDB 备份...' # 执行 mongodump 带认证 mongodump --username='$MONGODB_USER' \ --password='$MONGODB_PASSWORD' \ --authenticationDatabase=admin \ --out=\$TEMP_DIR/dump if [ \$? -eq 0 ]; then echo 'MongoDB 备份成功' # 压缩备份文件 cd \$TEMP_DIR tar -czf dump.tar.gz dump # 获取文件大小 FILE_SIZE=\$(du -h dump.tar.gz | cut -f1) echo \"备份文件大小: \$FILE_SIZE\" # 清理原始备份目录 rm -rf dump echo '备份文件准备就绪: /tmp/$TEMP_DIR_NAME/dump.tar.gz' else echo 'MongoDB 备份失败' rm -rf \$TEMP_DIR exit 1 fi " # 检查上一步是否成功 if [ $? -ne 0 ]; then log "MongoDB 备份过程失败" exit 1 fi # 将备份文件从 Pod 复制到本地(使用确切的路径) log "将备份文件复制到本地..." kubectl cp $NAMESPACE/$POD_NAME:/tmp/$TEMP_DIR_NAME/dump.tar.gz $LOCAL_BACKUP_DIR/$BACKUP_FILE_NAME if [ $? -eq 0 ]; then log "备份文件复制成功" # 检查本地文件是否存在 if [ -f "$LOCAL_BACKUP_DIR/$BACKUP_FILE_NAME" ]; then LOCAL_FILE_SIZE=$(du -h "$LOCAL_BACKUP_DIR/$BACKUP_FILE_NAME" | cut -f1) log "本地备份文件大小: $LOCAL_FILE_SIZE" # 上传到 OSS log "上传到 OSS..." ossutil cp "$LOCAL_BACKUP_DIR/$BACKUP_FILE_NAME" "oss://$OSS_BUCKET/$BACKUP_FILE_NAME" if [ $? -eq 0 ]; then log "备份已成功上传到 OSS: oss://$OSS_BUCKET/$BACKUP_FILE_NAME" # 清理 Pod 中的临时文件 log "清理 Pod 中的临时文件..." kubectl exec -n $NAMESPACE $POD_NAME -- rm -rf "/tmp/$TEMP_DIR_NAME" # 清理本地旧备份(保留最新3个) cleanup_local_backups # 清理 OSS 旧备份(保留最新3个) cleanup_oss_backups # 显示当前备份状态 log "===== 当前备份状态 =====" log "本地备份文件列表:" ls -lh $LOCAL_BACKUP_DIR/*.tar.gz 2>/dev/null || echo "无本地备份" log "OSS 备份文件列表:" ossutil ls oss://$OSS_BUCKET/mongodb-backup-*.tar.gz 2>/dev/null || echo "无 OSS 备份" log "========================" else log "OSS 上传失败" log "本地备份文件保留在: $LOCAL_BACKUP_DIR/$BACKUP_FILE_NAME" exit 1 fi else log "本地备份文件不存在: $LOCAL_BACKUP_DIR/$BACKUP_FILE_NAME" exit 1 fi else log "文件复制失败" exit 1 fi log "备份完成: $BACKUP_NAME"

浙公网安备 33010602011771号