Mysql5.7 Xtrabackup 全备、增备脚本 2.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 再登录,生效

mkdir -p /script && cd /script
vim xtra2.4.7_mysql5.7_2.0.sh 

#!/bin/bash
#全备的总目录
BAK_FULL_DIR="/home/backup/xtrabackup/full"
#增备的总目录
BAK_INC_DIR="/home/backup/xtrabackup/inc"
MYSQL_CNF="/etc/my.cnf"
MYSQL_HOST="localhost"
MYSQL_UNAME="root"
MYSQL_PASS="abc.com123"
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
#检测基础环境,用户,网络
function chk_base(){
date
echo ""
echo "########################"
echo "#                      #"
echo "#    基础环境检测中    #"
echo "#                      #"
echo "########################"
for i in `seq -w 3 -1 0`
do
echo -ne "\b\b\b\b$i 秒"
sleep 1
done
echo ""
MYVER=`cat /etc/redhat-release |awk '{print $4}'| awk -F [.] '{print $1}'`
expr 1 + $MYVER &>/dev/null
if [ $? -ne 0 ];then
    echo "请在 7 版本的系统里面运行该脚本....."
    exit
fi
if [ $UID -ne 0 ]; then
    echo "请用 root 用户运行该脚本...."
    exit
fi
    echo '网络检测中.......................'
    echo ' '
    sleep 1
#检测有无外网
ping -c 1 114.114.114.114 > /dev/null 2>&1
if [ $? -eq 0 ];then
    echo '网络正常,程序将继续运行。'
    sleep 1
else
    echo '正在进行第二次网络检测,请稍候.........'
    sleep 1
curl www.baidu.com >/dev/null 2>&1
if [ $? -ne 0 ]; then
    echo '检测到网络连接有异常,请检查您的网络设置.....'
 exit
else
echo ''
    echo '网络正常,程序将继续运行.'
    sleep 1
fi
fi
}
#检测服务器上有没有安装xtrabackup
xtra_check(){
if [ -z `find /usr -name "innobackupex"|head -1` ];then
     echo ""
     echo "Xtrabackup is not installed on your system. We will download it online."
     echo ""
     sleep 2
     chk_base
     echo ""
     echo "正在安装依赖包........"
yum install -y wget perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL perl-Digest-MD5 >/tmp/yl.log
cd /opt
    echo "开始下载Xtrabackup 2.4.7.........."
    echo ""
wget -q http://www.xchinagroup.top/softdown/centos7/03_mysql/percona-xtrabackup-2.4.7-Linux-x86_64.tar.gz
  if [ $? -ne 0 ]; then
          echo ''
          echo "下载有问题,请检查......"
          exit
  fi
    echo '下载完成'
    sleep 1
    echo '正在安装配置xtrabackup'
    echo ""
    tar xf 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 /opt/xtrabackup-2.4.7/bin/xtrabackup /usr/bin/xtrabackup
    ln -s /opt/xtrabackup-2.4.7/bin/innobackupex /usr/bin/innobackupex
    sleep 1
    echo 'Xtrabackup 安装配置完成'
    echo ""
else
    XTR_PATH=`find /usr -name "innobackupex"|head -1`
fi
}
xta_path(){
XTR_PATH=`find /usr -name "innobackupex"|head -1`
}
#全备函数
FullBackup(){
#执行全备的命令
echo "开始执行全备........"
  ${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 "执行全备成功。"
    fi
}

#增备函数
IncBackup(){
echo "开始执行增备.........."
#在开始增备前,从全备总目录(/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 ${N
EW_INC_DIR} >/tmp/inc.log 2>&1
#判断 增备命令是否执行成功,如果执行不成功,退出程序。
    if [ $? -ne 0 ];then
      echo "Backup error.  Please check..." 
      exit        
    else
        echo '执行增备完成。'
    fi
fi
}
## 全量备份
   if [ "$1" == "full" ];then
   clear
   xtra_check
   xta_path
   FullBackup
   fi
## 增量备份
   if [ "$1" == "inc" ];then
        clear
        xtra_check
        xta_path
        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 xtra2.4.7_mysql5.7_2.0.sh