本文目录导读:

我来帮你编写一个定时任务备份脚本,以下是几种常见场景的备份脚本示例:
文件/目录备份脚本
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
使用建议
- 测试脚本:先手动运行测试
- 检查权限:确保有读写权限
- 监控日志:检查备份日志确认成功
- 定期验证:测试恢复备份文件
- 异地备份:考虑远程备份方案
需要我帮你写特定场景的备份脚本吗?