如何写一个脚本定时任务备份

wen 实用脚本 2

本文目录导读:

如何写一个脚本定时任务备份

  1. 文件/目录备份脚本
  2. 数据库备份脚本
  3. 创建定时任务 (Crontab)
  4. 高级备份脚本(带邮件通知)
  5. 使用 systemd 定时器(Linux)
  6. 使用建议

我来帮你编写一个定时任务备份脚本,以下是几种常见场景的备份脚本示例:

文件/目录备份脚本

Linux Bash 脚本

#!/bin/bash
# 备份脚本 - backup.sh
# 配置参数
BACKUP_SRC="/path/to/source"          # 要备份的源目录
BACKUP_DST="/path/to/backup"          # 备份存放目录
BACKUP_NAME="backup_$(date +%Y%m%d_%H%M%S)"
MAX_BACKUPS=30                         # 最大保留备份数
LOG_FILE="/var/log/backup.log"
# 创建备份目录
mkdir -p "$BACKUP_DST"
# 执行备份
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting backup..." >> "$LOG_FILE"
# 使用tar压缩备份
tar -czf "$BACKUP_DST/$BACKUP_NAME.tar.gz" -C "$(dirname "$BACKUP_SRC")" "$(basename "$BACKUP_SRC")" 2>> "$LOG_FILE"
if [ $? -eq 0 ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] Backup completed: $BACKUP_NAME.tar.gz" >> "$LOG_FILE"
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] Backup failed!" >> "$LOG_FILE"
    exit 1
fi
# 清理旧备份,保留最近MAX_BACKUPS个
cd "$BACKUP_DST"
ls -t *.tar.gz 2>/dev/null | tail -n +$((MAX_BACKUPS + 1)) | xargs -r rm -f
# 删除超过30天的备份
find "$BACKUP_DST" -name "*.tar.gz" -mtime +30 -delete
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Cleanup completed" >> "$LOG_FILE"

设置执行权限

chmod +x backup.sh

数据库备份脚本

MySQL 备份

#!/bin/bash
# MySQL备份脚本 - mysql_backup.sh
# 数据库配置
DB_USER="root"
DB_PASSWORD="your_password"
DB_NAME="your_database"
BACKUP_DIR="/var/backups/mysql"
RETENTION_DAYS=7
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 生成备份文件名
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_$(date +%Y%m%d_%H%M%S).sql.gz"
# 执行备份
echo "[$(date)] Starting MySQL backup..."
mysqldump -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" | gzip > "$BACKUP_FILE"
if [ $? -eq 0 ]; then
    echo "[$(date)] MySQL backup completed: $BACKUP_FILE"
    # 删除过期备份
    find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
else
    echo "[$(date)] MySQL backup failed!"
    exit 1
fi

PostgreSQL 备份

#!/bin/bash
# PostgreSQL备份脚本 - pg_backup.sh
PG_USER="postgres"
PG_DATABASE="your_database"
BACKUP_DIR="/var/backups/postgresql"
# 执行备份
pg_dump -U "$PG_USER" "$PG_DATABASE" | gzip > "$BACKUP_DIR/pg_$(date +%Y%m%d_%H%M%S).sql.gz"
# 保留最近30天的备份
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +30 -delete

创建定时任务 (Crontab)

编辑crontab

crontab -e

常用定时任务示例

# 每天凌晨2:00执行备份
0 2 * * * /path/to/backup.sh
# 每小时执行一次
0 * * * * /path/to/backup.sh
# 每周日凌晨3:00执行
0 3 * * 0 /path/to/backup.sh
# 每月1号凌晨4:00执行
0 4 1 * * /path/to/backup.sh
# 每30分钟执行一次
*/30 * * * * /path/to/backup.sh
# 每天8:00和18:00执行
0 8,18 * * * /path/to/backup.sh

Crontab格式说明

分钟(0-59) 小时(0-23) 日(1-31) 月(1-12) 星期(0-7) 命令

高级备份脚本(带邮件通知)

#!/bin/bash
# 高级备份脚本 - advanced_backup.sh
# 配置
BACKUP_SOURCES=("/var/www" "/etc" "/home/user/Documents")
BACKUP_DIR="/var/backups/system"
EMAIL="admin@example.com"
DATE=$(date +%Y%m%d_%H%M%S)
HOSTNAME=$(hostname)
# 邮件通知函数
notify() {
    local status=$1
    local message=$2
    echo "$message" | mail -s "[Backup] $HOSTNAME - $status" "$EMAIL"
}
# 开始备份
echo "Starting backup on $HOSTNAME at $(date)"
for src in "${BACKUP_SOURCES[@]}"; do
    # 获取目录名
    dir_name=$(basename "$src")
    backup_file="$BACKUP_DIR/${dir_name}_${DATE}.tar.gz"
    # 执行备份
    if tar -czf "$backup_file" "$src" 2>/dev/null; then
        echo "Backup successful: $backup_file"
        # 创建校验和
        md5sum "$backup_file" > "${backup_file}.md5"
    else
        notify "FAILED" "Backup failed for $src"
        exit 1
    fi
done
# 删除7天前的备份
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete
find "$BACKUP_DIR" -name "*.md5" -mtime +7 -delete
# 发送成功通知
notify "SUCCESS" "Backup completed successfully on $HOSTNAME at $(date)"
echo "Backup completed at $(date)"

使用 systemd 定时器(Linux)

创建服务文件 /etc/systemd/system/backup.service

[Unit]
Description=System Backup Service
[Service]
Type=oneshot
ExecStart=/path/to/backup.sh
User=root

创建定时器文件 /etc/systemd/system/backup.timer

[Unit]
Description=Run Backup Daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target

启用定时器

systemctl daemon-reload
systemctl enable backup.timer
systemctl start backup.timer

使用建议

  1. 测试脚本:先手动运行测试
  2. 检查权限:确保有读写权限
  3. 监控日志:检查备份日志确认成功
  4. 定期验证:测试恢复备份文件
  5. 异地备份:考虑远程备份方案

需要我帮你写特定场景的备份脚本吗?

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