#!/bin/bash

# 配置参数
DB_NAME="my_db"
DB_USER="user01"
DB_PASSWORD="1234556"
DB_HOST="192.168.2.3"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
WEEKDAY=$(date +%u)  # 1=周一, 7=周日
LOG_FILE="/var/log/mysql_backup.log"

# 创建备份目录
mkdir -p $BACKUP_DIR

# 记录备份开始时间
echo "=== Backup started at $(date) ===" >> $LOG_FILE

# 判断是否为周日(全量备份)
if [ "$WEEKDAY" -eq 7 ]; then
    echo "Full backup triggered..." >> $LOG_FILE
    BACKUP_TYPE="full"
    BACKUP_FILE="$BACKUP_DIR/my_db_${BACKUP_TYPE}_${DATE}.sql"

    # 全量备份
    mysqldump -h$DB_HOST -u$DB_USER -p$DB_PASSWORD --single-transaction --flush-logs --master-data=2 $DB_NAME > $BACKUP_FILE

    if [ $? -eq 0 ]; then
        echo "Full backup completed: $BACKUP_FILE" >> $LOG_FILE
        # 保存当前binlog位置(用于增量备份)
        mysql -h$DB_HOST -u$DB_USER -p$DB_PASSWORD -e "SHOW MASTER STATUS;" | awk 'NR==2 {print $1" "$2}' > $BACKUP_DIR/last_backup.info
    else
        echo "Full backup failed!" >> $LOG_FILE
    fi

else
    echo "Incremental backup triggered..." >> $LOG_FILE
    BACKUP_TYPE="incr"

    # 获取上一次备份的binlog位置
    if [ ! -f "$BACKUP_DIR/last_backup.info" ]; then
        echo "Error: last_backup.info not found! Please run a full backup first." >> $LOG_FILE
        exit 1
    fi

    LAST_LOG_FILE=$(cat $BACKUP_DIR/last_backup.info | awk '{print $1}')
    LAST_LOG_POS=$(cat $BACKUP_DIR/last_backup.info | awk '{print $2}')

    # 获取当前binlog状态
    CURRENT_LOG_FILE=$(mysql -h$DB_HOST -u$DB_USER -p$DB_PASSWORD -e "SHOW MASTER STATUS;" | awk 'NR==2 {print $1}')
    CURRENT_LOG_POS=$(mysql -h$DB_HOST -u$DB_USER -p$DB_PASSWORD -e "SHOW MASTER STATUS;" | awk 'NR==2 {print $2}')

    # 生成增量备份文件
    BACKUP_FILE="$BACKUP_DIR/my_db_${BACKUP_TYPE}_${DATE}.sql"
    mysqlbinlog --host=$DB_HOST --user=$DB_USER --password=$DB_PASSWORD \
        --start-position=$LAST_LOG_POS \
        --stop-position=$CURRENT_LOG_POS \
        $LAST_LOG_FILE > $BACKUP_FILE

    if [ $? -eq 0 ]; then
        echo "Incremental backup completed: $BACKUP_FILE" >> $LOG_FILE
        # 更新last_backup.info为当前binlog状态
        echo "$CURRENT_LOG_FILE $CURRENT_LOG_POS" > $BACKUP_DIR/last_backup.info
    else
        echo "Incremental backup failed!" >> $LOG_FILE
    fi
fi

# 记录备份结束时间
echo "=== Backup finished at $(date) ===" >> $LOG_FILE
posted on 2025-06-22 21:41  你个der  阅读(7)  评论(0)    收藏  举报