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