#!/bin/bash
#=====================================================
# MySQL 数据库备份脚本 - 支持全量/分库备份
# 来源: 整合自 aqzt/kjyw 快捷运维
# 用法: ./mysql-backup.sh
# 配置: 修改下方数据库连接信息
#=====================================================

# === 配置区域 ===
DB_HOST="localhost"
DB_PORT="3306"
DB_USER="root"
DB_PASS="your_password"
BACKUP_DIR="/data/backup/mysql"
RETENTION_DAYS=30                    # 保留天数
DATABASES="--all-databases"          # 或指定 "db1 db2 db3"
# ===============

GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_PATH="${BACKUP_DIR}/${DATE}"
LOG_FILE="${BACKUP_DIR}/backup.log"

mkdir -p "$BACKUP_PATH"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}    MySQL 备份开始${NC}"
echo -e "${GREEN}========================================${NC}"
log "备份开始"

# 检查 mysqldump
if ! command -v mysqldump &>/dev/null; then
    echo -e "${RED}错误: mysqldump 未安装${NC}"
    exit 1
fi

# 检查连接
if ! mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" -e "SELECT 1;" &>/dev/null; then
    echo -e "${RED}错误: 无法连接数据库${NC}"
    exit 1
fi

SUCCESS=0
FAIL=0

# 执行备份
if [ "$DATABASES" = "--all-databases" ]; then
    BACKUP_FILE="${BACKUP_PATH}/all-databases-${DATE}.sql.gz"
    log "全量备份 -> $BACKUP_FILE"

    if mysqldump -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" \
        --single-transaction --routines --triggers --events \
        --all-databases 2>>"$LOG_FILE" | gzip > "$BACKUP_FILE"; then
        echo -e "${GREEN}[✓]${NC} 全量备份成功: $(du -sh "$BACKUP_FILE" | cut -f1)"
        SUCCESS=$((SUCCESS + 1))
    else
        echo -e "${RED}[✗]${NC} 全量备份失败"
        FAIL=$((FAIL + 1))
    fi
else
    for db in $DATABASES; do
        BACKUP_FILE="${BACKUP_PATH}/${db}-${DATE}.sql.gz"
        log "备份数据库 $db -> $BACKUP_FILE"

        if mysqldump -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" \
            --single-transaction --routines --triggers --events \
            "$db" 2>>"$LOG_FILE" | gzip > "$BACKUP_FILE"; then
            echo -e "${GREEN}[✓]${NC} $db: $(du -sh "$BACKUP_FILE" | cut -f1)"
            SUCCESS=$((SUCCESS + 1))
        else
            echo -e "${RED}[✗]${NC} $db 备份失败"
            FAIL=$((FAIL + 1))
        fi
    done
fi

# 清理过期备份
log "清理 ${RETENTION_DAYS} 天前的备份..."
DELETED=$(find "$BACKUP_DIR" -maxdepth 1 -type d -mtime +"$RETENTION_DAYS" -exec rm -rf {} \; -print | wc -l)
log "清理了 ${DELETED} 个过期备份"

# 备份摘要
echo ""
echo -e "${GREEN}========================================${NC}"
echo "  备份完成: 成功 $SUCCESS / 失败 $FAIL"
echo "  备份目录: $BACKUP_PATH"
echo "  磁盘剩余: $(df -h "$BACKUP_DIR" | tail -1 | awk '{print $4}')"
echo -e "${GREEN}========================================${NC}"
log "备份结束: 成功 $SUCCESS / 失败 $FAIL"