频道栏目
首页 > 网络 > 其他 > 正文
基于XtraBackup的备份有效性检查脚本
2017-04-20 10:34:00           
收藏   我要投稿

基于XtraBackup的备份有效性检查脚本:生产环境的MySQL是通过crontab的方式,定时调度热备脚本备份数据。目前是通过XtraBackup软件实现热备。关于热备脚本方面,请查看我原先的博客《使用shell实现mysql自动全备、增备&日志备份》:https://linzhijian.blog.51cto.com/1047212/1891745 ,这里不再展开说明。

备份存放:通过XtraBackup的流式备份,将备份异地存放到备份服务器上。

备份策略:周日热备,周一到周六增备。

目前缺漏:这些备份数据未能实现有效性检查,无法探知这些备份是否具有可用性,需要通过一定的机制实现有效性检测。

目前在备份机的备份文件列表如下:

drwxr-xr-x18mysqlmysql4096Apr903:28mysql01_20170409_023001_full
drwxr-xr-x18mysqlmysql4096Apr1003:25mysql01_20170410_023001_incr
drwxr-xr-x18mysqlmysql4096Apr1103:26mysql01_20170411_023001_incr
drwxr-xr-x18mysqlmysql4096Apr1203:25mysql01_20170412_023001_incr
drwxr-xr-x18mysqlmysql4096Apr1303:26mysql01_20170413_023001_incr
drwxr-xr-x18mysqlmysql4096Apr1403:26mysql01_20170414_023001_incr
drwxr-xr-x18mysqlmysql4096Apr1503:27mysql01_20170415_023001_incr
drwxr-xr-x18mysqlmysql4096Apr1603:29mysql01_20170416_023001_full
drwxr-xr-x18mysqlmysql4096Apr1703:26mysql01_20170417_023001_incr
其中full结尾的说明当天是全备的,incr结尾的说明当天是增备的。

脚本实现逻辑:自动恢复全备数据,并依次恢复其余的增备数据到全备数据中,最后将恢复完毕的全备数据用mysqld拉起来,检查MySQL的错误日志是否有异常报错来判断恢复是否正常。

vim mysql_recover.sh

#!/bin/sh

hostname=$1
week=`date+%w`##获取当天是周几。
time1=`date+%s`
timestamp=`date+%Y%m%d%H%M%S`
logdir="/home/mysql/log/mysqlrecoverlog/$hostname/"
dir="/mysqlbackup/databak/$hostname/"
fullname="$dir/full_backup_file.txt"##记录全备的路径名
incrname="$dir/incr_backup_file.txt"##记录当天要恢复的增备的路径名
today=`date+%Y%m%d`
datadir="/mysqlbackup/mysql_test/$hostname/data"
n1="1"##周几做热备,周一到周六为1~6,周日为0。
n2="6"##周几最后一次增备,周一到周六为1~6,周日为0。


###getdir()函数是获取脚本运行当天的热备文件的路径名,并做校验(一天一个备份文件)###
functiongetdir()
{
if[$week-eq"$n1"]
then
fulldir=`find/mysqlbackup/databak/${hostname}/-typed-name"*${today}*full"`
if[!-n"$fulldir"]
then
echo"thefulldirnotexist!!!">>$logdir/recover_${timestamp}.log
exit1
fi
num=`find/mysqlbackup/databak/${hostname}/-typed-name"*${today}*full"|wc-l`
if[$num-eq"1"]
then
echo$fulldir>$fullname
else
echo"therearenotonlyfulldbbackupin$today,pleasecheck!!!">>$logdir/recover_${timestamp}.log
exit1
fi

else
incrdir=`find/mysqlbackup/databak/${hostname}/-typed-name"*${today}*incr"`
if[!-n"$incrdir"]
then
echo"theincrdirnotexist!!!">>$logdir/recover_${timestamp}.log
fi
num=`find/mysqlbackup/databak/${hostname}/-typed-name"*${today}*incr"|wc-l`
if[$num-eq"1"]
then
echo$incrdir>$incrname
else
echo"therearenotonlyincrdbbackupin$today,pleasecheck!!!">>$logdir/recover_${timestamp}.log
exit1
fi
fi
}


##由于采用流式备份,备份文件需要先行解压。umcompress函数就是解压函数####

functionuncompress()
{
dir=$1
/usr/bin/innobackupex--decompress--parallel=8$dir>>$logdir/uncompress_${timestamp}.log2>&1
success_flag=`cat$logdir/uncompress_${dir}_${timestamp}.log|grep"completedOK"`
if[-nsuccess_flag]
then
echo"$dirdecompresssucessfully!">>$logdir/recover_${timestamp}.log
else
echo"$dirdecompressfailed">>$logdir/recover_${timestamp}.log
exit1
fi
}


###恢复全量备份函数##

functionfull_recover()
{
fullbakdir=$1
uncompress$fullbakdir
/usr/bin/innobackupex--use-memory=2G--apply-log--redo-only$fullbakdir>>$logdir/full_recover_${timestamp}.log2>&1
success_flag=`cat$logdir/full_recover_${timestamp}.log|grep"innobackupex:completedOK"`
#failed_flag=`cat$logdir/full_recover_${timestamp}.log|grep"xtrabackup:error:"`
if[-n"$success_flag"]
then
echo"thefulldbbackup$fullbakdirrecoveryissuccess!">>$logdir/recover_${timestamp}.log
else
echo"thefulldbbackup$fullbakdrirecoveryisfail!">>$logdir/recover_${timestamp}.log
exit1
fi
}


###恢复增量备份函数###
functionincr_recover()
{
incrbakdir=$1
fullbakdir=$2
uncompress$incrbakdir
uncompress$fullbakdir
if[$week-ne"$n2"]
then
/usr/bin/innobackupex--use-memory=2G--apply-log--redo-only--incremental-dir=$incrbakdir$fullbakdir>>$logdir/incr_recover_${timestamp}.log2>&1
else
/usr/bin/innobackupex--use-memory=2G--apply-log--incremental-dir=$incrbakdir$fullbakdir>>$logdir/incr_recover_${timestamp}.log2>&1
fi
#/usr/bin/innobackupex--use-memory=2G--apply-log--redo-only--incremental-dir=$incrbakdir$fullbakdir>>$logdir/incr_recover_${timestamp}.log2>&1
success_flag=`cat$logdir/incr_recover_${timestamp}.log|grep"innobackupex:completedOK"`
#failed_flag=`cat$logdir/incr_recover_${timestamp}.log|grep"xtrabackup:error:"`
if[-n"$success_flag"]
then
echo"theincrdbbackup$fullbakdirrecoveryissuccess!">>$logdir/recover_${timestamp}.log
else
echo"theincrdbbackup$fullbakdrirecoveryisfail!">>$logdir/recover_${timestamp}.log
exit1
fi
}

getdir

if[$week-eq"$n1"]
then
full=`cat$fullname`
full_recover$full
else
incr=`cat$incrname`
full=`cat$fullname`
incr_recover$incr$full
fi

time2=`date+%s`
times=$((${time2}-${time1}))
echo"ittakes$timessecondstofinishtherecover!!!">>$logdir/recover_${timestamp}.log

由于目前备份机没有安装MySQL服务,故脚本目前暂未实现通过mysqld启动服务,检查错误日志以验证数据的可用性。这个功能毕竟比较简单,这里就由读者去实现吧。

点击复制链接 与好友分享!回本站首页
上一篇:使用JConsole监控
下一篇:VMware vSphere 5/6 创建共享磁盘
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站