脚本内容如下
说明: 本次备份设计为, 一周一次全量备份,6次增量备份
#!/bin/bash
#此脚本为mariadb备份脚本
#定义日志文件路径
log="/var/log/mariabackup.log"
#定义备份数据存放目录
bdir="/var/db/back"
#定义历史备份的打包路径
tdir="/var/db/tback"
#定义备份使用的命令
xbk="/usr/bin/mariabackup"
#定义备份使用的用户
user="root"
pass="123456"
#定义当前详细时间
DATE=`date +%Y-%m%d-%H%M`
#定义函数计算当前时间是周几,便于后面的判断执行,根据每天的日期对备份数据的命名,和备份方式进行选择
get_week()
{
date=`date +%Y%m%d`
year=`expr substr $date 1 4`
month=`expr substr $date 5 2`
day=`expr substr $date 7 2`
b=`cal $month $year|wc -l`
b=`expr $b - 1`
week_day=`cal $month $year |awk '{for(i=1;i<=NF;i++){if($i=='$day'){if (NR=='$b'-1){print i-1}else{print 7-NF+i-1}}}}'`
echo $week_day
}
#定义完全备份函数
fullback_func () {
echo "-------------------------- ${DATE} ----------------------------" >> ${log}
#前一天时间
ede=`date -d "-1 day" +%Y-%m%d-%H%M`
#定义一个合并上周数据的function
merge () {
${xbk} --prepare --target-dir=${bdir}/${FULLBACK_NAME}
for x in $(ls -1 -t -r ${bdir})
do
if [ $x -eq ${FULLBACK_NAME} ] ; then
continue
fi
${xbk} --prepare --target-dir=${bdir}/${FULLBACK_NAME} --incremental-dir=${bdir}/${x} || echo "合并$x 发生错误" >>${log}
done
}
#备份之前打包上周的备份数据
if [ -d ${bdir}/${FULLBACK_NAME} ] ; then
merge &>/dev/null && echo "${DATE} 合并上周数据完成" >>${log}
if [ ! -d ${tdir} ] ; then
mkdir -p ${tdir}
fi
tar -zcf ${tdir}/${ede}.tar.gz ${bdir}/${FULLBACK_NAME}
rm -rf ${bdir}/*
fi
#创建备份目录进行全量备份
mkdir -p ${bdir}
$xbk --backup --target-dir=${bdir}/${FULLBACK_NAME} --user=${user} --password=${pass} && echo "进行一次完整备份 -- 周${DATE_WEEK}" >>${log}
echo "-------------------------- ${DATE} ----------------------------" >> ${log}
}
#定义增量备份函数
incrback_func () {
echo "************************ ${DATE} **************************" >> ${log}
if [ -d ${bdir}/${LUBACK_NAME} ] ; then
${xbk} --backup --target-dir=${bdir}/${CUBACK_NAME} --incremental-basedir=${bdir}/${LABACK_NAME} --user=${user} --password=${pass} && echo "完成一次增量备份 -- 周${DATE_WEEK}" >>${log} || echo "第1次备份发生错误 -- ${week}" >> ${log}
else
echo "${date} -- ${DATE_WEEK} -- 备份失败没有找到前一天备份" >> ${log}
fi
echo "************************ ${DATE} **************************" >> ${log}
}
#调用时间计算函数结果放入一个变量中,记录当前日期为周几
DATE_WEEK=`get_week`
#判断日期为周几决定调用的备份函数
case ${DATE_WEEK} in
1|2|3|4|5|6)
#此处定义增量备份的目录名,增量备份需要根据前一天的数据进行备份,所以采用数字命名,便于用变量加减,表示目录名称,当前日期减一就是前一天日期及目录名
LABACK_NAME=`expr ${DATE_WEEK} - 1`
CUBACK_NAME=${DATE_WEEK}
incrback_func ;;
0)
#声明完整备份的目录名称
FULLBACK_NAME=${DATE_WEEK}
fullback_func ;;
*) echo "备份发生错误 -- ${DATE} -- 周${daweek}" >> ${LOG_MANLY} ;;
esac
最后编辑计划任务,指定每天的凌晨1点执行该脚本
crontab -e
0 1 * * * bash /tmp/mariaback/mariaback.sh >> /dev/null