1#!/bin/bash
2# mysql_backup.sh - MySQL 自动备份脚本
3# 策略:周日全量,周一到周六增量
4
5set -euo pipefail
6
7# ====== 配置区域 ======
8BACKUP_BASE="/backup/mysql"
9MYSQL_USER="backup_user"
10MYSQL_PASS="backup_password"
11RETENTION_DAYS=14
12FULL_BACKUP_DAY=0 # 0=周日
13PARALLEL=4
14COMPRESS_THREADS=4
15LOG_FILE="/var/log/mysql_backup.log"
16
17# ====== 函数定义 ======
18log() {
19 echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
20}
21
22get_latest_full() {
23 ls -dt "$BACKUP_BASE"/full_* 2>/dev/null | head -1
24}
25
26get_latest_backup() {
27 local latest_inc=$(ls -dt "$BACKUP_BASE"/inc_* 2>/dev/null | head -1)
28 local latest_full=$(get_latest_full)
29 if [[ -n "$latest_inc" && "$latest_inc" > "$latest_full" ]]; then
30 echo "$latest_inc"
31 else
32 echo "$latest_full"
33 fi
34}
35
36cleanup_old_backups() {
37 log "清理 ${RETENTION_DAYS} 天前的备份..."
38 find "$BACKUP_BASE" -maxdepth 1 -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} \;
39}
40
41# ====== 主逻辑 ======
42mkdir -p "$BACKUP_BASE"
43
44DAY_OF_WEEK=$(date +%w)
45DATE_TAG=$(date +%Y%m%d_%H%M%S)
46
47if [[ "$DAY_OF_WEEK" -eq "$FULL_BACKUP_DAY" ]] || [[ -z "$(get_latest_full)" ]]; then
48 # 全量备份
49 TARGET="$BACKUP_BASE/full_${DATE_TAG}"
50 log "开始全量备份 → $TARGET"
51 xtrabackup --backup \
52 --user="$MYSQL_USER" --password="$MYSQL_PASS" \
53 --target-dir="$TARGET" \
54 --parallel="$PARALLEL" \
55 --compress --compress-threads="$COMPRESS_THREADS" \
56 2>> "$LOG_FILE"
57 log "全量备份完成"
58else
59 # 增量备份
60 BASE_DIR=$(get_latest_backup)
61 TARGET="$BACKUP_BASE/inc_${DATE_TAG}"
62 log "开始增量备份 → $TARGET (基于 $BASE_DIR)"
63 xtrabackup --backup \
64 --user="$MYSQL_USER" --password="$MYSQL_PASS" \
65 --target-dir="$TARGET" \
66 --incremental-basedir="$BASE_DIR" \
67 --parallel="$PARALLEL" \
68 --compress --compress-threads="$COMPRESS_THREADS" \
69 2>> "$LOG_FILE"
70 log "增量备份完成"
71fi
72
73cleanup_old_backups
74
75# 验证备份
76BACKUP_SIZE=$(du -sh "$TARGET" | cut -f1)
77log "备份大小: $BACKUP_SIZE"
78
79# 上传到 S3(可选)
80# aws s3 sync "$TARGET" "s3://my-backups/mysql/${DATE_TAG}/" --storage-class STANDARD_IA
81
82log "备份流程结束"