参考网上的资料和根据自己服务器的mysql多实例实际情况,搞了一个基于innobackupex备份工具的mysql全量备份和增量备份脚本,暂定版本V1.0,后续还有很多需要改进和优化的。思路和方式很多,这里目前用做学习练习用,以后会改善脚本和功能实现。
该脚本基本可以实现需要的功能,但不够简洁和智能,代码过于臃肿。
#!/bin/bash
# innobackupex mysql full and incr
#author:21yunwei
#version:V1.0
BACKTIME=`date +%Y%m%d%H%M%S`
BACK_DIR=/home/mysqlbak
FULLBACKUP_DIR=/home/mysqlbak/full/
INCRBACKUP_DIR=/home/mysqlbak/incr/
MYSQL=/usr/local/mysql/bin/mysql
MYSQLADMIN=/usr/local/mysql/bin/mysqladmin
MYSQL_UP=`mysqladmin -uroot -photmail.com -S /data/mysql_3306/mysql_3306.sock status | grep Uptime`
MYSQL_CNF=/data/test/mysql3306.cnf
MYSQl_CMD=`mysql -uroot -pxxxxxx -S /data/mysql_3306/mysql_3306.sock`
#INDEXFILE=/home/mysqlbak/full/index
OPRATE_LOGFILE=/home/mysqlbak/mysqlbak.log
LOGFILE=/home/mysqlbak/mysqlbak.log
INNOBACKUPEX=/usr/bin/innobackupex
INNOBACK_taillog=/home/mysqlbak/innobackupex.log
FULLBACK_INTERVAL=604800
STARTED_TIME=`date +%s`
if [ $MYSQL_UP -ne 0 ]
then
echo "Mysql is down,please check"
exit 1
fi
if [ ! -d $BACK_DIR ]
then
echo "$BACK_DIR is not exists,creating"
/bin/mkdir -p $BACK_DIR
fi
if [ ! -d $FULLBACKUP_DIR ]
then
echo "$FULLBACKUP_DIR is not exists,creating"
/bin/mkdir -p $FULLBACKUP_DIR
fi
if [ ! -d $INCRBACKUP_DIR ]
then
echo "INCRBACKUP_DIR is $INCRBACKUP_DIR"
/bin/mkdir -p $INCRBACKUP_DIR
fi
if [ ! -f $LOGFILE ]
then
echo "$LOGFILE is not exists,creating "
touch $LOGFILE
fi
if [ ! -f $INDEXFILE ]
then
echo "$INDEXFILE is not exists,creating "
touch $INDEXFILE
fi
echo "----------------------------"
echo
echo "$0: MySQL备份脚本"
echo "备份开始于: $BAKTIME "
echo
echo "----------------------------"
#find latest full and give latest value
LATEST_FULL_BACK=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
#find last full and get mtime
LATEST_FULL_BACK_CREATED_TIME=`stat -c %Y $FULLBACKUP_DIR/$LATEST_FULL_BACK`
#judge full or not ,then decide to make full or incr
if [ "$LATEST_FULL_BACK" -a `expr $LATEST_FULL_BACK_CREATED_TIME + $FULLBACK_INTERVAL` -ge $STARTED_TIME ]
then
echo -e "完全备份$LATEST_FULL_BACK未过期,将根据$LATEST_FULL_BACK名字作为增量备份目录命名"
echo " "
NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACK
/home/mysqlbak/incr/2016-06-13_15-07-31
mkdir -p $NEW_INCRDIR
LATEST_INCR_BACK=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d | sort -nr | head -1` #获取最新增量备份目录名
if [ ! $LATEST_INCR_BACK ]
then
INCRBASEDIR=$FULLBACK_DIR/$LATEST_FULL_BACK #定义增量基础备份目录名$INCRBASEDIR,还没有做增量目录情况下。
INCRBASEDIR=/home/mysqlbak/full/2016-06-13_15-07-31
echo -e "增量备份将以$INCRBASEDIR作为备份基础"
echo " "
else
INCRBASEDIR=$LATEST_INCR_BACK #定义增量基础备份目录名$INCRBASEDIR,已经存在增量目录情况下。
echo -e "增量备份将以$INCRBASEDIR作为备份基础"
echo " "
fi
echo "使用$INCRBASEDIR作为基础做新的增量备份."
$INNOBACKUPEX --defaults-file=$MYSQL_CNF $MYSQL_CMD --incremental-basedir=$INCRBASEDIR --incremental $NEW_INCRDIR > $INNOBACK_taillog 2>&1
if [$? -eq 0 ]
then
echo "incremental back sucess."
else
echo "incremental back error,please check."
fi
else
echo "*********************************"
echo -e "Do new full bakup,please wait..."
echo "*********************************"
$INNOBACKUPEX --defaults-file=$MYSQL_CNF $MYSQL_CMD --compress $FULLBACKUP_DIR > $INNOBACK_taillog 2>&1
if [$? -eq 0 ]
then
echo "full back sucess."
else
echo "full back error,please check."
fi
fi
echo -e "find expired file and delete:">>$OPRATE_LOGFILE
for expire_full_file in $(/usr/bin/find $FULLBACK_DIR/ -mtime +7)
do
if [ -d $expire_full_file ]
then
rm -rf $expire_full_file
echo -e "delete full expired dir:$expire_full_file" >>$OPRATE_LOGFILE
elif [ -f $expire_full_file ]
then
rm -rf $expire_full_file
echo -e "delete full expired file:$expire_full_file" >>$OPRATE_LOGFILE
fi
done
for expire_incr_file in $(/usr/bin/find $INCRBACKUP_DIR/ -mtime +7)
do
if [ -d $expire_incr_file ]
then
rm -rf $expire_incr_file
echo -e "delete incr expired dir:$expire_incr_file" >>$OPRATE_LOGFILE
elif [ -f $expire_incr_file ]
then
rm -rf $expire_incr_file
echo -e "delete incr expired file:$expire_incr_file" >>$OPRATE_LOGFILE
fi
done
tree $BACK_DIR
echo "Mysql 3306 full and incr backup finished." >>$OPRATE_LOGFILE
后期会进行更为智能和高效方式进行实现。请期待 V 2.0、V3.0 。。。。V N.0.该脚本是之前测试用的,线上的脚本没有拿出来。思想是一样的,只是目录统一了具体变量。可以自己优化。
转载请注明:西数超哥博客www.ysidc.top» 基于innobackupex备份工具的mysql全量备份和增量备份shell脚本
https://www.ysidc.top 西数超哥博客,数据库,西数超哥,虚拟主机,域名注册,域名,云服务器,云主机,云建站,ysidc.top








