Mysql5.7 Xtrabackup 全备、增备脚本 1.0

软件:Xtrabackup 2.4.7    Mysql 5.7.25(需要先安装,并且要开启log-bin)
操作系统:Centos 7.4  设置打开文件数  (如果你的数据库文件比较多,有可能在备份的时候会提示文件打开数问题)
echo '* soft nofile 65535 ' >> /etc/security/limits.conf
echo '* hard nofile 65535 ' >> /etc/security/limits.conf
需要退出当前shell 再登录,生效。
安装依赖
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL perl-Digest-MD5
cd /opt
wget http://www.xchinagroup.top/softdown/centos7/03_mysql/percona-xtrabackup-2.4.7-Linux-x86_64.tar.gz
tar zxvf percona-xtrabackup-2.4.7-Linux-x86_64.tar.gz
mv percona-xtrabackup-2.4.7-Linux-x86_64 xtrabackup-2.4.7
ln -s /root/xtrabackup-2.4.7/bin/xtrabackup /usr/bin/xtrabackup
ln -s /root/xtrabackup-2.4.7/bin/innobackupex /usr/bin/innobackupex

编写脚本:
mkdir -p /script && cd /script
vim xtr.sh

#!/bin/bash
#全备的总目录
BAK_FULL_DIR="/home/backup/xtrabackup/full"
#增备的总目录
BAK_INC_DIR="/home/backup/xtrabackup/inc"

XTR_PATH="/usr/bin/innobackupex"
MYSQL_CNF="/etc/my.cnf"
MYSQL_HOST="localhost"
MYSQL_UNAME="root"
MYSQL_PASS="windows@123"
MYSQLCMD="--user=${MYSQL_UNAME} --password=${MYSQL_PASS} --host=${MYSQL_HOST} "
#提示信息
print_help(){
    echo "------------------------------------------"
    echo "Usage: $0 full | inc | help               "
    echo "------------------------------------------"
    exit 1
}

#判断输入的参数个数,或者$1不是full  inc 就执行 print_help函数,打印提示信息
if [ $# -ne 1 ];then
   clear
   echo "输入的参数不对,参数有且只有一个。"
   print_help
fi
if [ "$1" != "full" ];then
   if [ "$1" != "inc" ];then
        clear
        echo "输入的参数不对"
        print_help
   fi
fi
#判断全备总目录是否存在,不存在就创建。
if [ ! -d ${BAK_FULL_DIR} ];then
        mkdir -p ${BAK_FULL_DIR}
fi
#判断增备总目录是否存在,不存在就创建。
if [ ! -d ${BAK_INC_DIR} ]; then
        mkdir -p ${BAK_INC_DIR}
fi
#全备函数
FullBackup(){
#执行全备的命令
  ${XTR_PATH} --defaults-file=${MYSQL_CNF} $MYSQLCMD ${BAK_FULL_DIR} --parallel="3" >/tmp/full.log 2>&1
#判断全备命令是否执行成功,执行不成功,就退出。
    if [ $? -ne 0 ]; then
        echo "Backup error.  Please check..."
        exit
    else
        echo "Backup completed...."
    fi
}
#增备函数
IncBackup(){
#在开始增备前,从全备总目录(/home/backup/xtrabackup/full)下查找,最新一次的备份(日期时间)目录
NEW_FULL_DIR=`find ${BAK_FULL_DIR} -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
#如果在全备总目录下什么也没有找到,就表示没有执行全备,在开始增备前,先执行一次全备。
if [ -z ${NEW_FULL_DIR} ];then
#执行全备
    FullBackup
else
#如果有在全备总目录(/home/backup/xtrabackup/full)下找到最新备份(日期时间)目录
#取出它的(日期时间)值,赋值给增备总目录下的新目录变量,全备和增备的日期时间都是同一天,容易区分
NEW_INC_DIR=${BAK_INC_DIR}/${NEW_FULL_DIR}
#创建新的 增备(日期时间)目录
    mkdir -p ${NEW_INC_DIR}
#在新的增备(日期时间)目录下,查找最新的增备(日期时间)目录,赋值给一个变量
 NEW_INC_BACKUP=`find ${NEW_INC_DIR} -mindepth 1 -maxdepth 1 -type d -printf "%P\n"  | sort -nr | head -1`
#如果这个变量值为空,也就是说,没有执行过增备
  if [ -z ${NEW_INC_BACKUP} ];then
#这时,增备的基础目录就是 全备总目录(/home/backup/xtrabackup/full)下的 全备最新(日期时间)目录
      BASE_DIR=${BAK_FULL_DIR}/${NEW_FULL_DIR}
    else
#否则,增备的基础目录就是,增备总目录(/home/backup/xtrabackup/inc)/最新一次全备的
#日期时间目录/的最新增备(日期时间时间)目录
        BASE_DIR=${NEW_INC_DIR}/${NEW_INC_BACKUP}
    fi
#执行增备命令
${XTR_PATH} --defaults-file=${MYSQL_CNF} --use-memory=64M $MYSQLCMD --incremental-basedir=${BASE_DIR} --incremental ${NEW_INC_DIR} >/tmp/inc.log 2>&1
#判断 增备命令是否执行成功,如果执行不成功,退出程序。
    if [ $? -ne 0 ];then
        echo 'Incremental Backup Complete. '
    else
        exit
    fi
fi
}

## 全量备份
   if [ "$1" == "full" ];then
    FullBackup
   fi
## 增量备份
   if [ "$1" == "inc" ];then
        IncBackup
   fi
## 删除7天前的备份
    find $BAK_FULL_DIR -name "$(date -d '7 days ago' +'%F')_*" | xargs rm -rf
    find $BAK_INC_DIR -name "$(date -d '7 days ago' +'%F')_*" | xargs rm -rf
保存,退出。 chmod +x xtr.sh
添加到计划任务:
crontab -e
30 1 * * * /bin/bash /script/xtr.sh full &>/tmp/xtra_full.log
*/60 * * * * /bin/bash /script/xtr.sh inc &>/tmp/xtra_inc.log
每天凌晨 1点半,做一次全备
每天每一小时做一次增备