本文目录导读:

我来教你写一个自动备份并上传的脚本,这里提供几个不同场景的版本:
基础版:备份并上传到远程服务器
#!/bin/bash
# 备份脚本配置
BACKUP_DIR="/path/to/backup" # 要备份的目录
BACKUP_NAME="backup_$(date +%Y%m%d_%H%M%S)" # 备份文件名
REMOTE_USER="username" # 远程服务器用户名
REMOTE_HOST="192.168.1.100" # 远程服务器地址
REMOTE_PATH="/remote/backup/path" # 远程服务器存储路径
# 创建备份
echo "开始打包备份..."
tar -czf "${BACKUP_NAME}.tar.gz" -C "$(dirname $BACKUP_DIR)" "$(basename $BACKUP_DIR)"
# 上传到远程服务器
echo "上传到远程服务器..."
scp "${BACKUP_NAME}.tar.gz" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/"
# 验证上传是否成功
if [ $? -eq 0 ]; then
echo "备份上传成功!"
# 删除本地备份文件
rm "${BACKUP_NAME}.tar.gz"
else
echo "上传失败,本地备份保留在: ${BACKUP_NAME}.tar.gz"
fi
数据库备份 + 上传
#!/bin/bash
# 数据库配置
DB_USER="root"
DB_PASSWORD="your_password"
DB_NAME="your_database"
BACKUP_DIR="/tmp/db_backup"
# 远程存储配置
BUCKET_NAME="my-backup-bucket" # S3存储桶名
REMOTE_PATH="s3://${BUCKET_NAME}/db_backups/"
# 创建备份目录
mkdir -p ${BACKUP_DIR}
# 生成备份文件名
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz"
# 备份数据库
echo "备份数据库 ${DB_NAME}..."
mysqldump -u${DB_USER} -p${DB_PASSWORD} ${DB_NAME} | gzip > ${BACKUP_FILE}
# 上传到S3
echo "上传到AWS S3..."
aws s3 cp ${BACKUP_FILE} ${REMOTE_PATH}
# 清理本地备份
rm -rf ${BACKUP_DIR}
echo "数据库备份完成!"
增强版:带日志和错误处理的备份脚本
#!/bin/bash
# 配置区
BACKUP_CONFIG=(
["source"]="/var/www/html" # 要备份的源目录
["dest"]="/backups" # 本地备份目录
["remote"]="root@backup-server:/remote/backups/" # 远程地址
["retain_days"]=7 # 本地保留天数
["log_file"]="/var/log/backup.log" # 日志文件
)
# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a ${BACKUP_CONFIG[log_file]}
}
# 错误处理函数
handle_error() {
log "错误: $1"
# 发送邮件通知
echo "备份失败: $1" | mail -s "备份警报" admin@example.com
exit 1
}
# 开始备份
log "========== 开始备份任务 =========="
# 创建备份目录
mkdir -p ${BACKUP_CONFIG[dest]} || handle_error "无法创建备份目录"
# 生成备份文件名
BACKUP_NAME="backup_$(date +%Y%m%d_%H%M%S).tar.gz"
BACKUP_PATH="${BACKUP_CONFIG[dest]}/${BACKUP_NAME}"
# 执行备份
log "正在备份 ${BACKUP_CONFIG[source]}..."
tar -czf ${BACKUP_PATH} ${BACKUP_CONFIG[source]} 2>&1 || handle_error "打包失败"
# 验证备份文件
if [ ! -f ${BACKUP_PATH} ]; then
handle_error "备份文件未创建"
fi
# 获取文件大小
SIZE=$(du -h ${BACKUP_PATH} | cut -f1)
log "备份文件大小: ${SIZE}"
# 上传到远程服务器
log "正在上传到远程服务器..."
rsync -avz --progress ${BACKUP_PATH} ${BACKUP_CONFIG[remote]} 2>&1 || handle_error "上传失败"
# 删除旧的本地备份
log "清理 ${BACKUP_CONFIG[retain_days]} 天前的备份..."
find ${BACKUP_CONFIG[dest]} -name "*.tar.gz" -mtime +${BACKUP_CONFIG[retain_days]} -delete
log "备份任务完成!备份文件: ${BACKUP_NAME}"
配置定时任务 (cron)
将脚本设置为每天定时运行:
# 编辑crontab crontab -e # 添加以下任一行: # 每天凌晨2点执行 0 2 * * * /path/to/your/backup-script.sh # 每天上午8点和晚上8点执行 0 8,20 * * * /path/to/your/backup-script.sh # 每6小时执行一次 0 */6 * * * /path/to/your/backup-script.sh
使用注意事项
权限设置
# 给脚本执行权限 chmod +x backup-script.sh # 安全存储密码 # 方法1:使用环境变量 export DB_PASSWORD="your_password" # 方法2:使用配置文件(.my.cnf) # [client] # user=root # password=your_password
测试运行
# 先在测试环境运行 ./backup-script.sh # 检查日志 tail -f /var/log/backup.log # 手动测试上传 ping backup-server.com ssh user@backup-server.com
多备份策略示例
#!/bin/bash
# 按日、周、月保留备份
case $(date +%d) in
01) RETAIN="monthly" ;; # 每月1号保留
1[0-6]) RETAIN="weekly" ;; # 上半月保留
*) RETAIN="daily" ;; # 其他每天保留
esac
# 根据保留策略执行不同的操作
if [ "$RETAIN" = "monthly" ]; then
# 执行完整备份
tar -czf "full_backup_$(date +%Y%m).tar.gz" /data
else
# 执行增量备份
tar -czf "inc_backup_$(date +%Y%m%d).tar.gz" /data
fi
选择哪个版本取决于你的具体需求:
- 基础版:简单、快速部署
- 数据库版:针对数据库备份
- 增强版:生产环境使用,包含日志和错误处理
- 定时任务:自动化执行
记得根据实际情况修改路径、用户名和密码等配置信息。