分享一个“MySQL-5.7版本的xtrabackup物理备份”shell脚本(提供思路!)

        此脚本使用的MySQL数据库版本为5.7,xtrabackup工具请使用对应版本!
        具体效果为周一打包上一次备份周期的数据,并做本次全量,周二、周三、周五和周六做增量,周四做差异备份,完成本次数据备份。
        将此脚本放到计划任务里执行即可周期性数据库物理备份。
计划任务命令:crontab -e

#!/bin/bash
<<! 
=================================================================================
(C) Copyright 2023
==================================================================================
Script Purpose : backup mysql database by innobackupex
----------------------------------------------------------------------------------
Author:泡泡茶壶
Date:2023/12/5
Email:1289040084@qq.com
scriptName
Description:
1:不允许有任何的安在脚本中
2:在脚本中,不允许有任何的交式代码容,使用日志记录需求
3:在脚本中,不允许有任何输出需求
4:每周为一个循环周期,1全备、2增量、3增量、4差异、5增量、6增量、7差异
5.自动检测执行报错,邮件告警
==================================================================================
Version Date      Description
----------------------------------------------------------------------------------
V1.0              Initial version(23023/12/5)
V1.1              fixup(23023/12/6)
v1.2              fixup(23023/12/13)
!

# ==================================== 脚本健壮度检查 ===============================
# 全量备份后开启,不然会报错
# 脚本遇到返回值非零的情况,错误就退出
# set -e
# 检查脚本内的变量,如果有变量未被定义将终止脚本
# set -u
# 检测脚本内的组合命令----管道命令的debug模式
# set -o pipefail
# 显示脚本执行过程并将脚本内的变量的值暴露出来(调试用)
# set -x

#==================================== 赋值变量 ======================================
# ------------------------------------ 设置日期信息 ---------------------------------
# 今天的日期(备份路径用)
NOW1=$(date "+%F_%H-%M-%S")
# 今天的日期(日志格式用)
NOW2=`date +'%F %T'`

# -------------------------------- 设置数据库相关参数 --------------------------------
# 数据库用户
DB_USER="root"
# 数据库密码,填自己的!
DB_PASSWORD='msqwybzwss0.'

# 物理备份总目录
BACKUP_DIR="/data/mysql_data"
# 备份日志路径
BACKUP_LOG="/var/log/xtrabackup.log"
# 物理备份状态
BACK_STATUS_LOG=${BACKUP_DIR}/back_status.log

# 差异备份路径
DIFF_PATH=`fgrep "[full]" $BACK_STATUS_LOG| awk 'END{print $2}'`
# 增量备份路径
INCR_PATH=`tail -1 $BACK_STATUS_LOG | awk '{print $2}'`

# ----------------------------------- 设置邮箱报警相关参数 ---------------------------
# SERVERIPIP=$(ip -4 a show dev ens33 | awk '/inet/{print $2}' | awk -F"/" '{print $1}')
SERVERIPIP=`ip r | awk 'NR==1{print $3}'`
# 邮箱账号,填自己的!
RECIPIENT="1289040084@qq.com"

# -------------------------------------- 定义备份命令 -------------------------------
# 通用备份命令
CMD="innobackupex --user=${DB_USER} --password=${DB_PASSWORD}"
# 全量备份命令
FULL_BACKUP_CMD="$CMD $BACKUP_DIR/full"
# f full i incr d diff
RULE=(d f i i d i i)

#==================================== 声明函数 ======================================
SEND_EMAIL(){
    mail -s "数据备份状态邮件,请及时查收" $RECIPIENT <<EOF
$1
EOF
}

BACKUP_FULL(){
    tar cvzf /data/mysql_backup_$NOW1.tar.gz $BACKUP_DIR && \
    rm -rf $BACKUP_DIR/* || \
    (
        SEND_EMAIL "[$NOW2] 在做数据打包时出现异常,请及时检查,当前主机 ${SERVERIP}"
        echo "[$NOW2] 备份数据打包 失败" >> $BACKUP_LOG
    )
    if [ ! -d $BACKUP_DIR/full ];then
        mkdir -p $BACKUP_DIR/full
    fi
    # 全量备份目录
    $FULL_BACKUP_CMD && \
    (
    FULL_BACK_DIR=$BACKUP_DIR/full/`ls $BACKUP_DIR/full | tail -n 1`
    echo "[full] $FULL_BACK_DIR" >> $BACK_STATUS_LOG
    echo "[$NOW2] full备份 成功" >> $BACKUP_LOG
    ) || \
    (
        SEND_EMAIL "[$NOW2] 在进行full备份时,出现无法解决的异常,请及时检查! 当前主机 ${SERVERIP}"
        echo "[$NOW2] full备份 失败" >> $BACKUP_LOG
    )
}

BACKUP_OTHER(){
    # 增量备份/全量备份命令
    BACKUP_INC_DIFF="$CMD --incremental $BACKUP_DIR/$1 --incremental-basedir=$2"
	echo $BACKUP_INC_DIFF
    if [ ! -d $BACKUP_DIR/$1 ];then
        mkdir -p $BACKUP_DIR/$1
    fi
    $BACKUP_INC_DIFF && \
    (
    echo "[$1] $BACKUP_DIR/$1/`ls $BACKUP_DIR/$1 | tail -1`" >> $BACK_STATUS_LOG
    echo "[$NOW2] $1备份 成功" >> $BACKUP_LOG
    ) || \
    (
        SEND_EMAIL "[$NOW2] 在进行${1}备份时遇到无法解决的异常,请及时检查! 当前主机 ${SERVERIP}"
        echo "[$NOW2] $1备份 失败" >> $BACKUP_LOG
    )
}

case ${RULE[$(date "+%w")]} in
f)
    BACKUP_FULL
    ;;
d)
    BACKUP_OTHER diff "$DIFF_PATH"
    ;;
i)
    BACKUP_OTHER incr $INCR_PATH
    ;;
esac


  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值