• MySQL使用Xtrabackup备份到AWS存储桶


    1.安装Xtrabackup

    cd /tmp
    wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.33-28/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.33-28.1.el7.x86_64.rpm
    yum -y localinstall percona-xtrabackup-80-8.0.33-28.1.el7.x86_64.rpm
    xtrabackup  --version
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    2.安装AWS CLI

    2.1 安装

    yum -y install python3-pip
    pip3 install awscli
    
    • 1
    • 2

    2.2设置 AWS CLI 配置信息

    chown  swadmin:swadmin   /usr/local/bin/aws      #这个是给普通用户授权,如果你使用root用户执行脚本就不需要这个。
    su - swadmin -c "/usr/local/bin/aws configure set aws_access_key_id AK.........."
    su - swadmin -c "/usr/local/bin/aws configure set aws_secret_access_key j7............."
    su - swadmin -c "/usr/local/bin/aws configure set default.region sa-east-1"     #这个是AWS桶的区域
    su - swadmin -c "/usr/local/bin/aws configure set default.output json"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.mysql授权备份用户

    mysql="$(ps -ef | grep mysql | grep -v grep | awk '{for (i=1; i<=NF; i++) if ($i ~ /\/bin\/mysqld/) {sub(/\/bin\/mysqld/, ""); print $i; exit}}')/bin/mysql"
    sock=$(find / -name mysql.sock -not -path "/tmp/*" 2>/dev/null)
    passwd='密码'
    sql_command="GRANT BACKUP_ADMIN ON *.* TO 'root'@'localhost'; FLUSH PRIVILEGES;"
    $mysql -uroot -p$passwd -S $sock -e "$sql_command"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.写入备份脚本

    4.1在tmp目录下创建脚本

    脚本有两个地方需要修改的
    一个是桶的名字
    一个是你的mysql密码

    vim /tmp/backup_script.sh
    
    • 1
    #!/bin/bash
    file_path="/tmp/backup_script.sh"
    #xtrabackup安装目录
    XTRABACKUP_DIR="/usr/bin"
    #备份存放目录
    BACKUP_DIR="/tmp/backup"
    #mysql安装目录
    MYSQL_DIR=$(find / -type d -name mysql 2>/dev/null | grep "apps/mysql$" | grep -v '/tmp/')
    #配置文件目录
    MYSQL_CNF="$(ps -ef | grep mysql | grep -v grep | awk '{for (i=1; i<=NF; i++) if ($i ~ /--defaults-file=/) {sub(/--defaults-file=/, ""); print $i; exit}}' | xargs dirname)/my_16303.cnf"
    #数据库用户
    MYSQL_USER="root"
    #数据库密码
    MYSQL_PASSWORD="passwd"
    #数据库端口
    MYSQL_PORT=16303
    #数据库sock文件
    MYSQL_SOCK=$(find / -name mysql.sock -not -path "/tmp/*" 2>/dev/null)
    #Mysql客户端路径
    mysql="$(ps -ef | grep mysql | grep -v grep | awk '{for (i=1; i<=NF; i++) if ($i ~ /\/bin\/mysqld/) {sub(/\/bin\/mysqld/, ""); print $i; exit}}')/bin/mysql"
    ## S3存储桶名称
    S3_BUCKET="s3_name"  #AWS上的桶名
    #取租户的名字
    zuhu_name=$(echo "$S3_BUCKET" | cut -d'-' -f1)
    ## 当前天
    CURRENT_DATE=$(date +%F)
    ## 当前小时(以24小时制表示)
    CURRENT_HOUR=$(date +%H)
    ## AWS CLI 命令路径
    aws_cmd="/usr/local/bin/aws"
    ##Telegram参数
    url="https://api.telegram.org/bot..........:AA............/sendMessage"
    chat_id="-10........."
    
    function full_backup(){
        ## 描述:xtrabackup 全库备份
    
        PARA1=$CURRENT_DATE
        ## 开始时间
        START_TIME=$(date +"%s")
        ## 当前日期作为备份文件名后缀
        BACKUP_SUFFIX=$(date +"%Y%m%d%H")
    
        if [ ! -d "$BACKUP_DIR/$PARA1/full" ]; then
            mkdir $BACKUP_DIR/$PARA1/full -p
            ## 全库备份
            echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> 开始完整备份。"
            $XTRABACKUP_DIR/xtrabackup --defaults-file=$MYSQL_CNF -u$MYSQL_USER -p$MYSQL_PASSWORD -S$MYSQL_SOCK --backup --target-dir=$BACKUP_DIR/$PARA1/full > $BACKUP_DIR/$PARA1/full/full_backup_$BACKUP_SUFFIX.log 2>&1
            echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> 备份日志位于 $BACKUP_DIR/$PARA1/full/full_backup_$BACKUP_SUFFIX.log."
            echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> 备份完成,大小: $(du $BACKUP_DIR/$PARA1 --max-depth=1 -hl | grep 'full' | awk '{print $1}')."
            echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> 备份完成,使用时间: "$(($(date +"%s") - $START_TIME))" 秒."
    
            ##加密压缩
            tar czf - $BACKUP_DIR/$PARA1/full | openssl enc -aes-256-cbc -e -pass 'pass:密码' -out $BACKUP_DIR/$PARA1/full_$BACKUP_SUFFIX.tar.gz.enc
    
            ## 把打包好的全量备份压缩包上传到AWS S3
            $aws_cmd s3 cp $BACKUP_DIR/$PARA1/full_$BACKUP_SUFFIX.tar.gz.enc s3://$S3_BUCKET/
    
         else
            echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> 当前小时的完整备份目录已存在。."
            echo ''
        fi
    }
    
    function incremental_backup(){
        PARA1=$CURRENT_DATE
        START_TIME=$(date +"%s")
        BACKUP_SUFFIX=$(date +"%Y%m%d%H")
    
        if [ -d "$BACKUP_DIR/$PARA1/full" ]; then
            if [ -d "$BACKUP_DIR/$PARA1/incremental" ]; then
                # 获取上一个增量备份目录
                LAST_INCREMENTAL_DIR=$(ls -td $BACKUP_DIR/$PARA1/incremental/* | head -n 1)
            else
                # 如果没有上一个增量备份,将上一个全量备份用作基础备份
                LAST_INCREMENTAL_DIR="$BACKUP_DIR/$PARA1/full"
            fi
    
            # 创建当前增量备份目录
            mkdir -p "$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX"
    
            # 执行增量备份
            echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> 开始增量备份。"
            $XTRABACKUP_DIR/xtrabackup --defaults-file="$MYSQL_CNF" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -S"$MYSQL_SOCK" --backup --target-dir="$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX" --incremental-basedir="$LAST_INCREMENTAL_DIR" > "$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX/incremental_backup_$BACKUP_SUFFIX.log" 2>&1
    
            ##加密压缩
                    tar czf - "$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX" | openssl enc -aes-256-cbc -e -pass 'pass:密码' -out "$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX/incremental_backup_$BACKUP_SUFFIX.tar.gz.enc"
    
                    #上传增量备份到AWS S3
            "$aws_cmd" s3 cp "$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX/incremental_backup_$BACKUP_SUFFIX.tar.gz.enc" "s3://$S3_BUCKET/"
    
            echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> 备份日志位于 $BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX/incremental_backup_$BACKUP_SUFFIX.log."
            echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> 备份完成,大小: $(du "$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX" --max-depth=1 -hl | grep 'incremental' | awk '{print $1}')."
            echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> 备份完成,使用时间: "$(($(date +"%s") - $START_TIME))" 秒."
    
            echo ''
        else
            echo '检测到当天没有全量备份,开始执行一次全量备份'
            full_backup
        fi
    }
    
    function Delete_previous_backup_files() {
        # 获取当前日期
        current_date=$(date +"%Y-%m-%d")
    
        # 遍历所有备份目录
        for backup_dir in "$BACKUP_DIR"/*; do
            # 提取目录名的日期部分(假设目录名的格式为 YYYY-MM-DD)
            dir_date=$(basename "$backup_dir")
    
            # 检查目录是否不是今天的日期
            if [ "$dir_date" != "$current_date" ]; then
                # 检查目录是否存在
                if [ -d "$backup_dir" ]; then
                    echo "删除备份目录及其内容: $backup_dir"
                    
                    # 递归删除目录及其内容
                    rm -rf "$backup_dir"
                    
                    # 再次确认目录是否存在
                    if [ -d "$backup_dir" ]; then
                        echo "再次确认,删除失败: $backup_dir"
                    else
                        echo "$backup_dir 已经删除!!"
                    fi
                else
                    echo "跳过不存在的目录: $backup_dir"
                fi
            fi
        done
    }
    
    function delete_seven_days_ago(){
        #-------------------------------------------
        ## 描述:使用AWS命令删除S3桶内7天前的备份文件
        #-------------------------------------------
    
        # 7天前的日期
        seven_days_ago=$(date -d "7 days ago" +%Y%m%d%H)  # 包含小时部分
    
        # 列出存储桶中的文件
        files=$($aws_cmd s3 ls s3://$S3_BUCKET/)
    
        while read -r line; do
            # 获取文件名
            file_name=$(echo "$line" | awk '{print $4}')
    
            # 提取文件名中的时间部分
                    time_part=$(echo "$file_name" | grep -oE '[0-9]{10}')
    
            # 如果没有找到时间部分,尝试提取另一种格式
            if [ -z "$time_part" ]; then
                time_part=$(echo "$file_name" | grep -oE 'incremental_backup_[0-9]{10}' | cut -d '_' -f 3)
            fi
    
            # 检查文件时间是否早于7天前
            if [[ -n "$time_part" && "$time_part" < "$seven_days_ago" ]]; then
                echo "Deleting $file_name..."
    
                # 删除文件
                $aws_cmd s3 rm "s3://$S3_BUCKET/$file_name"
    
                echo "File $file_name deleted."
            fi
        done <<< "$files"
    }
    
    function check_and_perform_full_backup() {
        ## 描述:检查当前时间,如果是凌晨2点则执行全量备份
    
        # 获取当前小时
        current_hour=$(date +"%H")
    
        # 判断是否是凌晨2点(时钟24小时制,2点表示为"02")
        if [ "$current_hour" -eq "02" ]; then
            echo "当前时间是凌晨 2 点,正在启动完整备份..."
            full_backup   # 调用执行全量备份的函数
            delete_seven_days_ago  #调用删除S3桶内7天前的备份文件函数
    
        else
            echo "当前时间不是凌晨2点,没有安排完整备份。"
        fi
    }
    
    
    function check_backup_status_and_telegram() {
        ## 描述: 检查备份是否成功并发送 Telegram 告警
    
        full_backup_log="$BACKUP_DIR/$PARA1/full/full_backup_$BACKUP_SUFFIX.log"
        incremental_backup_log="$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX/incremental_backup_$BACKUP_SUFFIX.log"
    
        message_full="全量备份 $zuhu_name 完成,但可能出现问题,请检查备份日志。"
        message_incremental="增量备份 $zuhu_name 完成,但可能出现问题,请检查备份日志。"
    
        # 检查全量备份日志是否不包含 "completed OK"
        if ! grep -q "completed OK" "$full_backup_log"; then
            # 发送全量备份告警消息
            response=$(curl -s -d "chat_id=$chat_id&text=$message_full" "$url")
        fi
    
        # 检查增量备份日志是否不包含 "completed OK"
        if ! grep -q "completed OK" "$incremental_backup_log"; then
            # 发送增量备份告警消息
            response=$(curl -s -d "chat_id=$chat_id&text=$message_incremental" "$url")
        fi
    }
    
    function check_mysql_slave_status() {
        # 描述: 检查当前从库的状态是否正常
        while true; do
            # 使用MySQL客户端检查从库的主从状态
            if $mysql -uroot -p$MYSQL_PASSWORD -S$MYSQL_SOCK -e 'show slave status\G' | grep -q 'Slave_IO_Running: Yes' && $mysql -uroot -p$MYSQL_PASSWORD -S$MYSQL_SOCK -e 'show slave status\G' | grep -q 'Slave_SQL_Running: Yes'; then
                # 主从状态都为 "Yes" 时,执行其他函数
                check_and_perform_full_backup
                incremental_backup
                check_backup_status_and_telegram
    
                # 主从同步状态正常,退出循环
                break
            else
                # 主从状态不都为 "Yes",发送告警
                message_slave="$zuhu_name 主从同步当前状态出现异常!"
                response=$(curl -s -d "chat_id=$chat_id&text=$message_slave" "$url")
                sleep 60
            fi
        done
    }
    delete_file_if_exists() {
        if [ -e "$file_path" ]; then
            rm -rf "$file_path"
            if [ $? -ne 0 ]; then
                echo "$zuhu_name 无法删除文件:$file_path"
            fi
        else
            echo "文件不存在:$file_path"
        fi
    }
    
    #第一不先执行检查主从状态的函数
    check_mysql_slave_status
    #删除昨天的所有日期的备份目录
    Delete_previous_backup_files  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243

    4.2赋予执行权限

    chmod +x /data/backup/backup_script.sh
    
    • 1

    5.设定定时任务

    需求是,一天全量备份一次,一小时增量备份一次。
    定时任务这里设置了每小时执行一次,一天一次的备份在脚本里面判断执行。

    0 * * * * cd  /data/backup/  &&  ./backup_script.sh   >> /data/backup/crontab_backup.log 2>> /data/backup/crontab_backup_error.log
    
    • 1

    在这里插入图片描述

    6、把备份的脚本,改成二进制文件(可选)

    yum   -y   install shc
    cd /data/backup/
    shc -f backup_script.sh
    rm -rf   backup_script.sh
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    使用 shc 工具编译backup_script.sh 脚本,并删除了原始脚本文件,因为这样可以保护脚本的源代码。
    下次执行backup_script.sh.x

    7、附加Jenkins下发备份脚本(可选)

    这个脚本是结合Jenkins使用,在Jenkins上构建定时任务,下发到数据库服务器上执行脚本。

    #!/bin/bash
    #脚本定义在这个地方
    file_path="/tmp/backup_script.sh"
    #xtrabackup安装目录
    XTRABACKUP_DIR="/usr/bin"
    #备份存放目录
    BACKUP_DIR="/tmp/backup"
    #mysql安装目录
    MYSQL_DIR=$(find / -type d -name mysql 2>/dev/null | grep "apps/mysql$" | grep -v '/tmp/')
    #配置文件目录
    MYSQL_CNF="$(ps -ef | grep mysql | grep -v grep | awk '{for (i=1; i<=NF; i++) if ($i ~ /--defaults-file=/) {sub(/--defaults-file=/, ""); print $i; exit}}' | xargs dirname)/my_16303.cnf"
    #数据库用户
    MYSQL_USER="root"
    #数据库密码
    MYSQL_PASSWORD="密码"
    #数据库端口
    MYSQL_PORT=16303
    #数据库sock文件
    MYSQL_SOCK=$(find / -name mysql.sock -not -path "/tmp/*" -not -path "*bak*" -not -type d 2>/dev/null)
    #Mysql客户端路径
    mysql="$(ps -ef | grep mysql | grep -v grep | awk '{for (i=1; i<=NF; i++) if ($i ~ /\/bin\/mysqld/) {sub(/\/bin\/mysqld/, ""); print $i; exit}}')/bin/mysql"
    ## S3存储桶名称
    S3_BUCKET="$1"  #外部传入AWS上的桶名
    #取租户的名字
    zuhu_name=$(echo "$S3_BUCKET" | cut -d'-' -f1)
    ## 当前天
    CURRENT_DATE=$(date +%F)
    	## 当前小时(以24小时制表示)
    CURRENT_HOUR=$(date +%H)
    ## AWS CLI 命令路径
    aws_cmd="/usr/local/bin/aws"
    
    function full_backup() {
    	    # 描述:xtrabackup 全库备份
    
        PARA1="$CURRENT_DATE"
        # 开始时间
        START_TIME=$(date +"%s")
        # 当前日期作为备份文件名后缀
        BACKUP_SUFFIX=$(date +"%Y%m%d%H")
    
        if [ ! -d "$BACKUP_DIR/$PARA1/full" ]; then
            mkdir "$BACKUP_DIR/$PARA1/full" -p
            # 全库备份
            echo "$(date "+%Y-%m-%d %H:%M:%S") [Info] --> 开始完整备份。"
            $XTRABACKUP_DIR/xtrabackup --defaults-file="$MYSQL_CNF" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -S"$MYSQL_SOCK" --backup --target-dir="$BACKUP_DIR/$PARA1/full" > "$BACKUP_DIR/$PARA1/full/full_backup_$BACKUP_SUFFIX.log" 2>&1
            echo "$(date "+%Y-%m-%d %H:%M:%S") [Info] --> 备份日志位于 $BACKUP_DIR/$PARA1/full/full_backup_$BACKUP_SUFFIX.log."
            echo "$(date "+%Y-%m-%d %H:%M:%S") [Info] --> 备份完成,大小: $(du "$BACKUP_DIR/$PARA1" --max-depth=1 -hl | grep 'full' | awk '{print $1}')."
            echo "$(date "+%Y-%m-%d %H:%M:%S") [Info] --> 备份完成,使用时间: $(( $(date +"%s") - $START_TIME )) 秒."
    
            # 加密压缩
            tar czPf - "$BACKUP_DIR/$PARA1/full" | openssl enc -aes-256-cbc -e -pass 'pass:密码' -out "$BACKUP_DIR/$PARA1/full_$BACKUP_SUFFIX.tar.gz.enc"
    
            # 把打包好的全量备份压缩包上传到AWS S3
            $aws_cmd s3 cp "$BACKUP_DIR/$PARA1/full_$BACKUP_SUFFIX.tar.gz.enc" "s3://$S3_BUCKET/"
            if [ $? -eq 0 ]; then
               echo "备份文件上传成功。"
            else
               echo "备份文件上传S3失败"
            fi
        else
            echo "$(date "+%Y-%m-%d %H:%M:%S") [Info] --> 当前小时的完整备份目录已存在。."
            echo ''
        fi
    }
    
    function incremental_backup(){
        PARA1=$CURRENT_DATE
        START_TIME=$(date +"%s")
        BACKUP_SUFFIX=$(date +"%Y%m%d%H")
    
        if [ -d "$BACKUP_DIR/$PARA1/full" ]; then
            if [ -d "$BACKUP_DIR/$PARA1/incremental" ]; then
                # 获取上一个增量备份目录
                LAST_INCREMENTAL_DIR=$(ls -td $BACKUP_DIR/$PARA1/incremental/* | head -n 1)
            else
                # 如果没有上一个增量备份,将上一个全量备份用作基础备份
                LAST_INCREMENTAL_DIR="$BACKUP_DIR/$PARA1/full"
            fi
    
            # 创建当前增量备份目录
            mkdir -p "$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX"
    
            # 执行增量备份
            echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> 开始增量备份。"
            $XTRABACKUP_DIR/xtrabackup --defaults-file="$MYSQL_CNF" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -S"$MYSQL_SOCK" --backup --target-dir="$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX" --incremental-basedir="$LAST_INCREMENTAL_DIR" > "$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX/incremental_backup_$BACKUP_SUFFIX.log" 2>&1
    
            ##加密压缩
            tar czPf - "$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX" | openssl enc -aes-256-cbc -e -pass 'pass:密码' -out "$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX/incremental_backup_$BACKUP_SUFFIX.tar.gz.enc"
    
            #上传增量备份到AWS S3
            "$aws_cmd" s3 cp "$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX/incremental_backup_$BACKUP_SUFFIX.tar.gz.enc" "s3://$S3_BUCKET/"
            if [ $? -eq 0 ]; then
                echo "备份文件上传成功。"
            else
                echo "备份文件上传S3失败"
            fi
                
    
            echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> 备份日志位于 $BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX/incremental_backup_$BACKUP_SUFFIX.log."
            echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> 备份完成,大小: $(du "$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX" --max-depth=1 -hl | grep 'incremental' | awk '{print $1}')."
            echo $(date "+%Y-%m-%d %H:%M:%S")" [Info] --> 备份完成,使用时间: "$(($(date +"%s") - $START_TIME))" 秒."
    
            echo ''
        else
            echo '检测到当天没有全量备份,开始执行一次全量备份'
            full_backup
        fi
    }
    
    function Delete_previous_backup_files() {
        # 获取当前日期
        current_date=$(date +"%Y-%m-%d")
    
        # 遍历所有备份目录
        for backup_dir in "$BACKUP_DIR"/*; do
    	        # 提取目录名的日期部分(假设目录名的格式为 YYYY-MM-DD)
            dir_date=$(basename "$backup_dir")
    
            # 检查目录是否不是今天的日期
            if [ "$dir_date" != "$current_date" ]; then
                # 检查目录是否存在
                if [ -d "$backup_dir" ]; then
                    echo "删除备份目录及其内容: $backup_dir"
                    
                    # 递归删除目录及其内容
                    rm -rf "$backup_dir"
                    
                    # 再次确认目录是否存在
                    if [ -d "$backup_dir" ]; then
                        echo "再次确认,删除失败: $backup_dir"
                    else
                        echo "$backup_dir 已经删除!!"
                    fi
                else
                    echo "跳过不存在的目录: $backup_dir"
                fi
            fi
        done
    }
    
    
    
    
    function delete_seven_days_ago(){
        #-------------------------------------------
    	    ## 描述:使用AWS命令删除S3桶内7天前的备份文件
        #-------------------------------------------
    
        # 7天前的日期
        seven_days_ago=$(date -d "7 days ago" +%Y%m%d%H)  # 包含小时部分
    
        # 列出存储桶中的文件
        files=$($aws_cmd s3 ls s3://$S3_BUCKET/)
    
        while read -r line; do
            # 获取文件名
            file_name=$(echo "$line" | awk '{print $4}')
    
            # 提取文件名中的时间部分
                    time_part=$(echo "$file_name" | grep -oE '[0-9]{10}')
    
            # 如果没有找到时间部分,尝试提取另一种格式
            if [ -z "$time_part" ]; then
                time_part=$(echo "$file_name" | grep -oE 'incremental_backup_[0-9]{10}' | cut -d '_' -f 3)
            fi
    
            # 检查文件时间是否早于7天前
            if [[ -n "$time_part" && "$time_part" < "$seven_days_ago" ]]; then
                echo "Deleting $file_name..."
    
                # 删除文件
                $aws_cmd s3 rm "s3://$S3_BUCKET/$file_name"
    
                echo "File $file_name deleted."
            fi
        done <<< "$files"
    }
    
    function check_and_perform_full_backup() {
    	    ## 描述:检查当前时间,如果是凌晨2点则执行全量备份
    
        # 获取当前小时
        current_hour=$(date +"%H")
    
    	    # 判断是否是凌晨2点(时钟24小时制,2点表示为"02")
        if [ "$current_hour" -eq "02" ]; then
            echo "当前时间是凌晨 2 点,正在启动完整备份..."
            full_backup   # 调用执行全量备份的函数
            delete_seven_days_ago  #调用删除S3桶内7天前的备份文件函数
            
    
        else
            echo "当前时间不是凌晨2点,没有安排完整备份。"
        fi
    }
    
    
    function check_backup_status_and_telegram() {
        ## 描述: 检查备份是否成功并发送 Telegram 告警
        BACKUP_SUFFIX=$(date +"%Y%m%d%H")
        PARA1="$CURRENT_DATE"
        full_backup_log="$BACKUP_DIR/$PARA1/full/full_backup_$BACKUP_SUFFIX.log"
        incremental_backup_log="$BACKUP_DIR/$PARA1/incremental/$BACKUP_SUFFIX/incremental_backup_$BACKUP_SUFFIX.log"
    
        message_full="全量备份 $zuhu_name 完成,但可能出现问题,请检查备份日志。"
        message_incremental="增量备份 $zuhu_name 完成,但可能出现问题,请检查备份日志。"
    
        # 检查全量备份日志是否不包含 "completed OK"
        if ! grep -q "completed OK" "$full_backup_log"; then
            # 发送全量备份告警消息
            echo "$message_full"
        fi
    
        # 检查增量备份日志是否不包含 "completed OK"
        if ! grep -q "completed OK" "$incremental_backup_log"; then
            # 发送增量备份告警消息
            echo "$message_incremental"
        fi
    }
    
    function check_mysql_slave_status() {
        # 描述: 检查当前从库的状态是否正常
        while true; do
            # 使用MySQL客户端检查从库的主从状态
            if $mysql -uroot -p$MYSQL_PASSWORD -S$MYSQL_SOCK -e 'show slave status\G' | grep -q 'Slave_IO_Running: Yes' && $mysql -uroot -p$MYSQL_PASSWORD -S$MYSQL_SOCK -e 'show slave status\G' | grep -q 'Slave_SQL_Running: Yes'; then
                # 主从状态都为 "Yes" 时,执行其他函数
                check_and_perform_full_backup
                incremental_backup
                check_backup_status_and_telegram
    
                # 主从同步状态正常,退出循环
                break
            else
                # 主从状态不都为 "Yes",发送告警
                message_slave="$zuhu_name 主从同步当前状态出现异常!"
                
                echo "$message_slave ,停止備份腳本"
                rm -rf "$file_path"
                exit 1
            fi
        done
    }
    
    
    #删除昨天的所有日期的备份目录
    Delete_previous_backup_files 
    
    check_mysql_slave_status
    
    #执行完移除腳本
    rm -rf "$file_path"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
  • 相关阅读:
    2009-2018年各省涉农贷款数据(wind)
    光明区关于促进科技创新的若干措施(征求意见稿)
    Pr:更改文本和形状的外观
    291_C++_发送json数据给对于的URL【JSON数据交互】
    基于JAVA疫情防控期间人员档案追演示录像上计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    一个分布在多次Softmax后,会趋于相同
    LVM逻辑卷
    阿里P9整理分享的亿级流量Java高并发与网络编程实战PDF
    【Linux kernel/cpufreq】framework ----cpufreq governor
    Cisdem Video Player for mac(高清视频播放器) v5.6.0中文版
  • 原文地址:https://blog.csdn.net/weixin_42324463/article/details/132839550