一些提醒
1.将二进制日志备份出来一份,生产环境中二进制日志切记不要和数据文件放在一起,
最好不要在同一分区甚至同一物理磁盘, 以免一旦玉石俱焚,悔之晚矣
2.多实例恢复,xtarbackup需要指定对应的my.cnf
3.可以加一个--no-timestamp参数不生产这个目录,直接备份到 /data/xtrabackup/下

一些基本概念
热备份:读写不受影响(mysqldump-->innodb)
温备份:仅可以执行读操作(mysqldump-->myisam)
冷备份:离线备份,读写都不可用
逻辑备份:将数据导出文本文件中(mysqldump)
物理备份:将数据文件拷贝(xtrabackup、mysqlhotcopy)
完整备份:备份所有数据
增量备份:仅备份上次完整备份或增量备份以来变化的数据
差异备份:仅备份上次完整备份以来变化的数据

包下载
https://www.percona.com/downloads/XtraBackup/LATEST/
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.1/binary/redhat/6/x86_64/Percona-XtraBackup-2.4.1-ra2dc9d4-el6-x86_64-bundle.tar
yum -y install perl-DBD-MySQL libaio
http://rpmfind.net/linux/rpm2html/search.php?query=libev.so.4%28%29%2864bit%29&submit=Search+...&system=&arch=
wget ftp://rpmfind.net/linux/epel/6/x86_64/libev-4.03-3.el6.x86_64.rpm
rpm -ivh libev-4.03-3.el6.x86_64.rpm
rpm -ivh percona-xtrabackup-24-2.4.1-1.el6.x86_64.rpm

GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT ON *.* TO 'bkuser'@'localhost' IDENTIFIED BY 'bkuser%#@qwe9423';

#innobackupex --user=bkuser --password=bkuser%#@qwe9423 /home/back/
innobackupex --user=bkuser --password=bkuser%#@qwe9423 --socket=/opt/3306/mysql.sock /home/back/
来看下/home/back/2016-07-22_15-29-21的文件
1.cat xtrabackup_checkpoints 
backup_type = full-backuped   #注明这是全备
from_lsn = 0                  #全备的lsn起始号
to_lsn = 26646811250          #全备记录到的最大序列号
last_lsn = 26646811259        #全备完成后当前的日志序列号
compact = 0                   #注明没有进行打包
recover_binlog_info = 0
2.cat xtrabackup_binlog_info
mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置
mysql-bin.000575	18111189
3.backup-my.cnf 备份命令用到的配置选项信息和备份无关的不会记录,备份配置文件的话需要单独备份
# This MySQL options file was generated by innobackupex.

# The MySQL server
[mysqld]
innodb_checksum_algorithm=innodb
innodb_log_checksum_algorithm=strict_crc32
innodb_data_file_path=ibdata1:10M:autoextend
innodb_log_files_in_group=3
innodb_log_file_size=536870912
innodb_fast_checksum=false
innodb_page_size=16384
innodb_log_block_size=512
innodb_undo_directory=.
innodb_undo_tablespaces=0

redo_log_version=1

4.xtrabackup_info —— 记录了mariadb的版本信息和一些属性信息,还原是检测版本匹配度时用到
uuid = 09f8d7c3-4fde-11e6-88b7-0050569d54ac
name = 
tool_name = innobackupex
tool_command = --user=bkuser --password=... --socket=/opt/3306/mysql.sock /home/back/
tool_version = 2.4.1
ibbackup_version = 2.4.1
server_version = 5.7.10-log
start_time = 2016-07-22 15:29:21
end_time = 2016-07-22 15:29:35
lock_time = 0
binlog_pos = filename 'mysql-bin.000575', position '18111189'
innodb_from_lsn = 0
innodb_to_lsn = 26646811250
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N

5.cat xtrabackup_binlog_info
mysql-bin.000575	18111189

到从机,恢复
innobackupex --socket=/opt/3306/mysql.sock --apply-log /home/back/2016-07-22_15-29-21/

innobackupex --socket=/opt/3306/mysql.sock --copy-back /home/back/2016-07-22_15-29-21/

stop mysql server
mv /opt/3306/data /opt/3306/data.old
mkdir -p /opt/3306/data
chown -R mysql.mysql /opt/3306/data
start mysql server

简单的全备完成


2.

增量
CREATE DATABASE db1;
CREATE TABLE `tb1` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `Name` varchar(30) NOT NULL,   `Gender` enum('F','M','O') NOT NULL,   PRIMARY KEY (`id`) );
INSERT INTO tb1 (Name,Gender) VALUES ('Tom','M'),('Jerry','F');

innobackupex --user=bkuser --password=bkuser%#@qwe9423 --socket=/opt/3306/mysql.sock --incremental /home/back/ --incremental-basedir=/home/back/2016-07-22_15-29-21/

恢复

innobackupex --socket=/opt/3306/mysql.sock --apply-log --redo-only /home/back/2016-07-22_15-29-21/
innobackupex --socket=/opt/3306/mysql.sock --apply-log /home/back/2016-07-22_15-29-21/ --incremental-dir /home/back/2016-07-22_16-21-23/
innobackupex --socket=/opt/3306/mysql.sock --copy-back /home/back/2016-07-22_15-29-21/

参考
使用xtrabackup对mariadb数据库进行增量备份以及恢复
http://xianglinhu.blog.51cto.com/5787032/1702391

MySQL备份的常用3个工具(Mysqldump lvm_snapshot xtrabackup
http://sysbo.blog.51cto.com/823152/1291889

MySQL备份与恢复常用方法总结(mysqldump/xtrabackup/lvm快照备份/逻辑备份与恢复/二进制日志及时点恢复)
http://junwang.blog.51cto.com/5050337/1437365

3.自动备份和自动恢复脚本

参考 http://ocpyang.blog.51cto.com/3401739/1631027  2015-04-10 17:55:41

back.sh

#backup.sh
#!/bin/sh
#on xtrabackup 2.2.8
# 第一次执行它的时候它会检查是否有完全备份,否则先创建一个全库备份
# 当你再次运行它的时候,它会根据脚本中的设定来基于之前的全备或增量备份进行增量备份
#ocpyang@126.com
if [ -f /root/.bash_profile ];then
source /root/.bash_profile
fi

INNOBACKUPEX_PATH=innobackupex  #INNOBACKUPEX的命令
INNOBACKUPEXFULL=/usr/bin/$INNOBACKUPEX_PATH  #INNOBACKUPEX的命令路径

#mysql目标服务器以及用户名和密码
MYSQL_CMD="--host=localhost --user=bkuser --password=bkuser%#@qwe9423 --port=3306"  

MYSQL_UP=" --user=bkuser --password=bkuser%#@qwe9423 --port=3306"  #mysqladmin的用户名和密码

TMPLOG="/tmp/innobackupex.$$.log"

MY_CNF=/opt/3306/my.cnf #mysql的配置文件

MYSQL=/opt/mysql/bin/mysql

MYSQL_ADMIN=/opt/mysql/bin/mysqladmin

BACKUP_DIR=/home/data # 备份的主目录

FULLBACKUP_DIR=$BACKUP_DIR/full # 全库备份的目录

INCRBACKUP_DIR=$BACKUP_DIR/incre # 增量备份的目录

FULLBACKUP_INTERVAL=86400 # 全库备份的间隔周期,时间:秒

KEEP_FULLBACKUP=1 # 至少保留几个全库备份

logfiledate=backup.`date +%Y%m%d%H%M`.txt

#开始时间
STARTED_TIME=`date +%s`



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

# 显示错误并退出

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

error()
{
    echo "$1" 1>&2
    exit 1
}

 

# 检查执行环境

if [ ! -x $INNOBACKUPEXFULL ]; then
  error "$INNOBACKUPEXFULL未安装或未链接到/usr/bin."
fi



if [ ! -d $BACKUP_DIR ]; then
  error "备份目标文件夹:$BACKUP_DIR不存在."
fi



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

if [ "$mysql_status" != "Yes" ];then
    error "MySQL 没有启动运行."
fi



 

if ! `echo 'exit' | $MYSQL -s $MYSQL_CMD` ; then
 error "提供的数据库用户名或密码不正确!"
fi

 

# 备份的头部信息

echo "----------------------------"
echo
echo "$0: MySQL备份脚本"
echo "开始于: `date +%F' '%T' '%w`"
echo

echo "开始于: `date +%F' '%T' '%w`" >/home/back/$logfiledate
 

#新建全备和差异备份的目录

mkdir -p $FULLBACKUP_DIR
mkdir -p $INCRBACKUP_DIR



#查找最新的完全备份,last的完全备份
LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`

 

# 查找最近修改的最新备份时间

LATEST_FULL_BACKUP_CREATED_TIME=`stat -c %Y $FULLBACKUP_DIR/$LATEST_FULL_BACKUP`


#如果全备有效进行增量备份否则执行完全备份
if [ "$LATEST_FULL_BACKUP" -a `expr $LATEST_FULL_BACKUP_CREATED_TIME + $FULLBACKUP_INTERVAL + 5` -ge $STARTED_TIME ] ; then
	# 如果最新的全备未过期则以最新的全备文件名命名在增量备份目录下新建目录
	echo -e "完全备份$LATEST_FULL_BACKUP未过期,将根据$LATEST_FULL_BACKUP名字作为增量备份基础目录名"
	echo "					   "
	NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUP
	mkdir -p $NEW_INCRDIR

	# 查找最新的增量备份是否存在.指定一个备份的路径作为增量备份的基础
	LATEST_INCR_BACKUP=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n"  | sort -nr | head -1`
		if [ ! $LATEST_INCR_BACKUP ] ; then
			INCRBASEDIR=$FULLBACKUP_DIR/$LATEST_FULL_BACKUP
			echo -e "增量备份将以$INCRBASEDIR作为备份基础目录"
			echo "					   "
		else
			INCRBASEDIR=$INCRBACKUP_DIR/${LATEST_FULL_BACKUP}/${LATEST_INCR_BACKUP}
			echo -e "增量备份将以$INCRBASEDIR作为备份基础目录"
			echo "					   "
		fi

	echo "使用$INCRBASEDIR作为基础本次增量备份的基础目录."
	$INNOBACKUPEXFULL --defaults-file=$MY_CNF --use-memory=4G $MYSQL_CMD --incremental $NEW_INCRDIR --incremental-basedir $INCRBASEDIR > $TMPLOG 2>&1

	#保留一份备份的详细日志

	cat $TMPLOG>>/home/back/$logfiledate

	if [ -z "`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`" ] ; then
	 echo "$INNOBACKUPEX命令执行失败:"; echo
	 echo -e "---------- $INNOBACKUPEX_PATH错误 ----------"
	 cat $TMPLOG
	 rm -f $TMPLOG
	 exit 1
	fi

	THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPLOG`
	rm -f $TMPLOG


	echo -n "数据库成功备份到:$THISBACKUP"
	echo

	# 提示应该保留的备份文件起点

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

	NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUP

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

	RES_FULL_BACKUP=${FULLBACKUP_DIR}/${LATEST_FULL_BACKUP}

	RES_INCRE_BACKUP=`dirname ${INCRBACKUP_DIR}/${LATEST_FULL_BACKUP}/${LATEST_INCR_BACKUP}`

	echo
	echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色
	echo -e "必须保留$KEEP_FULLBACKUP份全备即全备${RES_FULL_BACKUP}和${RES_INCRE_BACKUP}目录中所有增量备份."
	echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色
	echo



else
	echo  "*********************************"
	echo -e "正在执行全新的完全备份...请稍等..."
	echo  "*********************************"
	$INNOBACKUPEXFULL --defaults-file=$MY_CNF  --use-memory=4G  $MYSQL_CMD $FULLBACKUP_DIR > $TMPLOG 2>&1 
	#保留一份备份的详细日志

	cat $TMPLOG>/home/back/$logfiledate


	if [ -z "`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`" ] ; then
	 echo "$INNOBACKUPEX命令执行失败:"; echo
	 echo -e "---------- $INNOBACKUPEX_PATH错误 ----------"
	 cat $TMPLOG
	 rm -f $TMPLOG
	 exit 1
	fi

	 
	THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPLOG`
	rm -f $TMPLOG

	echo -n "数据库成功备份到:$THISBACKUP"
	echo

	# 提示应该保留的备份文件起点

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

	RES_FULL_BACKUP=${FULLBACKUP_DIR}/${LATEST_FULL_BACKUP}

	echo
	echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色
	echo -e "无增量备份,必须保留$KEEP_FULLBACKUP份全备即全备${RES_FULL_BACKUP}."
	echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色
	echo

fi






#删除过期的全备

echo -e "find expire backup file...........waiting........."
echo -e "寻找过期的全备文件并删除">>/home/back/$logfiledate
for efile in $(/usr/bin/find $FULLBACKUP_DIR/ -mtime +6)
do
	if [ -d ${efile} ]; then
	rm -rf "${efile}"
	echo -e "删除过期全备文件:${efile}" >>/home/back/$logfiledate
	elif [ -f ${efile} ]; then
	rm -rf "${efile}"
	echo -e "删除过期全备文件:${efile}" >>/home/back/$logfiledate
	fi;
	
done

if [ $? -eq "0" ];then
   echo
   echo -e "未找到可以删除的过期全备文件"
fi



echo
echo "完成于: `date +%F' '%T' '%w`"
echo "完成于: `date +%F' '%T' '%w`" >/home/back/$logfiledate
exit 0

restore.sh

删除data目录数据

使用方法

sh restore.sh full/2017-11-08_19-57-03

sh restore.sh incre/2017-11-08_21-54-06


#!/bin/sh
#
# 使用方法:
# ./restore.sh /增量备份父目录
#ocpyang@126.com

#NOTE:恢复开始前请确保mysql服务停止以及数据和日志目录清空,如
# rm -rf /usr/local/mysql/innodb_data/*
# rm -rf /usr/local/mysql/data/*
# rm -rf /usr/local/mysql/mysql_logs/innodb_log/*
INNOBACKUPEX=innobackupex
INNOBACKUPEX_PATH=/usr/bin/$INNOBACKUPEX
TMP_LOG="/var/log/restore.$$.log"
MY_CNF=/opt/3306/my.cnf
BACKUP_DIR=/home/back # 你的备份主目录
FULLBACKUP_DIR=$BACKUP_DIR/full # 全库备份的目录
INCRBACKUP_DIR=$BACKUP_DIR/incre # 增量备份的目录
MEMORY=2048M # 还原的时候使用的内存限制数
ERRORLOG=`grep -i "^log-error" $MY_CNF |cut -d = -f 2`
MYSQLD_SAFE=/opt/mysql/bin/mysqld_safe
MYSQL_PORT=3306

mysqlcnf="/opt/3306/my.cnf"
mysqldatadir=`grep -i "^datadir" $mysqlcnf |cut -d = -f 2`
mv ${mysqldatadir} ${mysqldatadir}.$DATE


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

#显示错误

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

error()
{
    echo "$1" 1>&2
    exit 1
}

  

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

# 检查innobackupex错误输出

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

check_innobackupex_fail()
{
    if [ -z "`tail -2 $TMP_LOG | grep 'completed OK!'`" ] ; then
    echo "$INNOBACKUPEX命令执行失败:"; echo
    echo "---------- $INNOBACKUPEX的错误输出 ----------"
    cat $TMP_LOG
    #保留一份备份的详细日志
    logfiledate=restore.`date +%Y%m%d%H%M`.txt
    cat $TMP_LOG>/backup/$logfiledate  
    rm -f $TMP_LOG
    exit 1
  fi
}

 



# 选项检测
if [ ! -x $INNOBACKUPEX_PATH ]; then
  error "$INNOBACKUPEX_PATH在指定路径不存在,请确认是否安装或核实链接是否正确."
fi

  

if [ ! -d $BACKUP_DIR ]; then
  error "备份目录$BACKUP_DIR不存在.请新建备份主目录$BACKUP_DIR"
fi

  

if [ $# != 1 ] ; then
  error "使用方法: $0 使用还原目录的绝对路径"
fi

  

if [ ! -d $1 ]; then
  error "指定的备份目录:$1不存在."
fi



PORTNUM00=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`
if [ $PORTNUM00 = 1  ];
then
echo -e "\e[31m NOTE:------------------------------------------.\e[m" #红色
echo -e "\e[31m mysql处于运行状态,请关闭mysql. \e[m" #红色
echo -e "\e[31m NOTE:------------------------------------------.\e[m" #红色
exit 0
fi

################判断还原增量备份部分还是所有################
ipname=''
read -p "输入截止增量备份名[默认所有]:" ipname
echo  
echo "输入截止增量备份名为:$ipname"


input_value=$1
intpu_res=`echo ${input_value%/*}` 



# Some info output
echo "----------------------------"
echo
echo "$0: MySQL还原脚本"
START_RESTORE_TIME=`date +%F' '%T' '%w`
echo "数据库还原开始于: $START_RESTORE_TIME"
echo





#PARENT_DIR=`dirname ${intpu_res}`
PARENT_DIR=${intpu_res}

if [ $PARENT_DIR = $FULLBACKUP_DIR ]; then
   FULL=`ls -t $FULLBACKUP_DIR |head -1`
   FULLBACKUP=${intpu_res}/$FULL
   echo "还原完全备份:`basename $FULLBACKUP`"
   echo
else

################判断还原增量备份部分还是所有################
   if [ "$ipname" = '' ];then
      if [ $PARENT_DIR = $INCRBACKUP_DIR ]; then
         FULL=`ls -t $FULLBACKUP_DIR |head -1`
         FULLBACKUP=$FULLBACKUP_DIR/$FULL
      if [ ! -d $FULLBACKUP ]; then
      error "全备:$FULLBACKUP不存在."
      fi
      INCR=`ls -t $INCRBACKUP_DIR/$FULL/ |sort -nr | head -1 ` #查找最后一个增量备份文件
      echo "还原将从全备全备$FULL开始,到增量$INCR结束."
      echo
      echo "Prepare:完整备份..........."
      echo "*****************************"
      $INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
      check_innobackupex_fail
   

      # Prepare增量备份集,即将增量备份应用到全备目录中,按照增量备份顺序即按照时间从旧到最新
      for i in `find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n `;
      do

      #判断最新全备的lsn
      #check_full_file=`find $FULLBACKUP/ -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head  -1`
         
      check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
         
      fetch_full_lastlsn=`grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2`

      ######判断增量备份中第一个增量备份的LSN
      #check_incre_file=`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n |  head -1`
           
      check_incre_lastlsn=$PARENT_DIR/$FULL/$i/xtrabackup_checkpoints
           
      fetch_incre_lastlsn=`grep -i "^last_lsn" ${check_incre_lastlsn} |cut -d = -f 2`
      echo "完全备份$FULLBACKUP的LSN值:${fetch_full_lastlsn} "
      echo "增量备份$i的LSN值:${fetch_incre_lastlsn} "

      if [ "${fetch_incre_lastlsn}" -eq "${fetch_full_lastlsn}" ];then
      echo "*****************************************"
      echo "LSN相等,不需要prepare!"
      echo "*****************************************"
      echo
      break
      else
      echo "Prepare:增量备份集$i........"
      echo "*****************************"
      $INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP --incremental-dir=$PARENT_DIR/$FULL/$i > $TMP_LOG 2>&1
      check_innobackupex_fail
 
      if [ $INCR = $i ]; then
      break
      fi
      fi 
      ######判断LSN
      done

      else
      error "未知的备份类型"
      fi

  else
    FULL=`ls -t $FULLBACKUP_DIR |head -1`
    FULLBACKUP=$FULLBACKUP_DIR/$FULL
    echo "Prepare:完整备份..........."
    echo "*****************************"
    $INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
    check_innobackupex_fail



    ipt=`stat -c=%Z  $PARENT_DIR/$FULL/$ipname |cut -d = -f 2`
    echo "还原的指定增量目录文件$ipname的纪元时间为:$ipt"
    for i in `find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n `;
    do
    f01=`stat -c=%Z  $PARENT_DIR/$FULL/$i |cut -d = -f 2`
    if [ "$f01" -le "$ipt" ]; then

    if [ $PARENT_DIR = $INCRBACKUP_DIR ]; then
    if [ ! -d $FULLBACKUP ]; then
    error "全备:$FULLBACKUP不存在."
    fi 
    #INCR=`ls -t $INCRBACKUP_DIR/$FULL/ |sort -nr | head -1`
    echo "还原将从全备$FULL开始,到增量$ipname结束."
    echo

#判断最新全备的lsn
#check_full_file=`find $FULLBACKUP/ -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head  -1`
   
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
   
fetch_full_lastlsn=`grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2`

######判断增量备份中第一个增量备份的LSN
check_incre_file=`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n |  head -1`
     
check_incre_lastlsn=$PARENT_DIR/$FULL/$i/xtrabackup_checkpoints
     
fetch_incre_lastlsn=`grep -i "^last_lsn" ${check_incre_lastlsn} |cut -d = -f 2`
echo "完全备份的LSN:${fetch_full_lastlsn} "
echo "增量备份的LSN:${fetch_incre_lastlsn} "
if [ "${fetch_incre_lastlsn}" -eq "${fetch_full_lastlsn}" ];then
echo "*****************************************"
echo "LSN不需要prepare!"
echo "*****************************************"
echo
break
else 
echo "Prepare:增量备份集$i........"
echo "*****************************"
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP --incremental-dir=$PARENT_DIR/$FULL/$i > $TMP_LOG 2>&1
check_innobackupex_fail

fi 

######判断LSN
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
   
fetch_full_lastlsn=`grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2`
echo "完全备份当前的LSN:${fetch_full_lastlsn}"

else
error "未知的备份类型"
fi
else 
echo "查找增量备份文件完成."
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints	   
fetch_full_lastlsn=`grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2`
echo -e "\e[31m -------------------------------------------- \e[m" #红色
echo -e "\e[31m 完全备份最终的LSN:${fetch_full_lastlsn} \e[m" #红色
echo -e "\e[31m -------------------------------------------- \e[m" #红色
break
fi
done

fi
#################判断还原增量备份部分还是所有################


fi


echo 
echo "prepare:完整备份以及回滚那些未提交的事务..........."
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_fail


echo "*****************************"
echo "数据库还原中 ...请稍等"
echo "*****************************"

$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --copy-back $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_fail

  
rm -f $TMP_LOG
echo "1.恭喜,还原成功!."
echo "*****************************"


#修改目录权限
DATE=`date +%Y%m%d%H%M`
echo "修改mysql目录的权限."
mysqlcnf="/opt/3306/my.cnf"
mysqldatadir=`grep -i "^datadir" $mysqlcnf |cut -d = -f 2`
#mv ${mysqldatadir} ${mysqldatadir}.$DATE
`echo 'chown -R mysql:mysql' ${mysqldatadir}`
echo "2.权限修改成功!"
echo "*****************************"


#自动启动mysql

INIT_NUM=1
if [ ! -x $MYSQLD_SAFE ]; then
  echo "mysql安装时启动文件未安装到$MYSQLD_SAFE或无执行权限"
  exit 1  #0是执行成功,1是执行不成功
else
echo "启动本机mysql端口为:$MYSQL_PORT的服务"
/bin/bash /opt/3306/mysql.server start
#$MYSQLD_SAFE --defaults-file=$MY_CNF  > /dev/null &
while  [ $INIT_NUM  -le 8 ]
     	do
        PORTNUM=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`
        echo "mysql启动中....请稍等..."
        sleep 5
        if [ $PORTNUM = 1  ];
        then
echo -e "\e[32m mysql                                      ****启动成功**** \e[m"
        exit 0
        fi
        INIT_NUM=$(($INIT_NUM +1))
     	done
echo -e "\e[31m mysql启动失败或启动时间过长,请检查错误日志 `echo 'cat ' ${ERRORLOG}` \e[m"
echo "*****************************************"
exit 0
fi




END_RESTORE_TIME=`date +%F' '%T' '%w`
echo "数据库还原完成于: $END_RESTORE_TIME"
exit 0


先看下备份结构

full/2017-11-08_19-57-03   全备

incre/2017-11-08_19-57-03/2017-11-08_20-02-01  第一次备份

incre/2017-11-08_19-57-03/2017-11-08_20-39-10  第一次备份

incre/2017-11-08_21-54-06  第二次备份

注意:备份应用后xtrabackup_checkpoints对比

cat xtrabackup_checkpoints 

backup_type = full-backuped        #注明这是全备

from_lsn = 0                  #全备的lsn起始号

to_lsn = 2026561686             #全备记录到的最大序列号

last_lsn = 2026562643           #全备完成后当前的日志序列号

compact = 0                  #注明没有进行打包


src源

cat /home/data/full/2017-11-08_19-57-03/xtrabackup_checkpoints

backup_type = full-backuped

from_lsn = 0

to_lsn = 84164411759

last_lsn = 84164411768

compact = 0

recover_binlog_info = 0


应用后

dest目的

cat /home/data/full/2017-11-08_19-57-03/xtrabackup_checkpoints

backup_type = log-applied

from_lsn = 0

to_lsn = 84165335908

last_lsn = 84165335917

compact = 0

recover_binlog_info = 0


来看看具体的手动还原过程


还原
full/2017-11-08_19-57-03
incre/2017-11-08_19-57-03/2017-11-08_20-02-01
incre/2017-11-08_19-57-03/2017-11-08_20-39-10
incre/2017-11-08_21-54-06


基础还原
/usr/bin/innobackupex --defaults-file=/opt/3306/my.cnf --apply-log --redo-only --use-memory=2048M /home/data/full/2017-11-08_19-57-03

第一次增量还原
/usr/bin/innobackupex --defaults-file=/opt/3306/my.cnf --apply-log --redo-only --use-memory=2048M /home/data/full/2017-11-08_19-57-03 --incremental-dir=/home/data/incre/2017-11-08_19-57-03/2017-11-08_20-02-01
/usr/bin/innobackupex --defaults-file=/opt/3306/my.cnf --apply-log --redo-only --use-memory=2048M /home/data/full/2017-11-08_19-57-03 --incremental-dir=/home/data/incre/2017-11-08_19-57-03/2017-11-08_20-39-10


第二次增量还原
/usr/bin/innobackupex --defaults-file=/opt/3306/my.cnf --apply-log --redo-only --use-memory=2048M /home/data/full/2017-11-08_19-57-03 --incremental-dir=/home/data/incre/2017-11-08_21-54-06


最后的操作
--apply-log    回滚日志 
--redo-only    回滚合并
/usr/bin/innobackupex --defaults-file=/opt/3306/my.cnf --apply-log --use-memory=2048M /home/data/full/2017-11-08_19-57-03
/usr/bin/innobackupex --defaults-file=/opt/3306/my.cnf --copy-back /home/data/full/2017-11-08_19-57-03