基于XtraBackup的备份有效性检查脚本
发表于:2024-10-21 作者:千家信息网编辑
千家信息网最后更新 2024年10月21日,生产环境的MySQL是通过crontab的方式,定时调度热备脚本备份数据。目前是通过XtraBackup软件实现热备。关于热备脚本方面,请查看我原先的博客《使用shell实现mysql自动全备、增备&
千家信息网最后更新 2024年10月21日基于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_fulldrwxr-xr-x 18 mysql mysql 4096 Apr 10 03:25 mysql01_20170410_023001_incrdrwxr-xr-x 18 mysql mysql 4096 Apr 11 03:26 mysql01_20170411_023001_incrdrwxr-xr-x 18 mysql mysql 4096 Apr 12 03:25 mysql01_20170412_023001_incrdrwxr-xr-x 18 mysql mysql 4096 Apr 13 03:26 mysql01_20170413_023001_incrdrwxr-xr-x 18 mysql mysql 4096 Apr 14 03:26 mysql01_20170414_023001_incrdrwxr-xr-x 18 mysql mysql 4096 Apr 15 03:27 mysql01_20170415_023001_incrdrwxr-xr-x 18 mysql mysql 4096 Apr 16 03:29 mysql01_20170416_023001_fulldrwxr-xr-x 18 mysql mysql 4096 Apr 17 03:26 mysql01_20170417_023001_incr
其中full结尾的说明当天是全备的,incr结尾的说明当天是增备的。
脚本实现逻辑:自动恢复全备数据,并依次恢复其余的增备数据到全备数据中,最后将恢复完毕的全备数据用mysqld拉起来,检查MySQL的错误日志是否有异常报错来判断恢复是否正常。
vim dbrecover.sh
#!/bin/shif [ $# -ne 1 ]then echo "usage: `basename $0` [mysql01|mysql02]" exit 1fihostname=$1today=`date +%Y%m%d`sh /home/mysql/shell/mysql_recover.sh $hostname $today
vim mysql_recover.sh
#!/bin/shif [ $# -ne 2 ]then echo "usage: `basename $0` [mysql01|mysql02|mysql03] 20170501 " exit 1fihostname=$1#hostname="mysql02"#today=`date +%Y%m%d`today=$2#week=`date +%w`week=`date -d $today +%w`time1=`date +%s`timestamp=`date +%Y%m%d%H%M%S`logdir="/home/mysql/log/mysqlrecoverlog/$hostname/$timestamp"dir="/mysqlbackup/databak/$hostname/"fullname="$dir/full_backup_file.txt"incrname="$dir/incr_backup_file.txt"datadir=`grep datadir /etc/my.cnf|awk -F \= '{print $NF}'`errlog=`grep log-error /etc/my.cnf|awk -F \= '{print $NF}'`n1="0" ##周几做热备,周一到周六为1~6,周日为0。n2="6" ##周几最后一次增备,周一到周六为1~6,周日为0。mkdir $logdir ##创建日志目录function getdir(){if [ $week -eq "$n1" ]then fulldir=`find /mysqlbackup/databak/${hostname}/ -type d -name "*${today}*full"` #/mysqlbackup/databak/mysql01/mysql01_20170430_023001_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` #/mysqlbackup/databak/mysql01/mysql01_20170429_023001_incr 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}function uncompress(){ dir=$1 /usr/bin/innobackupex --decompress --parallel=8 $dir >>$logdir/uncompress_${timestamp}.log 2>&1 success_flag=`cat $logdir/uncompress_${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"` if [ -n "$success_flag" ] then echo "the full dbbackup $fullbakdir recovery is success!" >> $logdir/recover_${timestamp}.log else echo "the full dbbackup $fullbakdir 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 success_flag=`cat $logdir/incr_recover_${timestamp}.log|grep "innobackupex: completed OK"` if [ -n "$success_flag" ] then echo "the incr dbbackup $incrbakdir recovery is success!" >> $logdir/recover_${timestamp}.log else echo "the incr dbbackup $incrbakdir recovery is fail!" >> $logdir/recover_${timestamp}.log exit 1 fi}function mysqlrecover(){ fullbakdir=$1 #uncompress $fullbakdir rm -fr $datadir /bin/ln -s $fullbakdir $datadir chown -R mysql:mysql $datadir chown -R mysql:mysql $fullbakdir /sbin/service mysqld start error_flag=`grep -i error $errlog` if [ -z "$error_flag" ] then echo "the mysqld don't report error, mysql recover is success!" >> $logdir/recover_${timestamp}.log else echo "the mysqld report error, mysql recover is fail, please check!" >> $logdir/recover_${timestamp}.log exit 1 fi /sbin/service mysqld stop }getdirif [ $week -eq "$n1" ]then full=`cat $fullname` full_recover $fullelse incr=`cat $incrname` full=`cat $fullname` incr_recover $incr $full if [ $week -eq "$n2" ] then mysqlrecover $full fifitime2=`date +%s`times=$((${time2}-${time1}))echo "it takes $times seconds to finish the recover!!!" >> $logdir/recover_${timestamp}.log
备份机目前采用二进制包安装MySQL的方式,直接上传到/usr/local/mysql目录上,配置好相应的/etc/profile和/etc/my.cnf即可。
cat /etc/my.cnf
[mysqld]datadir=/mysqlbackup/mysql_testsocket=/mysqlbackup/mysql_test/mysql.sockuser=mysql# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0[mysqld_safe]log-error=/mysqlbackup/mysql_test/mysqld.logpid-file=/mysqlbackup/mysql_test/mysqld.pid
生成的日志文件如下:
-rw-r--r-- 1 root root 613918 May 4 09:34 incr_recover_20170504092501.log-rw-r--r-- 1 root root 307 May 4 09:34 recover_20170504092501.log-rw-r--r-- 1 root root 259310 May 4 09:26 uncompress_20170504092501.log
其中:
uncompress_20170504092501.log:解压备份文件时产生的日志信息
incr_recover_20170504092501.log:XtraBackup应用备份文件时产生的日志信息
recover_20170504092501.log:当次恢复备份文件记录的简要日志信息
备份
日志
数据
全备
文件
脚本
信息
有效
有效性
检查
方式
目录
二进制
博客
可用性
异地
方面
服务器
机制
环境
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
高级oracle数据库面试
石景山区软件开发程序
4000元服务器cpu推荐
数据库技术是数据管理
中国移动顺应网络技术演进
能源行业的网络安全意识培训
关联同源分析网络安全中标
网络安全tcp名词解释
数据库增删查改用什么函数
软件开发买菜
数据库 false
网络安全监测装置怎么对时
我的世界基岩版免费服务器手机
2009网络安全事件
2003 服务器
传奇服务器列表
学软件开发工作怎么样
数据库开发属于什么领域
安全区域服务器需要nat吗
安徽企业软件开发需要多少钱
查看数据库权限
云展天下网络技术有限公司
服务器内核安全性
先锋服务器是哪个国家的
数组全部数据库
我的世界pc开服务器有什么好处
盘锦璐麦特网络技术服务中心
北京总部经济发展数据库
工会网络安全责任制
阿里云服务器的管理和维护