基于XtraBackup的备份有效性检查脚本

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

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

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

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

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

drwxr-xr-x 18 mysql mysql 4096 Apr  9 03:28 mysql01_20170409_023001_full
drwxr-xr-x 18 mysql mysql 4096 Apr 10 03:25 mysql01_20170410_023001_incr
drwxr-xr-x 18 mysql mysql 4096 Apr 11 03:26 mysql01_20170411_023001_incr
drwxr-xr-x 18 mysql mysql 4096 Apr 12 03:25 mysql01_20170412_023001_incr
drwxr-xr-x 18 mysql mysql 4096 Apr 13 03:26 mysql01_20170413_023001_incr
drwxr-xr-x 18 mysql mysql 4096 Apr 14 03:26 mysql01_20170414_023001_incr
drwxr-xr-x 18 mysql mysql 4096 Apr 15 03:27 mysql01_20170415_023001_incr
drwxr-xr-x 18 mysql mysql 4096 Apr 16 03:29 mysql01_20170416_023001_full
drwxr-xr-x 18 mysql mysql 4096 Apr 17 03:26 mysql01_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()函数是获取脚本运行当天的热备文件的路径名,并做校验(一天一个备份文件)###
function getdir()
{
if [ $week -eq "$n1" ]
then
    fulldir=`find /mysqlbackup/databak/${hostname}/ -type d -name "*${today}*full"`
    if [ ! -n "$fulldir" ]
    then
        echo "the fulldir not exist!!!" >> $logdir/recover_${timestamp}.log
        exit 1
    fi
    num=`find /mysqlbackup/databak/${hostname}/ -type d -name "*${today}*full"|wc -l`
    if [ $num -eq "1" ]
    then
        echo $fulldir > $fullname
    else
        echo "there are not only full dbbackup in $today, please check!!!" >> $logdir/recover_${timestamp}.log
        exit 1
    fi
    
else
    incrdir=`find /mysqlbackup/databak/${hostname}/ -type d -name "*${today}*incr"`
    if [ ! -n "$incrdir" ]
    then
        echo "the incrdir not exist!!!" >> $logdir/recover_${timestamp}.log
    fi
    num=`find /mysqlbackup/databak/${hostname}/ -type d -name "*${today}*incr"|wc -l`
    if [ $num -eq "1" ]
    then
        echo $incrdir > $incrname
    else
        echo "there are not only incr dbbackup in $today, please check!!!" >> $logdir/recover_${timestamp}.log
        exit 1
    fi        
fi
}

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

function uncompress()
{
    dir=$1
    /usr/bin/innobackupex --decompress --parallel=8 $dir >>$logdir/uncompress_${timestamp}.log 2>&1
    success_flag=`cat $logdir/uncompress_${dir}_${timestamp}.log|grep "completed OK"`
    if [ -n success_flag ]
    then
        echo "$dir decompress sucessfully!" >> $logdir/recover_${timestamp}.log
    else
        echo "$dir decompress failed " >> $logdir/recover_${timestamp}.log
        exit 1
    fi
}

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

function full_recover()
{    
    fullbakdir=$1
    uncompress $fullbakdir
    /usr/bin/innobackupex --use-memory=2G --apply-log --redo-only $fullbakdir >>$logdir/full_recover_${timestamp}.log 2>&1
    success_flag=`cat $logdir/full_recover_${timestamp}.log|grep "innobackupex: completed OK"`
    #failed_flag=`cat $logdir/full_recover_${timestamp}.log|grep "xtrabackup: error:"`
    if [ -n "$success_flag" ]
          then
            echo "the full dbbackup $fullbakdir recovery is success!" >> $logdir/recover_${timestamp}.log
          else
            echo "the full dbbackup $fullbakdri recovery is fail!" >> $logdir/recover_${timestamp}.log
            exit 1
          fi
}

###恢复增量备份函数###
function incr_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}.log 2>&1
    else
        /usr/bin/innobackupex --use-memory=2G --apply-log --incremental-dir=$incrbakdir $fullbakdir >>$logdir/incr_recover_${timestamp}.log 2>&1
    fi
    #/usr/bin/innobackupex --use-memory=2G --apply-log --redo-only --incremental-dir=$incrbakdir $fullbakdir >>$logdir/incr_recover_${timestamp}.log 2>&1
    success_flag=`cat $logdir/incr_recover_${timestamp}.log|grep "innobackupex: completed OK"`
        #failed_flag=`cat $logdir/incr_recover_${timestamp}.log|grep "xtrabackup: error:"`
        if [ -n "$success_flag" ]
        then
                echo "the incr dbbackup $fullbakdir recovery is success!" >> $logdir/recover_${timestamp}.log
        else
                echo "the incr dbbackup $fullbakdri recovery is fail!" >> $logdir/recover_${timestamp}.log
                exit 1
        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 "it takes $times seconds to finish the recover!!!" >> $logdir/recover_${timestamp}.log
时间: 2024-11-08 23:53:35

基于XtraBackup的备份有效性检查脚本的相关文章

MySQL 全量及增量备份,基于xtrabackup 2.3.5

昨天一个pgp加密盘坏了,东西全丢了...,我的笔记啊!我咋怎么2呢.. 备份个脚本吧,方便以后手机查看,话说我都快忘记帐号密码了 备注:脚步恢复时只能恢复到备份前的状态,如果需要恢复到当前状态,还需配合binlog,睡觉就这样 #!/bin/sh #################################################### # AUTHOR : JusonSummer # # VERSION : V1.0.0 # # DATE : 2016-08-13 # # CO

XtraBackup物理备份(未测试)

XtraBackup物理备份 Percona XtraBackup是世界上唯一的开源,免费的MySQL热备份软件,为InnoDB和XtraDB 数据库执行非阻塞备份.使用Percona XtraBackup,可以实现以下优势: 快速可靠地完成的备份 备份期间的不间断事务处理 节省磁盘空间和网络带宽 自动备份验证 创建热InnoDB备份,而不暂停数据库 对MySQL进行增量备份 将压缩的MySQL备份压缩到另一个服务器 在MySQL服务器之间移动表 轻松创建新的MySQL主从 备份MySQL,而不

xtrabackup 全备份,增量备份,恢复 mysql数据库

Xtrabackup使用指南 InnoDB数据备份工具 Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写,也就是不加锁),是商业备份工具InnoDB Hotbackup的一个很好的替代品 一.Xtrabackup介绍  A.Xtrabackup是什么 Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品. Xtrabackup有两个主要的工具

Xtrabackup 增量备份、恢复、原理

整合了网上的一些资料,结合自己的理解,并进行了实验验证 理解一: 1,Xtrabackup是什么 Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品. Xtrabackup有两个主要的工具:xtrabackup.innobackupex (1).xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表 (2). innobackupex是参考了In

mysql中的XtraBackup的备份原理

xtrabackup的官方下载地址为 : http://www.percona.com/software/percona-xtrabackup. xtrabackup包含两个主要的工具,即xtrabackup和innobackupex,二者区别如下: 1 xtrabackup只能备份innodb和xtradb两种引擎的表,而不能备份myisam引擎的表 2 innobackupex是一个封装了xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要

XtraBackup物理备份 阿里云的Mysql备份方案

XtraBackup物理备份 Percona XtraBackup是世界上唯一的开源,免费的MySQL热备份软件,为InnoDB和XtraDB 数据库执行非阻塞备份.使用Percona XtraBackup,可以实现以下优势: 快速可靠地完成的备份 备份期间的不间断事务处理 节省磁盘空间和网络带宽 自动备份验证 创建热InnoDB备份,而不暂停数据库 对MySQL进行增量备份 将压缩的MySQL备份压缩到另一个服务器 在MySQL服务器之间移动表 轻松创建新的MySQL主从 备份MySQL,而不

Xtrabackup数据库备份工具

Xtrabackup 官方原理 在InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件.事务日志会存储每一个InnoDB表数据的记录修改.当InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:它应用(前滚)已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作. Xtrabackup在启动时会记住log sequencenumber(LSN),并且复制所有的数据文件.复制过程需要一些时间,所以这期间如果数据文件有改动,那么将会使数据库处于一个

基于catalog 创建RMAN存储脚本

--============================== -- 基于catalog 创建RMAN存储脚本 --============================== 简言之,将rman的备份恢复命令写成脚本并保存在恢复目录内,恢复目录内的脚本可用性及通用性高于基于文件系统的脚本. 客户端只要能够登录到RMAN恢复目录,则这些脚本可用,尤其对于global脚本,可以被任意注册的数据库调度. 一.脚本的分类 local : 在rman连接的目标数据库下创建的脚本,此类脚本仅仅适用于当前

linux 下RMAN备份shell脚本

RMAN备份对于Oracle数据库的备份与恢复简单易用,成本低廉.对于使用非catalog方式而言,将RMAN脚本嵌入到shell脚本,然后再通过crontab来实现中小型数据库数据库备份无疑是首选.本文提供了一个简单易用的基于linux shell下的RMAN备份脚本供参考.大家可根据自己的需要进行适当调整. RMAN备份相关方面的知识较多,可以参考:    RMAN 概述及其体系结构    RMAN 配置.监控与管理    RMAN 备份详解    RMAN 还原与恢复    RMAN ca