xtrabackup 参数详解及备份SHELL脚本

xtrabackup 是一个开源的MySQL热备份工具,它支持对InnoDB和XtraDB存储引擎进行非阻塞的备份。以下是一些常见的 xtrabackup 参数及其详细解释:

  • --backup:执行备份操作。这是进行备份时必须指定的参数。

  • --prepare:准备备份,用于在备份完成后对数据进行预处理,以便它可以用于恢复。对于增量备份,需要先准备完全备份,然后再准备增量备份。

  • --copy-back:将备份数据复制回原始数据库目录,用于恢复。

  • --incremental:指定备份是增量的,需要一个指向完整备份的目录作为基础。

  • --incremental-dir:在准备增量备份时,指定增量备份的目录。

  • --redo-only:在准备备份时使用,表示只应用重做日志(redo log),不回滚未提交的事务。

  • --apply-log-only:在准备备份时使用,表示只应用日志,不进行其他操作。

以下是一些其他的常用参数:

–print-defaults     输出mysql实例的参数配置信息

–defaults-file=#   仅从指定的配置文件读取参数

–target-dir=name 备份文件的目录

–apply-log-only    一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。 因此,此时数据 文件仍处理不一致状态。

–apply-log          它的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。

–use-memory= 备份的时候指定的内存,该选项表示和–apply-log选项一起使用, prepare 备份的时候,xtrabackup做crash recovery分配的内存大小,单位字节。也可(1MB,1M,1G,1GB),推荐1G。用于替代buffer_pool_size

–throttle=# 和–backup一起使用,指定每秒操作读写对的数量。

–log-copy-interval=# 日志复制线程完成的检查之间的时间间隔(以毫秒为单位,默认为1秒)。

–extra-lsndir=name 和–backup一起使用,在当前目录保存一份额外的xtrabackup_checkpoints文件

–to-archived-lsn=# 指定prepare备份时apply事务日志的LSN,只能和xtarbackup --prepare选项一起用。

–stream=name 该选项表示流式备份的格式,backup完成之后以指定格式到STDOUT,目前只支持tar(8.0版本仅支持)和xbstream

–compress[=name] 压缩所有输出数据,包括事务日志文件和元数据文件,通过指定的压缩算法, 目前唯一支持的算法是quicklz.结果文件是qpress归档格式, 每个xtrabackup创建的*.qp文件都可以通过qpress程序提取或者解压缩

–compress-threads= # 备份压缩的并行线程,默认为1.并行压缩(‘compress-threads’)可以和并行文件拷贝(‘parallel’)一起使用。 例如:’–parallel=4 --compress --compress-threads=2’会创建4个IO线程读取数据并通过管道传送给2个压缩线程。

–compress-chunk-size=# 压缩线程工作buffer的字节大小,默认是64K

–slave-info 该选项表示对slave进行备份的时候使用,打印出master的名字和binlog pos, 同样将这些信息以change master的命令写入xtrabackup_slave_info文件。可以通过基于这份备份启动一个从库。

–rsync 该选项表示通过rsync工具优化本地传输,当指定这个选项,innobackupex使用rsync拷贝非Innodb文件而替换cp,当有很多DB和表的时候会快很多,不能–stream一起使用。

–incremental-lsn=name 和–backup一起使用。

–incremental-basedir=name 和–backup一起使用,仅拷贝.ibd中新增的数据到指定路径,增量备份.


备份脚本

#!/bin/bash
# Date is the part of fullbakup directory 
Date=`date +%Y%m%d`
# Yesterday is used to check wether it get the full backup of the database yesterday
Yesterday=`date -d "yesterday" +%Y%m%d`
# BakDir is the base backup directory
BakDir=/data2/sxyhdb2/backup/dbbackup
WEEK_DAILY=`date +%a`
#RecordFile is to record 
RecordFile=/data2/sxyhdb2/backup/dbbackup/record.log
Logfile=/data2/sxyhdb2/backup/dbbackup/log_$Date.log
CompressDir=/data2/sxyhdb2/backup
extratimes=`date +%Y%m%d%H%M%S`
BAK_LEVEL=0
function backup ()
{
   fulldate=`tail -1 $RecordFile`
   newDate=all_$Date
   newDate1=$BakDir/$fulldate/$Date
   AllBakDir=$BakDir/all_$Yesterday/all_$Yesterday
   TodayDir=$BakDir/all_$Date/all_$Date
   bakYesterday=$BakDir/$fulldate/$Yesterday
   if [[ ! -s $RecordFile ]] 
      then
      # this is used to initalize the backup,if there is no context in the file ,it means that we can not do any backup for the database . so i'd better to make a full backup of the database
          echo fulltest1
          cd $BakDir
          mkdir all_$Date
          #/data2/sxyhdb2/bin/xtrabackup --defaults-file=/etc/my.cnf --no-timestamp --user sysadmin --password mysql $BakDir/all_$Date/all_$Date > $Logfile
          /data2/sxyhdb2/bin/xtrabackup --no-defaults --user=dbproxy --password=db1x@NJ+1 --socket=/data2/sxyhdb2/bin/mysql1.sock --backup --target-dir=$BakDir/all_$Date/all_$Date --parallel 2 --throttle 0 --datadir=/data2/sxyhdb2/data/data/ --rsync --ftwrl-wait-query-type=all --ftwrl-wait-timeout=180 -no-verion-check > $Logfile
          echo all_$Date >> $RecordFile
      elif [ $BAK_LEVEL -eq 0 ] && [[ ! -d $TodayDir ]]
        then 
       # this is used to make a full backup of database if the BAK_LEVEL is equal to 0.
           echo fulltest2
          cd $BakDir
          mkdir all_$Date
          /data2/sxyhdb2/bin/xtrabackup --no-defaults --user=dbproxy --password=db1x@NJ+1 --socket=/data2/sxyhdb2/bin/mysql1.sock --backup --target-dir=$BakDir/all_$Date/all_$Date --parallel 2 --throttle 0 --datadir=/data2/sxyhdb2/data/data/ --rsync --ftwrl-wait-query-type=all --ftwrl-wait-timeout=180 -no-verion-check > $Logfile
          echo all_$Date >> $RecordFile
      elif [ $BAK_LEVEL -eq 0 ] && [[  -d $TodayDir ]]
        then
         # if we do full backup first ,so we have to do incrment backups in one day.
         echo $fulldate test1
         #/data2/sxyhdb2/bin/xtrabackup --defaults-file=/etc/my.cnf --no-timestamp --user sysadmin --password mysql --incremental $BakDir/all_$Date/$fulldate_$extratimes --incremental-basedir=$TodayDir > $Logfile
         /data2/sxyhdb2/bin/xtrabackup --no-defaults --user=dbproxy --password=db1x@NJ+1 --socket=/data2/sxyhdb2/bin/mysql1.sock --backup --target-dir=$BakDir/all_$Date/$fulldate_$extratimes --incremental-basedir=$TodayDir --parallel 2 --throttle 0 --datadir=/data2/sxyhdb2/data/data/ --rsync --ftwrl-wait-query-type=all --ftwrl-wait-timeout=180 -no-verion-check > $Logfile
      elif [ $BAK_LEVEL -eq 1 ] && [[ ! -d $AllBakDir ]] && [[ ! -d $newDate1 ]] && [[ -d $bakYesterday ]]
           then
           # allbakDir is used to check wether we make full backup of the database yesterday , newDate1 means we make increamental backup of the database today , bakyesterday is used to check if we make increamental backup of database yseterday.
         echo $fulldate test2
         echo "/data2/sxyhdb2/bin/xtrabackup --no-defaults --user=dbproxy --password=db1x@NJ+1 --socket=/data2/sxyhdb2/bin/mysql1.sock --backup --target-dir=$BakDir/$fulldate/$Date --incremental-basedir=$BakDir/$fulldate/$Yesterday --parallel 2 --throttle 0 --datadir=/data2/sxyhdb2/data/data/ --rsync --ftwrl-wait-query-type=all --ftwrl-wait-timeout=180 -no-verion-check"
           #/data2/sxyhdb2/bin/xtrabackup --defaults-file=/etc/my.cnf --no-timestamp --user sysadmin  --password mysql --incremental $BakDir/$fulldate/$Date --incremental-basedir=$BakDir/$fulldate/$Yesterday > $Logfile
           /data2/sxyhdb2/bin/xtrabackup --no-defaults --user=dbproxy --password=db1x@NJ+1 --socket=/data2/sxyhdb2/bin/mysql1.sock --backup --target-dir=$BakDir/$fulldate/$Date --incremental-basedir=$BakDir/$fulldate/$Yesterday --parallel 2 --throttle 0 --datadir=/data2/sxyhdb2/data/data/ --rsync --ftwrl-wait-query-type=all --ftwrl-wait-timeout=180 -no-verion-check > $Logfile
      elif [ $BAK_LEVEL -eq 1 ] && [[ ! -d $AllBakDir ]] && [[  -d $newDate1 ]] && [[ -d $bakYesterday ]]
           then
           echo $fulldate test3
           #/data2/sxyhdb2/bin/xtrabackup --defaults-file=/etc/my.cnf --no-timestamp --user sysadmin  --password mysql --incremental $BakDir/$fulldate/$extratimes --incremental-basedir=$newDate1 > $Logfile
           /data2/sxyhdb2/bin/xtrabackup --no-defaults --user=dbproxy --password=db1x@NJ+1 --socket=/data2/sxyhdb2/bin/mysql1.sock --backup --target-dir=$BakDir/$fulldate/$extratimes --incremental-basedir=$newDate1 --parallel 2 --throttle 0 --datadir=/data2/sxyhdb2/data/data/ --rsync --ftwrl-wait-query-type=all --ftwrl-wait-timeout=180 -no-verion-check > $Logfile
      elif [ $BAK_LEVEL -eq 1 ] && [[  -d $AllBakDir ]] && [[ ! -d $newDate1 ]] 
            then
            echo $fulldate test4
            echo $newDate1
              #/data2/sxyhdb2/bin/xtrabackup --defaults-file=/etc/my.cnf --no-timestamp --user sysadmin  --password mysql --incremental $BakDir/$fulldate/$Date --incremental-basedir=$BakDir/$fulldate/$fulldate  > $Logfile 
              /data2/sxyhdb2/bin/xtrabackup --no-defaults --user=dbproxy --password=db1x@NJ+1 --socket=/data2/sxyhdb2/bin/mysql1.sock --backup --target-dir=$BakDir/$fulldate/$Date --incremental-basedir=$BakDir/$fulldate/$fulldate --parallel 2 --throttle 0 --datadir=/data2/sxyhdb2/data/data/ --rsync --ftwrl-wait-query-type=all --ftwrl-wait-timeout=180 -no-verion-check > $Logfile
      elif [ $BAK_LEVEL -eq 1 ] && [[  -d $AllBakDir ]] && [[  -d $newDate1 ]] 
            then
           echo $fulldate test5
           #/data2/sxyhdb2/bin/xtrabackup --defaults-file=/etc/my.cnf --no-timestamp --user sysadmin  --password mysql --incremental $BakDir/$fulldate/$extratimes --incremental-basedir=$newDate1 > $Logfile
           /data2/sxyhdb2/bin/xtrabackup --no-defaults --user=dbproxy --password=db1x@NJ+1 --socket=/data2/sxyhdb2/bin/mysql1.sock --backup --target-dir=$BakDir/$fulldate/$extratimes --incremental-basedir=$newDate1 --parallel 2 --throttle 0 --datadir=/data2/sxyhdb2/data/data/ --rsync --ftwrl-wait-query-type=all --ftwrl-wait-timeout=180 -no-verion-check > $Logfile
      elif [ $BAK_LEVEL -eq 1 ] && [[ ! -d $bakYesterday ]] && [[ ! -d $TodayDir ]] 
           then
           echo "nobakbup"
           echo "yesterday" $bakYesterday
           echo "today" $TodayDir
           cd $BakDir
           mkdir all_$Date
          #/data2/sxyhdb2/bin/xtrabackup --defaults-file=/etc/my.cnf --no-timestamp --user sysadmin --password mysql $BakDir/all_$Date/all_$Date > $Logfile
          /data2/sxyhdb2/bin/xtrabackup --no-defaults --user=dbproxy --password=db1x@NJ+1 --socket=/data2/sxyhdb2/bin/mysql1.sock --backup --target-dir=$BakDir/all_$Date/all_$Date --parallel 2 --throttle 0 --datadir=/data2/sxyhdb2/data/data/ --rsync --ftwrl-wait-query-type=all --ftwrl-wait-timeout=180 -no-verion-check > $Logfile
         echo all_$Date >> $RecordFile
      elif [ $BAK_LEVEL -eq 1 ] && [[ ! -d $bakYesterday ]] && [[ -d $TodayDir ]] 
          then 
          #/data2/sxyhdb2/bin/xtrabackup --defaults-file=/etc/my.cnf --no-timestamp --user sysadmin --password mysql --incremental $BakDir/all_$Date/$fulldate_$extratimes --incremental-basedir=$TodayDir > $Logfile
          /data2/sxyhdb2/bin/xtrabackup --no-defaults --user=dbproxy --password=db1x@NJ+1 --socket=/data2/sxyhdb2/bin/mysql1.sock --backup --target-dir=$BakDir/all_$Date/$fulldate_$extratimes --incremental-basedir=$TodayDir --parallel 2 --throttle 0 --datadir=/data2/sxyhdb2/data/data/ --rsync --ftwrl-wait-query-type=all --ftwrl-wait-timeout=180 -no-verion-check > $Logfile
      fi
}
function caseerror ()
{
    echo $Date the value in case is wrong >> $LogFile
}

function compressfile ()
{
    counter=`cat $RecordFile | wc -l`
    if [[ $counter -gt 1 ]]
       then
       li=`expr $counter - 1`
       dir=`sed -n "$li"p $RecordFile`
       echo $dir
       CompressFile="$CompressDir"/"$dir".tar.gz
       echo $CompressFile
       tar -czvf $CompressFile $BakDir/$dir
       rm -rf $BakDir/$dir
    else
       echo "there is no need to compress the backup file;"
    fi
}


case  "$WEEK_DAILY" in
       "Mon")
            BAK_LEVEL=1
            backup
            ;;
       "Tue")
            BAK_LEVEL=1
            backup
            ;;
       "Wed")
            BAK_LEVEL=1
            backup
            ;;
       "Thu")
            BAK_LEVEL=0
            backup
            compressfile
            ;;
       "Fri")
            BAK_LEVEL=1
            backup
            ;;
       "Sat")
            BAK_LEVEL=1
            backup
            ;;
       "Sun")
            BAK_LEVEL=0
            backup
            compressfile
            ;;
       "*")
            BAK_LEVEL=error
            caseerror
esac

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值