mysql备份脚本

这个脚本调用的是innobackupex备份mysql,可以自己设置全备的保留策略,保留策略内的全备和增量备份都放在同一个目录TAGXXXX下,分别为full_XXX和inc_XXX目录,自定义retention变量,超过retention的备份将新建一个TAGXXXX目录,此脚本相比网上的流传的那个更方便,通过简单的修改还能实现基于秒基本的增量复制~~
#!/bin/bash
#set -x

# Usage will be helpful when you need to input the valid arguments.
function usage()
{
cat <<EOF
Usage: $0 [configure-options]
  -?, --help                Show this help message.
  --backup-dir=<>           Set backup directory
  --defaults-file=[]        Set mysql configuration file directory
  --host=<>                 Set mysql host
  --port=<>                 Set mysql port
  --user=<>                 Set mysql user name
  --password=<>             Set mysql user password
EOF
}

# Get the key value of input arguments format like '--args=value'.
function get_key_value()
{
    echo "$1" | sed 's/^--[a-zA-Z_-]*=//'
}
 
# Parse the input arguments and get the value of the input argument. 
function parse_options()
{
  while test $# -gt 0
  do
    case "$1" in
    --backup-dir=*)
      backupDir=`get_key_value "$1"`;;
    --defaults-file=*)
      defaultFile=`get_key_value "$1"`;;
    --host=*)
      Host=`get_key_value "$1"`;;
    --port=*)
      mysqlPort=`get_key_value "$1"`;;
    --user=*)
      mysqlUser=`get_key_value "$1"`;;
    --password=*)
      mysqlPassword=`get_key_value "$1"`;;
    -? | --help )
      usage
      exit 0;;
    *)
      echo "Unknown option '$1'"
      exit 1;;
    esac
    shift
  done
}
 
#main

if [ $# -eq 0 ];then
      usage
      exit 0;
fi

# Call the parse_options function to parse the input arguments and initialisze env.
parse_options "$@"

#week day
TIMESTAMP=`date +%Y%m%d%H%M%S`
TIMEDAY=`date +%Y%m%d`
TIMEFULL=`date +%s`

#directory structer
BACK_HOME=${backupDir}/backup
LOGDIR=${BACK_HOME}/log
TAGDIR=${BACK_HOME}/TAG${TIMEDAY}
CMD=/usr/local/percona-xtrabackup-2.3.2-Linux-x86_64/bin/innobackupex
LOGFILE=${LOGDIR}/backup_${TIMESTAMP}.log
CURRENTFILE=${BACK_HOME}/currentfile
RETENTION=3


if [ ! -d "$BACK_HOME" ]; then
    mkdir -p $BACK_HOME
fi
 
if [ ! -f "$defaultFile" ]; then
    defaultFile=/etc/my.cnf
fi

if [ ! -d "${LOGDIR}" ]; then
    mkdir -p ${LOGDIR}
fi

if [ ! -f "$CURRENTFILE" ]; then
    touch $CURRENTFILE
fi 

echo "Start innobackup at `date`."               >>${LOGFILE} 
echo "Current defaults file is : ${defaultFile}" >>${LOGFILE}
echo "Current host is : ${Host}"                 >>${LOGFILE}
echo "Current port is : ${mysqlPort}"            >>${LOGFILE}   
echo "Current mysql user is : ${mysqlUser}"      >>${LOGFILE}    
echo "Current password is : ${mysqlPassword}"   
echo "Current log directory is : ${LOGDIR}"      >>${LOGFILE}
echo "Current log file is : ${LOGFILE}"          >>${LOGFILE}
 
# Define backup function for full and incremental backup type.
function back_full()
{

if [ ! -d "${TAGDIR}" ]; then
    mkdir -p ${TAGDIR}
fi

#create tagdir
echo $TAGDIR,$TIMEFULL > ${BACK_HOME}/currentfile
CHECKPOINTFILE=`cat ${BACK_HOME}/currentfile|awk -F, '{print $1}'`/checkpoint

if [ ! -f "${CHECKPOINTFILE}" ]; then
    touch ${CHECKPOINTFILE}
fi

echo "$CMD --defaults-file=$defaultFile --user=$mysqlUser --password=$mysqlPassword  \
      --no-timestamp $TAGDIR/full_${TIMESTAMP} \
     " >> ${LOGFILE}
     
$CMD --defaults-file=$defaultFile --user=$mysqlUser --password=$mysqlPassword  \
--no-timestamp $TAGDIR/full_${TIMESTAMP} 2>> ${LOGFILE}

grep last_lsn $TAGDIR/full_${TIMESTAMP}/xtrabackup_checkpoints|cut -b 12- > ${CHECKPOINTFILE}
echo "Current last lsn is : `grep last_lsn $TAGDIR/full_${TIMESTAMP}/xtrabackup_checkpoints|cut -b 12-`
" >>${LOGFILE}
   
}
 
function back_inc()
{
CURRENTDIR=`cat ${BACK_HOME}/currentfile |awk -F, '{print $1}'`
CHECKPOINTFILE=$CURRENTDIR/checkpoint
echo "$CMD --defaults-file=$defaultFile --user=$mysqlUser --password=$mysqlPassword \
      --no-timestamp --incremental  --incremental-lsn=`cat ${CHECKPOINTFILE}` ${CURRENTDIR}/inc_${TIMESTAMP} 
      "  >> ${LOGFILE}
 
$CMD --defaults-file=$defaultFile --user=$mysqlUser --password=$mysqlPassword \
  --no-timestamp --incremental --incremental-lsn=`cat ${CHECKPOINTFILE}` ${CURRENTDIR}/inc_${TIMESTAMP} 2>> ${LOGFILE}

grep last_lsn ${CURRENTDIR}/inc_${TIMESTAMP}/xtrabackup_checkpoints|cut -b 12- >${CHECKPOINTFILE}    
  echo "Current last lsn is : `grep last_lsn ${CURRENTDIR}/inc_${TIMESTAMP}/xtrabackup_checkpoints|cut -b 12-`
  " >>${LOGFILE}
}

FULLDAY=`cat ${CURRENTFILE}|awk -F, '{print $2}'`

if  [ ! -z "${FULLDAY}" ]
then
DAYMIS=`expr  $TIMEFULL - $FULLDAY`
DAYALL=`expr $DAYMIS / 86400`
fi

if  [ -z "${FULLDAY}" ] 
then   
back_full
elif [ "${DAYALL}" -ge "$RETENTION" ]
then
back_full
else
back_inc
fi


例如:

[root@mysql1 test2]# ./1.sh --backup-dir=/data --defaults-file=/usr/local/mysql/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=root 
备份完成后在/data/backup目录下为备份目录
[root@mysql1 backup]# ls
currentfile  log  TAG20151109  TAG20151113  TAG20151120
每个TAG打头的目录里面都有一个完整的全备和N个增量备份,当执行的时间超过保留的策略的时候,会新建一个TAGXXXX目录存放新的全备和增量备份,log里面存放的是所有的备份日志。
[root@mysql1 backup]# ls -l
total 20
-rw-r--r-- 1 root root   36 Nov 20 00:07 currentfile
drwxr-xr-x 2 root root 4096 Nov 20 00:07 log
drwxr-xr-x 5 root root 4096 Nov 13 00:00 TAG20151109
drwxr-xr-x 4 root root 4096 Nov 13 00:01 TAG20151113
drwxr-xr-x 5 root root 4096 Nov 20 00:07 TAG20151120




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值