xtrabackup每周增量备份MySQL-5.7的脚本

脚本内容:每周第一天全量备份,剩下六天增量备份,每周日进行归档压缩,并删除三周前的归档压缩包
脚本如下:

#!/bin/sh

## 定义连接变量
# mysql配置文件路径
file_conf=/home/database/mysql-5.7/conf
# mysql数据文件夹路径
datadir=/home/database/mysql-5.7/data
# mysql连接地址
host=172.30.0.1
# mysql端口
port=3306
# mysql备份账号名称
username=root
# mysql备份账号密码
password=abc1234
# 用于连接mysql的socket文件
socket=/home/database/mysql-5.7/data/mysql.sock


## 定义备份信息
time=`date +"%Y-%m-%d"`                 # 今天
today=`date +%w`                        # 今天周几
time_old=$( date +"%Y-%m-%d" -d "-24hour" )  # 昨天
BEGINTIME=`date +"%Y-%m-%d %H:%M:%S"`   # 脚本开始时间
backdir=/home/mysql_backup              # 备份总目录
new_backdir=/home/mysql_backup/$time    # 今日备份目录文件
redo_backdir=/home/mysql_redofile       # 留存目录, 保留的格式为 .tar.gz格式
mysql_info=/home/mysql_info             # 日志保留文件夹
format_time=`date +"%Y-%m-%d_%H:%M"`    # 日志输出时间, 精确到分
log_output=${mysql_info}/xtrabackup_log_$format_time # 备份输出日志
time_cost=${mysql_info}/xtrabackup_timecost.log      # 记录花费时间日志
backupbin=/usr/bin                      # bin目录位置

# 假如不存在备份总目录 backdir 则创建
if [ ! -d ${backdir} ];
then
    mkdir -p ${backdir}
fi

# 假如不存在留存目录 redo_backdir 则创建
if [ ! -d ${redo_backdir} ];
then
    mkdir -p ${redo_backdir}
fi

# 假如不存在日志文件 xtrabackup_timecost.log 则创建
if [ ! -f "${time_cost}" ];
then
    mkdir -p $mysql_info
    touch ${time_cost}
fi

# 获取备份总目录文件数量
number=`ls -A ${backdir} | wc -l`

# 开始逻辑判断全量和增量备份
# 假如备份总目录为空, 即没有任何文件, 则全量备份
if [ $number -eq 0 ];then

    echo "#####开始今日全量备份 at $BEGINTIME " >>$time_cost

    ${backupbin}/innobackupex --defaults-file=${file_conf} \
    --datadir=${datadir} \
    --host=${host} \
    --port=${port} \
    --user=${username} \
    --password=${password} \
    --socket=${socket} \
    --no-timestamp \
    "${new_backdir}"_full_"${number}" 1> $log_output 2>&1

# 假如备份总目录有文件, 则以备份总目录中最新的文件作为基础, 开始增量备份
elif [ $number -ne 0 ];then

    echo "#####开始今日增量备份  at $BEGINTIME " >>$time_cost
    # 获取最新的文件名
    thelast_backfile=`ls -t ${backdir} |  head -n 1 | awk '{print $0}'`

    ${backupbin}/innobackupex --defaults-file=${file_conf} \
    --datadir=${datadir} \
    --host=${host} \
    --port=${port} \
    --user=${username} \
    --password=${password} \
    --socket=${socket} \
    --no-timestamp \
    --incremental-basedir=${backdir}/${thelast_backfile} \
    --incremental \
    "${new_backdir}"_incr_"${number}" 1> $log_output 2>&1

fi

# 输出时间变量
b=`ls -t ${backdir} |  head -n 1 | awk '{print $0}'`
ENDTIME=`date +"%Y-%m-%d %H:%M:%S"`      # 备份结束时间
begin_data=`date -d "$BEGINTIME" +%s`
end_data=`date -d "$ENDTIME" +%s`
spendtime=`expr $end_data - $begin_data` # 计算花费时间
echo "耗时 $spendtime sec 用于创建备份文件 $b" >>$time_cost


# 假如今天是星期天, 则归档打包备份目录所有的文件
if [ "`date +%w`" == "0" ];then

    # 将备份目录backdir下的所有文件, 打包压缩移动到留存目录redo_backdir中, 然后删除备份目录backdir目录下的所有文件
    # 归档打包这周的全量和增量文件为一个压缩包
    cd ${backdir}
    tar -czvf redofile_${time}.tar.gz ./* >/dev/null  2>&1
    mv redofile_${time}.tar.gz ${redo_backdir}
    # 删除已归档的文件夹
    rm -rf ${backdir}/*

fi



# 删除归档目录中第四个, 即21天前的也就是最旧的压缩包, 只保留3个, 也就是3周的压缩包, +mtime +20 为找到20天前的文件"
del_redofile=`find ${redo_backdir} -mtime +20 -name "redofile_*"`
if [ -n "${del_redofile}" ];then

    echo "#####删除3周前的归档文件${del_redofile}">>$time_cost
    rm -rf ${del_redofile}

fi

posted @ 2022-09-02 11:41  青团青  阅读(231)  评论(0编辑  收藏  举报