innobackupex安装完成后可以直接使用,默认的安装路径为/usr/bin/innobackupex.
以下所有操作在root用户下进行
为方便理解脚本,先介绍一下全备份和增量备份语句.
全备份:
innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 $BACK_DIR
增量备份:
innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --incremental $BACK_DIR --incremental-basedir=$FULLBACKUP
解释一下:增量备份的基础是全量备份,第二次增量备份以第一次增量备份为基础,这一点可以查看生成的备份文件加下的xtrabackup_checkpoints文件做验证.
全量备份xtrabackup_checkpoints文件内容:
backup_type = full-backuped
from_lsn = 0
to_lsn = 3847017
last_lsn = 3847026
compact = 0
recover_binlog_info = 0
第一次增量备份xtrabackup_checkpoints文件内容:
backup_type = incremental
from_lsn = 3847017
to_lsn = 3847017
last_lsn = 3847026
compact = 0
recover_binlog_info = 0
第二次增量备份xtrabackup_checkpoints文件内容:
backup_type = incremental
from_lsn = 3847017
to_lsn = 3848936
last_lsn = 3848945
compact = 0
recover_binlog_info = 0
其中三个文件backup_type,from_lsn,to_lsn这三个参数的区别及含义显而易见,不做解释了.很多仁兄的博客里对这个都有介绍.
上备份脚本:
#!/bin/bash
LANG=C
GTIME=`date +%Y-%m-%d`
DIR_TIME=innoback-`date +%Y-%m-%d`
BACK_DIR=/home/zxy/data/$DIR_TIME
INNOBACK="/usr/bin/innobackupex"
if [ ! -d $BACK_DIR ]
then
mkdir -p $BACK_DIR
cd $BACK_DIR
$INNOBACK --defaults-file=/etc/mysql/my.cnf --user=root --password=123 $BACK_DIR
elif [ -d $BACK_DIR ]
then
cd $BACK_DIR
FULLBACKUP=`ls -1 | grep $GTIME | sort -k 1r | awk 'NR==1{print $1}'`
if [ -d ${FULLBACKUP:-nodir} ]
then
$INNOBACK --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --incremental $BACK_DIR --incremental-basedir=$FULLBACKUP
else
$INNOBACK --defaults-file=/etc/mysql/my.cnf --user=root --password=123 $BACK_DIR &> /dev/null
fi
fi
其中:ls -1 | grep $GTIME | sort -k 1r | awk 'NR==1{print $1}
做一下解释.
ls -1 : 官方给出的注解为 list one file per line.
sort -k 1r : sort 为shell的排序函数,-k 1r : 设置排序方式,1标识第一个区块,默认为升序 r为降序.如果不加后面”-k 1r”参数,该脚本就是差量备份脚本.
awk ‘NR==1{print $1} NR==1 定位在file的第一行.
print $1 显示第一列内容
增量备份:备份自上一次备份以来(增量或完全)以来变化的数据; 特点: 节约空间、还原麻烦 .
差异备份:备份自上一次完全备份以来变化的数据 特点: 浪费空间、还原比增量备份简单.
当然,有脚本的话,备份的还原都不麻烦,所以为了节约空间,还是选择增量备份吧.
先上脚本:
#!/bin/bash
LANG=C
INNOBACK="/usr/bin/innobackupex"
echo 'please input date format: 2017-10-10'
read TIME
BACK_DIR=/home/zxy/data/innoback-$TIME
echo $BACK_DIR
if [[ ! -d $BACK_DIR ]]; then
echo 'warning-----The format must be correct and make sure that the corresponding folder for that date exists'
exit
fi
cd $BACK_DIR
FULLBACKUP=`ls -1 | grep $TIME | sort | awk 'NR==1{print $1}'`
echo $FULLBACKUP
files=`ls -1 | grep $TIME | sort`
for var in $files
do
if [[ $FULLBACKUP == $var ]]; then
echo "quanbeifen"
echo $BACK_DIR/$var
$INNOBACK --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --apply-log --redo-only $BACK_DIR/$FULLBACKUP
else
echo "zeengliang--"$var
echo $BACK_DIR/$var
$INNOBACK --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --apply-log --redo-only $BACK_DIR/$FULLBACKUP --incremental-dir=$BACK_DIR/$var
fi
done
#Data rollback
service mysql stop
echo "=========================================service mysql stop================================="
mv /var/lib/mysql /var/lib/mysql_bak
mkdir -p /var/lib/mysql
$INNOBACK --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --apply-log $BACK_DIR/$FULLBACKUP
$INNOBACK --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --copy-back $BACK_DIR/$FULLBACKUP
chown -R mysql.mysql /var/lib/mysql
service mysql start
echo "========================================service mysql start==================================="
echo "rollback end success"
增量备份的还原,是先将增量备份文件整合到全量备份文件中.再对全量备份文件进行还原操作.
具体参数含义,本着互利共赢的原则,我参考了以下两篇博客:
http://blog.csdn.net/rudygao/article/details/50435041
http://blog.51yip.com/mysql/1650.html
这些内容,前人已经写了,我就不再费劲了.
至于备份的脚本如何作为定时任务执行,简单写一下吧:
创建work.cron 文件,内容为:
* */1 * * * /home/zxy/data/innobackex.sh
那五个”* “的含义 :分 时 日 月 周.
执行命令:
crontab work.cron
即可每小时进行一次增量备份.
该脚本每天第一次备份为全量备份,之后为增量备份.
增量备份及还原脚本到此结束,如有异议,请评论商讨.