如何写一个脚本自动备份并上传

wen 实用脚本 1

本文目录导读:

如何写一个脚本自动备份并上传

  1. 基础版:备份并上传到远程服务器
  2. 数据库备份 + 上传
  3. 增强版:带日志和错误处理的备份脚本
  4. 配置定时任务 (cron)
  5. 使用注意事项

我来教你写一个自动备份并上传的脚本,这里提供几个不同场景的版本:

基础版:备份并上传到远程服务器

#!/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

选择哪个版本取决于你的具体需求:

  • 基础版:简单、快速部署
  • 数据库版:针对数据库备份
  • 增强版:生产环境使用,包含日志和错误处理
  • 定时任务:自动化执行

记得根据实际情况修改路径、用户名和密码等配置信息。

抱歉,评论功能暂时关闭!