#!/bin/bash
# ===============================
# 综合备份脚本:备份 MySQL 数据库和网站文件并上传到 S3,同时保留最近3天的备份
# ===============================
# 配置部分
DB_USER="root" # MySQL 用户名
DB_PASSWORD="password" # MySQL 密码
DB_NAME="nodeloc" # 数据库名称
WEB_ROOT="/www/www.nodeloc.com" # 网站根目录
BACKUP_PATH="/www/backups" # 本地备份存放路径
S3_DB_BUCKET="s3backup/backup/database/nodeloc" # S3 数据库备份存储桶路径
S3_WEB_BUCKET="s3backup/backup/site/nodeloc.com" # S3 网站文件备份存储桶路径
LOG_FILE="/var/log/backup_all.log" # 日志文件路径
DAYS_TO_KEEP=3 # 保留备份的天数
# 创建备份目录(如果不存在)
mkdir -p "$BACKUP_PATH"
# 获取当前日期
DATE=$(date +'%Y-%m-%d')
# 定义备份文件名
DB_BACKUP_FILE="${BACKUP_PATH}/nodeloc_backup_${DATE}.sql.gz"
WEB_BACKUP_FILE="${BACKUP_PATH}/nodeloc_web_backup_${DATE}.tar.gz"
# 开始备份数据库
echo "$(date +'%Y-%m-%d %H:%M:%S') - 开始备份数据库 '${DB_NAME}'。" >> "$LOG_FILE"
mysqldump -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" | gzip > "$DB_BACKUP_FILE"
# 检查数据库备份是否成功
if [ $? -ne 0 ]; then
echo "$(date +'%Y-%m-%d %H:%M:%S') - 错误:数据库备份失败。" >> "$LOG_FILE"
exit 1
fi
echo "$(date +'%Y-%m-%d %H:%M:%S') - 数据库备份成功,备份文件:${DB_BACKUP_FILE}" >> "$LOG_FILE"
# 开始备份网站文件
echo "$(date +'%Y-%m-%d %H:%M:%S') - 开始备份网站文件 '${WEB_ROOT}'。" >> "$LOG_FILE"
tar -czf "$WEB_BACKUP_FILE" -C "$(dirname "$WEB_ROOT")" "$(basename "$WEB_ROOT")"
# 检查网站文件备份是否成功
if [ $? -ne 0 ]; then
echo "$(date +'%Y-%m-%d %H:%M:%S') - 错误:网站文件备份失败。" >> "$LOG_FILE"
exit 1
fi
echo "$(date +'%Y-%m-%d %H:%M:%S') - 网站文件备份成功,备份文件:${WEB_BACKUP_FILE}" >> "$LOG_FILE"
# 上传数据库备份文件到 S3
echo "$(date +'%Y-%m-%d %H:%M:%S') - 开始上传数据库备份文件到 S3。" >> "$LOG_FILE"
mc cp "$DB_BACKUP_FILE" "$S3_DB_BUCKET/"
# 检查数据库备份上传是否成功
if [ $? -ne 0 ]; then
echo "$(date +'%Y-%m-%d %H:%M:%S') - 错误:上传数据库备份文件到 S3 失败。" >> "$LOG_FILE"
exit 1
fi
echo "$(date +'%Y-%m-%d %H:%M:%S') - 数据库备份文件成功上传到 S3:${S3_DB_BUCKET}/" >> "$LOG_FILE"
# 上传网站文件备份到 S3
echo "$(date +'%Y-%m-%d %H:%M:%S') - 开始上传网站文件备份到 S3。" >> "$LOG_FILE"
mc cp "$WEB_BACKUP_FILE" "$S3_WEB_BUCKET/"
# 检查网站文件备份上传是否成功
if [ $? -ne 0 ]; then
echo "$(date +'%Y-%m-%d %H:%M:%S') - 错误:上传网站文件备份到 S3 失败。" >> "$LOG_FILE"
exit 1
fi
echo "$(date +'%Y-%m-%d %H:%M:%S') - 网站文件备份成功上传到 S3:${S3_WEB_BUCKET}/" >> "$LOG_FILE"
# 删除本地备份文件(保留最近3天)
echo "$(date +'%Y-%m-%d %H:%M:%S') - 开始删除本地超过 ${DAYS_TO_KEEP} 天的备份文件。" >> "$LOG_FILE"
find "$BACKUP_PATH" -type f -mtime +$DAYS_TO_KEEP -name "*.sql.gz" -exec rm {} \;
find "$BACKUP_PATH" -type f -mtime +$DAYS_TO_KEEP -name "*.tar.gz" -exec rm {} \;
if [ $? -ne 0 ]; then
echo "$(date +'%Y-%m-%d %H:%M:%S') - 警告:删除本地旧备份文件失败。" >> "$LOG_FILE"
else
echo "$(date +'%Y-%m-%d %H:%M:%S') - 本地旧备份文件已删除。" >> "$LOG_FILE"
fi
# 删除 S3 上超过3天的备份文件
echo "$(date +'%Y-%m-%d %H:%M:%S') - 开始删除 S3 上超过 ${DAYS_TO_KEEP} 天的数据库备份文件。" >> "$LOG_FILE"
mc find "$S3_DB_BUCKET" --older-than ${DAYS_TO_KEEP}d --name "nodeloc_backup_*.sql.gz" --exec "mc rm {}"
if [ $? -ne 0 ]; then
echo "$(date +'%Y-%m-%d %H:%M:%S') - 警告:删除 S3 上旧数据库备份文件失败。" >> "$LOG_FILE"
else
echo "$(date +'%Y-%m-%d %H:%M:%S') - S3 上旧数据库备份文件已删除。" >> "$LOG_FILE"
fi
echo "$(date +'%Y-%m-%d %H:%M:%S') - 开始删除 S3 上超过 ${DAYS_TO_KEEP} 天的网站文件备份。" >> "$LOG_FILE"
mc find "$S3_WEB_BUCKET" --older-than ${DAYS_TO_KEEP}d --name "nodeloc_web_backup_*.tar.gz" --exec "mc rm {}"
if [ $? -ne 0 ]; then
echo "$(date +'%Y-%m-%d %H:%M:%S') - 警告:删除 S3 上旧网站文件备份文件失败。" >> "$LOG_FILE"
else
echo "$(date +'%Y-%m-%d %H:%M:%S') - S3 上旧网站文件备份文件已删除。" >> "$LOG_FILE"
fi
echo "----------------------------------------" >> "$LOG_FILE"