percona-xtrabackup 只能对本地mysql数据库进行备份,故需与被备份数据mysql安装在同一台主机上。
由于该软件只会备份数据,不会备份log_bin日志,但会显示当前备份的位置,故如用备份恢复,将需重新配置数据库 主从/主主同步。

安装包

percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz: 

官网下载地址:
https://www.percona.com/downloads/XtraBackup/LATEST/

软件安装
# 解压即安装
cd /data/
tar -zxvf percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz
全量备份
# 创建全量备份存储文件夹
mkdir -p /data/mysql_backup/full/
# 开始备份,生成全量备份文件夹在/data/backup/2018-10-19_03-40-04/
/data/percona-xtrabackup-2.4.9-Linux-x86_64/bin/innobackupex --defaults-file=/etc/my.cnf --user=root --password=***** /data/mysql_backup/full/
# 从以上命令的日志中获取同步位置,例如如下显示为  bin_log.000002' '428234578'

MySQL binlog position: filename 'bin_log.000002', position '428234578'

180918 14:55:51 [00] Writing backup-my.cnf
180918 14:55:51 [00]        ...done
180918 14:55:51 [00] Writing xtrabackup_info
180918 14:55:51 [00]        ...done
xtrabackup: Transaction log of lsn (1068407093) to (1068407102) was copied.
180918 14:55:51 completed OK!
增量备份
# 创建增量备份文件夹
mkdir -p /data/mysql_backup/increment/
# --incremental表示增量备份,--incremental-basedir配置为以哪个备份为基础,可以全量为基础,也可以增量为基础。本次生成增量备份文件在:/data/mysql_backup/increment/2018-10-19_06-02-42/
innobackupex  --user=root --password=***** --incremental --incremental-basedir=/data/mysql_backup/full/2018-10-19_03-40-04/ /data/mysql_backup/increment/
恢复
# 恢复前,需先停止数据库
service mysql stop

# 恢复全量备份
# 将原mysql数据文件夹改名,该路径在/etc/my.cnf datadir中有定义,以下假设原数据目录为/data/mysql/data/
mv /data/mysql/data/ /data/mysql/data_20181019
mkdir -p /data/mysql/data/
# 让备份文件夹准备恢复(同步已经提交的事务及回滚未提交的事务至数据文件)
innobackupex --defaults-file=/etc/my.cnf --user=root --password=*****  --apply-log --use-memory=4G /data/mysql_backup/full/2018-10-19_03-40-04/
# 开始恢复
innobackupex --defaults-file=/etc/my.cnf --user=root --password=*****  --copy-back /data/mysql_backup/full/2018-10-19_03-40-04/
# 修改权限
chown -R mysql:mysql /data/mysql/data/



# 全量+增量恢复。需执行以下命令,将增备数据全部恢复到全备文件夹中,以下假设有两次增备
# 1.让全备文件夹同步已经提交的事务至数据文件
innobackupex --apply-log --redo-only /data/mysql_backup/full/2018-10-19_03-40-04/
# 2.让增备1同步已经提交的事务至全备数据文件(--redo-only:合并已提交事务,不合并回滚事务,避免增备之间数据无法衔接)
innobackupex --apply-log --redo-only /data/mysql_backup/full/2018-10-19_03-40-04/ --incremental-dir=/data/mysql_backup/increment/2018-10-19_06-02-42/
# 3.让增备2同步已经提交的事务及回滚未提交的事务至全备数据文件,注意最后次增量不需加 --redo-only 参数
innobackupex --apply-log /data/mysql_backup/full/2018-10-19_03-40-04/ --incremental-dir=/data/mysql_backup/increment/2018-10-20_08-00-00/
# 此时该全备文件夹已包含所有增量备份数据,依次按以上全备恢复命令,可恢复数据。
启动数据库,检查数据是否OK
service mysql start
附备份脚本
#!/bin/sh
##### ###### ###### ###### ###### ###### ###### #
# 1、每7天一次全备,每天一次增量
# 2、备份保留60天
##### ###### ###### ###### ###### ###### ###### #    

export PATH=$PATH:/percona/bin
INNOBACKUPEX_CMD=/percona/bin/innobackupex
MYSQL_CMD="--host=127.0.0.1 --user=root --password='********' --port=3306" 
MYSQL_UP="--user=root --password='********' --port=3306 --host=127.0.0.1"
TMPLOG="/mysql_bak/backup/innobackupex.$$.log"
MY_CNF=/etc/my.cnf

BACKUP_DIR=/mysql_bak/backup
FULLBACKUP_DIR=$BACKUP_DIR/full
INCRBACKUP_DIR=$BACKUP_DIR/incre

FULLBACKUP_INTERVAL=604800
KEEP_FULLBACKUP=4

logfile=/mysql_bak/backup/logs/backup.`date +%Y%m%d%H%M`.log
STARTED_TIME=`date +%s`

echo "----------------------------"
echo "开始备份于: `date +%F' '%T' '%w`"

mkdir -p $FULLBACKUP_DIR
mkdir -p $INCRBACKUP_DIR
mkdir -p /mysql_bak/backup/logs

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 | sort -nr | head -1`
    if [ ! $LATEST_INCR_BACKUP ] ; then
        INCRBASEDIR=$FULLBACKUP_DIR/$LATEST_FULL_BACKUP
        echo -e "增量备份将以$INCRBASEDIR作为备份基础"
        echo "        "
    else
        INCRBASEDIR=$LATEST_INCR_BACKUP
        echo -e "增量备份将以$INCRBASEDIR作为备份基础"
        echo "        "
    fi

    echo "使用$INCRBASEDIR作为基础做新的增量备份."

    $INNOBACKUPEX_CMD --defaults-file=$MY_CNF --use-memory=8G  $MYSQL_CMD --incremental $NEW_INCRDIR --incremental-basedir $INCRBASEDIR > $TMPLOG 2>&1
else
    echo  "*********************************"
    echo -e "正在执行全新的完全备份...请稍等..."
    echo  "*********************************"
    $INNOBACKUPEX_CMD --defaults-file=$MY_CNF --use-memory=8G  $MYSQL_CMD $FULLBACKUP_DIR > $TMPLOG 2>&1

fi
cat $TMPLOG > $logfile
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"

LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
echo -e "必须保留$KEEP_FULLBACKUP份全备和全备$LATEST_FULL_BACKUP以后的所有增量备份."

echo -e "寻找过期的全量备份文件并删除">>$logfile
for efile in $(/usr/bin/find $FULLBACKUP_DIR/ -mtime +60)
do
    if [ -d $efile ]; then
        rm -rf $efile
        echo -e "删除过期全量备份文件:$efile" >>$logfile
    elif [ -f $efile ]; then
        rm -rf $file
        echo -e "删除过期全量备份文件:$efile" >>$logfile
    fi;
done

echo -e "寻找过期的增量备份文件并删除">>$logfile
for efile in $(/usr/bin/find $INCRBACKUP_DIR/ -mtime +60)
do
    if [ -d $efile ]; then
        rm -rf $efile
        echo -e "删除过期增量备份文件:$efile" >>$logfile
    elif [ -f $efile ]; then
        rm -rf $file
        echo -e "删除过期增量备份文件:$efile" >>$logfile
    fi;
done

echo "完成于: `date +%F' '%T' '%w`"
exit 0