软件: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