您的位置:首页 > 其它

Xtrabackup的安装使用,自动化备份脚本

2018-01-04 11:26 716 查看
XtraBackup是Percona公司的开源项目,用以实现类似Innodb官方的热备份工具InnoDB Hot Backup的功能,它支持在线热备份(备份时不影响数据读写)。到目前为止,最新的版本为Percona XtraBackup 2.4.7.

XtraBackup有很多功能和优点:例如支持全备、增量备份、部分备份;支持压缩备份;备份不影响数据读写、事务等,但是也有缺陷不足:例如不支持脱机备份、不支持直接备份到磁带设备、不支持Cloud Back,MyISAM的备份也会阻塞。不过这些小瑕疵不影响XtraBackup成为一款流行的MySQL备份工具。另外,请注意XtraBackup只支持Linux平台,不支持Windows平台。

一.  安装

参考链接:http://www.cnblogs.com/kerrycode/p/6933024.html

 

#下载对应软件包

cd /usr/local/src/

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/tarball/percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz 
 

#解压并重命名

tar -zxvf percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz -C /usr/local

cd .. &&  mv percona-xtrabackup-2.4.9-Linux-x86_64/   xtrabackup

 

#设置环境变量并生效

echo "export PATH=\$PATH:/usr/local/xtrabackup/bin" >> /etc/profile

source /etc/profile

 

 

二.  使用说明

参考链接:https://www.cnblogs.com/zhoujinyi/p/5893333.html

             

                      

三.  自动化压缩备份脚本

#!/bin/bash

#innobackupex 增量备份脚本

##################################################################################

 

 

 

BACKUP_DATE=$(date +%Y-%m-%d_%H_%M_%S)

BACKUP_DIR=/data/mysql/backup

FULLBACKUP_PATH=$BACKUP_DIR/full

INCRBACKUP_PATH=$BACKUP_DIR/incr

BACKUP_LOG_PATH=$BACKUP_DIR/logs

BACKUP_KEEP_DAY=7

MYSQL_CONF=/etc/my.cnf

INNOBACKUPEX=/usr/local/xtrabackup/bin/innobackupex

MYSQL_CMD=/usr/bin/mysql

MYSQL_CONNECT="--host=****--user=**** --password=**** --port=3306"

MAIL_FROM="root@`hostname`"

MAIL_TO="linge@hz-health.cn"

MAIL_TO_ERROR="linge@hz-health.cn"

 

error()

{

 echo "$1" 1>&2

 exit 1

}

 

#before the backup, check the system enviroment setting and mysql status and so on

mysql_backup_check()

{

 

    if [ ! -d $FULLBACKUP_PATH ];then

        mkdir -p $FULLBACKUP_PATH

    fi

 

    if [ ! -d $INCRBACKUP_PATH ];then

        mkdir -p $INCRBACKUP_PATH

    fi

 

    if [ ! -d $BACKUP_LOG_PATH ];then

        mkdir -p $BACKUP_LOG_PATH

    fi

 

 

    if [ ! -x $INNOBACKUPEX ];then

       error "$INNOBACKUPEX did not exists"

    fi

 

    if [ ! -x $MYSQL_CMD ];then

       error "mysql client did not exists!"

    fi

 

     mysql_status=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:3306/) {print "Yes";exit 0}}'`

 

        if [ "$mysql_status" != "Yes" ];then

          error "MySQL did not start. please check it"

        fi

 

        if ! `echo 'exit' | $MYSQL_CMD -s $MYSQL_CONNECT` ; then

         error "please check the user and password is correct!"

        fi

}

 

 

xtra_backup()

{

  if [ $# = 2 ];then

        $INNOBACKUPEX --defaults-file=$MYSQL_CONF $MYSQL_CONNECT  --compress --compress-threads=8 --databases="yjk  yjk_mall_2_0" --no-timestamp  $1/full_$BACKUP_DATE>$2 2>&1

  elif [ $# = 3 ];then

        $INNOBACKUPEX  --defaults-file=$MYSQL_CONF $MYSQL_CONNECT --compress --compress-threads=8 --databases="yjk  yjk_mall_2_0" --no-timestamp --incremental  $1/incr_$BACKUP_DATE  --incremental-basedir $2 >$3 2>&1

  else

      error "the parameter is not correct"

  fi

}

 

 

lastest_fullback_dir()

{

    if [ -d $1 ]; then

        path=`ls -t $1 |head -n 1`

        if [  $path ]; then

            echo $path

        else

            error "lastest_fullback_dir(): 目录为空,没有最新目录"

        fi

    else

        error "lastest_fullback_dir(): 目录不存在或者不是目录"

    fi

}

 

 

mysql_full_backup()

{

    xtra_backup  $FULLBACKUP_PATH $BACKUP_LOG_PATH/full_$BACKUP_DATE.log

 

    if [ "${PIPESTATUS[0]}" -ne 0 ]; then

        (echo "Subject: MySQL Backup Failed: MySQL Backup failed on `hostname`";

      cat ${BACKUP_LOG_PATH}/full_${BACKUP_DATE}.log;

    ) | /usr/sbin/sendmail -O NoRecipientAction=add-to -f${MAIL_FROM} ${MAIL_TO}

    else

      (echo "Subject: MySQL Backup Success: MySQL Backup Succeed on `hostname`";

      cat ${BACKUP_LOG_PATH}/full_${BACKUP_DATE}.log;

    ) | /usr/sbin/sendmail -O NoRecipientAction=add-to -f${MAIL_FROM} ${MAIL_TO}

    fi

 

 

    #cd $FULLBACKUP_PATH

 

    #ls -t | tail -n +$BACKUP_KEEP_DAY | xargs rm -rf

    find ${FULLBACKUP_PATH}  -mtime +$BACKUP_KEEP_DAY -name "*" -exec rm -rf {} \;

}

 

mysql_incr_backup()

{

 

  LATEST_FULL_BACKUP=`find $FULLBACKUP_PATH -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`

 

  LATEST_FULL_BACKUP_TIME=`stat -c %Y $FULLBACKUP_PATH/$LATEST_FULL_BACKUP`

 

  if [ $LATEST_FULL_BACKUP ];then

        #不是第一次增量备份,以最新的增量备份目录为base_dir

        xtra_backup $INCRBACKUP_PATH  $FULLBACKUP_PATH/`lastest_fullback_dir $FULLBACKUP_PATH`  $BACKUP_LOG_PATH/incr_$BACKUP_DATE.log

  else

        # the first incremental backup need do full backup first

         xtra_backup $FULLBACKUP_PATH  $BACKUP_LOG_PATH/full_$BACKUP_DATE.log

 

         if [ "${PIPESTATUS[0]}" -ne 0 ]; then

                        (echo "Subject: MySQL Backup Failed: MySQL Backup failed on `hostname`";

                   cat ${BACKUP_LOG_PATH}/incr_${BACKUP_DATE}.log;

                    ) | /usr/sbin/sendmail -O NoRecipientAction=add-to -f${MAIL_FROM} ${MAIL_TO}

            fi

  fi

 

  #cd ${INCRBACKUP_PATH}

  #ls -t | tail -n +$BACKUP_KEEP_DAY | xargs rm -rf

  find ${INCRBACKUP_PATH}  -mtime +$BACKUP_KEEP_DAY -name "*" -exec rm -rf {} \;

 

}

 

 

 

case $1 in

 

       full)

          mysql_backup_check

          mysql_full_backup

          ;;

 

        incr)

          mysql_backup_check

          mysql_incr_backup

          ;;

 

         *)

          echo "full backup"

          echo "incr backup"

          ;;

esac

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: