xtra2.4.7_mysql5.7_3.0.sh

软件: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 再登录,生效
########################################
#!/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
check_backdir(){
#判断全备总目录是否存在,不存在就创建。
if [ ! -d ${BAK_FULL_DIR} ];then
mkdir -p ${BAK_FULL_DIR}
echo '全备目录创建完成。'
fi
#判断增备总目录是否存在,不存在就创建。
if [ ! -d ${BAK_INC_DIR} ]; then
mkdir -p ${BAK_INC_DIR}
echo '增备目录创建完成。'
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
}
check_mysql(){
PSMYSQL0=`ps -ef |grep mysqld |grep -v grep | wc -l`
if [ $PSMYSQL0 -ge 1 ]; then
echo 'mysql 已启动。'
else
echo 'mysql 没有安装或者没有启动。'
exit
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 "开始执行增备.........."
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
echo "没有全备......"
echo "系统会先执行一次全备............"
#执行全备
FullBackup
echo "请手动运行,重新执行增备。"
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 "Backup error. Please check..."
exit
else
echo '执行增备完成. '
fi
fi
}
## 全量备份
if [ "$1" == "full" ];then
clear
check_mysql
check_backdir 
xtra_check
xta_path
FullBackup
fi
## 增量备份
if [ "$1" == "inc" ];then
clear
check_mysql
check_backdir
xtra_check
xta_path
IncBackup
fi
## 删除3天前的备份
find $BAK_FULL_DIR -name "$(date -d '3 days ago' +'%F')_*" | xargs rm -rf
find $BAK_INC_DIR -name "$(date -d '3 days ago' +'%F')_*" | xargs rm -rf