原文转自:

http://blog.csdn.net/dbanote/article/details/13295727

应用场景:
************************************************************************************************1.备份目录为/backup/full和/backup/incre的架构,前者保存全备,后者保存增量备份2.如全备为/backup/full/2015-04-08_15-14-33则将全备的目录名2015-04-08_15-14-33
作为/backup/incre/下增量备份的目录名。这样设计的初衷在于只要全备不过期,那么
这个全备文件之后的增量备份也不过期.3.还原时,脚本会自动找到最新的全备和最新全备命名的增量备份目录,并将增量备份
按照先后顺序应用日志到全备中,最后完成还原.4.该版本增加了是否恢复所有增量备份,默认是全部增量备份.************************************************************************************************
脚本
************************************************************************************************#!/bin/sh
#ocpyang@126.com
#xtrabackup 2.3.3
# 使用方法:
# ./restore.sh /增量备份父目录或全备的父目录名
#eg1:./restore.sh /data/backup/full/
#eg2:./restore.sh /data/backup/incre/
#NOTICE:增量备份还原如果指定文件,则还原到指定文件名的上一个文件末截止.
#即输入的增量文件名应为需要截止的增量文件名的下一个文件#NOTE:恢复开始前请确保mysql服务停止以及数据和日志目录清空,如
# rm -rf /data/mysql/innodb_data/*
# rm -rf /data/mysql/data/*
# rm -rf /data/mysql/mysql_logs/innodb_log/*echo "*************************************************************************"
echo -e '\e[32m 提示:mysql端口根据实际环境修改. \e[m' #红色
echo "*************************************************************************"INNOBACKUPEX=innobackupex
INNOBACKUPEX_PATH=/usr/local/xtrabackup/bin/$INNOBACKUPEX
TMP_LOG="/var/log/restore.$$.log"
MY_CNF=/etc/my.cnf
BACKUP_DIR=/data/backup # 你的备份主目录
FULLBACKUP_DIR=$BACKUP_DIR/full # 全库备份的目录
INCRBACKUP_DIR=$BACKUP_DIR/incre # 增量备份的目录
MEMORY=2048M # 还原的时候使用的内存限制数
ERRORLOG=`grep -i "^log-error" $MY_CNF |cut -d = -f 2`
MYSQLD_SAFE=/data/mysql/bin/mysqld_safe
MYSQL_PORT=33107##############################################################################显示错误#############################################################################error()
{echo "$1" 1>&2exit 1
}############################################################################## 检查innobackupex错误输出#############################################################################check_innobackupex_fail()
{if [ -z "`tail -2 $TMP_LOG | grep 'completed OK!'`" ] ; thenecho "$INNOBACKUPEX命令执行失败:"; echoecho "---------- $INNOBACKUPEX的错误输出 ----------"cat $TMP_LOG#保留一份备份的详细日志logfiledate=restore.`date +%Y%m%d%H%M`.txtcat $TMP_LOG>/backup/$logfiledate  rm -f $TMP_LOGexit 1fi
}# 选项检测
if [ ! -x $INNOBACKUPEX_PATH ]; thenerror "$INNOBACKUPEX_PATH在指定路径不存在,请确认是否安装或核实链接是否正确."
fiif [ ! -d $BACKUP_DIR ]; thenerror "备份目录$BACKUP_DIR不存在.请新建备份主目录$BACKUP_DIR"
fiif [ $# != 1 ] ; thenerror "使用方法: $0 使用还原目录的绝对路径"
fiif [ ! -d $1 ]; thenerror "指定的备份目录:$1不存在."
fiPORTNUM00=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`
if [ $PORTNUM00 = 1  ];
then
echo -e "\e[31m NOTE:------------------------------------------.\e[m" #红色
echo -e "\e[31m mysql处于运行状态,请关闭mysql. \e[m" #红色
echo -e "\e[31m NOTE:------------------------------------------.\e[m" #红色
exit 0
fi ################判断还原增量备份部分还是所有################
echo "*************************************************************************"
echo -e "\e[31m 输入的增量文件名应为截止的增量文件名的下一个文件.\e[m" #红色
echo "*************************************************************************"
ipname=''
read -p "输入截止增量备份名[默认所有]:" ipname
echoecho "输入截止增量备份名为:$ipname"input_value=$1
intpu_res=`echo ${input_value%/*}` # Some info output
echo "----------------------------"
echo
echo "$0: MySQL还原脚本"
START_RESTORE_TIME=`date +%F' '%T' '%w`
echo "数据库还原开始于: $START_RESTORE_TIME"
echo#PARENT_DIR=`dirname ${intpu_res}`
PARENT_DIR=${intpu_res}if [ $PARENT_DIR = $FULLBACKUP_DIR ]; then
FULL=`ls -t $FULLBACKUP_DIR |head -1`
FULLBACKUP=${intpu_res}/$FULL
echo "还原完全备份:`basename $FULLBACKUP`"
echoelse################判断还原部分增量备份还是所有增量备份################
if [ "$ipname" = '' ];thenif [ $PARENT_DIR = $INCRBACKUP_DIR ]; then
FULL=`ls -t $FULLBACKUP_DIR |head -1`
FULLBACKUP=$FULLBACKUP_DIR/$FULL
if [ ! -d $FULLBACKUP ]; then
error "全备:$FULLBACKUP不存在."
fi
INCR=`ls -t $INCRBACKUP_DIR/$FULL/ |sort -nr | head -1 ` #查找最后一个增量备份文件
echo "还原将从全备全备$FULL开始,到增量$INCR结束."
echo
echo "Prepare:完整备份..........."
echo "*****************************"
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_fail# Prepare增量备份集,即将增量备份应用到全备目录中,按照增量备份顺序即按照时间从旧到最新
for i in `find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n `;
do#判断最新全备的lsn
#check_full_file=`find $FULLBACKUP/ -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head  -1`check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpointsfetch_full_lastlsn=`grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2`######判断增量备份中第一个增量备份的LSN
#check_incre_file=`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n |  head -1`check_incre_lastlsn=$PARENT_DIR/$FULL/$i/xtrabackup_checkpointsfetch_incre_lastlsn=`grep -i "^last_lsn" ${check_incre_lastlsn} |cut -d = -f 2`
echo "完全备份$FULLBACKUP的LSN值:${fetch_full_lastlsn} "
echo "增量备份$i的LSN值:${fetch_incre_lastlsn} "if [ "${fetch_incre_lastlsn}" -eq "${fetch_full_lastlsn}" ];then
echo "*****************************************"
echo "LSN相等,不需要prepare!"
echo "*****************************************"
echo
breakelse
echo "Prepare:增量备份集$i........"
echo "*****************************"
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP --incremental-dir=$PARENT_DIR/$FULL/$i > $TMP_LOG 2>&1
check_innobackupex_failif [ $INCR = $i ]; then
break
fifi
######判断LSN
doneelse
error "未知的备份类型"fielse
FULL=`ls -t $FULLBACKUP_DIR |head -1`
FULLBACKUP=$FULLBACKUP_DIR/$FULL
echo "Prepare:完整备份..........."
echo "*****************************"
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_failipt=`stat -c=%Z  $PARENT_DIR/$FULL/$ipname |cut -d = -f 2`
echo "还原的指定增量目录文件$ipname的纪元时间为:$ipt"
for i in `find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n `;
do
#判断for循环取到的文件名是否为输入的文件名,如果是则停止循环
if [ "$i" =  "$ipname" ]; then
break;
else
f01=`stat -c=%Z  $PARENT_DIR/$FULL/$i |cut -d = -f 2`
if [ "$f01" -le "$ipt" ]; thenif [ $PARENT_DIR = $INCRBACKUP_DIR ]; then
if [ ! -d $FULLBACKUP ]; then
error "全备:$FULLBACKUP不存在."
fi
#INCR=`ls -t $INCRBACKUP_DIR/$FULL/ |sort -nr | head -1`
echo "还原将从全备$FULL开始,到增量$ipname结束."
echo#判断最新全备的lsn
#check_full_file=`find $FULLBACKUP/ -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head  -1`check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpointsfetch_full_lastlsn=`grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2`######判断增量备份中第一个增量备份的LSN
check_incre_file=`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n |  head -1`check_incre_lastlsn=$PARENT_DIR/$FULL/$i/xtrabackup_checkpointsfetch_incre_lastlsn=`grep -i "^last_lsn" ${check_incre_lastlsn} |cut -d = -f 2`
echo "完全备份的LSN:${fetch_full_lastlsn} "
echo "增量备份的LSN:${fetch_incre_lastlsn} "
if [ "${fetch_incre_lastlsn}" -eq "${fetch_full_lastlsn}" ];then
echo "*****************************************"
echo -e "\e[31m LSN不需要prepare或备份间隔期间无数据变化 \e[m" #红色
echo "*****************************************"fi echo
echo "Prepare:增量备份集$i........"
echo "*****************************"
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP --incremental-dir=$PARENT_DIR/$FULL/$i > $TMP_LOG 2>&1
check_innobackupex_fail######判断LSN
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpointsfetch_full_lastlsn=`grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2`
echo "完全备份当前的LSN:${fetch_full_lastlsn}"else
error "未知的备份类型"
fi
else
echo "查找增量备份文件完成."
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpointsfetch_full_lastlsn=`grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2`
echo -e "\e[31m -------------------------------------------- \e[m" #红色
echo -e "\e[31m 完全备份最终的LSN:${fetch_full_lastlsn} \e[m" #红色
echo -e "\e[31m -------------------------------------------- \e[m" #红色
break
fi
fi
donefi
################判断还原部分增量备份还是所有增量备份################fiecho
echo "prepare:完整备份以及回滚那些未提交的事务..........."
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_failecho "*****************************"
echo "数据库还原中 ...请稍等"
echo "*****************************"$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --copy-back $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_failrm -f $TMP_LOG
echo "1.恭喜,还原成功!."
echo "*****************************"#修改目录权限
echo "修改mysql目录的权限."
mysqlcnf="/data/mysql/my.cnf"
mysqldatadir=`grep -i "^basedir" $mysqlcnf |cut -d = -f 2`
`echo 'chown -R mysql:mysql' ${mysqldatadir}`
echo "2.权限修改成功!"
echo "*****************************"#自动启动mysqlINIT_NUM=1
if [ ! -x $MYSQLD_SAFE ]; thenecho "mysql安装时启动文件未安装到$MYSQLD_SAFE或无执行权限"exit 1  #0是执行成功,1是执行不成功
else
echo "启动本机mysql端口为:$MYSQL_PORT的服务"
$MYSQLD_SAFE --defaults-file=$MY_CNF  > /dev/null &
while  [ $INIT_NUM  -le 10 ]doPORTNUM=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`echo "mysql启动中....请稍等..."sleep 10if [ $PORTNUM = 1  ];then
echo -e "\e[32m mysql                                      ****启动成功**** \e[m"exit 0fi INIT_NUM=$(($INIT_NUM +1))done
echo -e "\e[31m mysql启动失败或启动时间过长,请检查错误日志 `echo 'cat ' ${ERRORLOG}` \e[m"
echo "*****************************************"
exit 0
fiEND_RESTORE_TIME=`date +%F' '%T' '%w`
echo "数据库还原完成于: $END_RESTORE_TIME"
exit 0************************************************************************************************
执行结果:
************************************************************************************************# ./restore.sh /backup/incre/
输入截止增量备份名[默认所有]:2015-04-10_14-10-49输入截止增量备份名为:2015-04-10_14-10-49
----------------------------./restore.sh: MySQL还原脚本
数据库还原开始于: 2015-04-10 14:24:51 5Prepare:完整备份...........
*****************************
还原的指定增量目录文件2015-04-10_14-10-49的纪元时间为:1428646269
还原将从全备2015-04-10_14-05-40开始,到增量2015-04-10_14-10-49结束.完全备份的LSN: 344693290
增量备份的LSN: 413297865
Prepare:增量备份集2015-04-10_14-08-19........
*****************************
完全备份当前的LSN: 413297865
还原将从全备2015-04-10_14-05-40开始,到增量2015-04-10_14-10-49结束.完全备份的LSN: 413297865
增量备份的LSN: 481905295
Prepare:增量备份集2015-04-10_14-09-07........
*****************************
完全备份当前的LSN: 481905295
还原将从全备2015-04-10_14-05-40开始,到增量2015-04-10_14-10-49结束.完全备份的LSN: 481905295
增量备份的LSN: 550515490
Prepare:增量备份集2015-04-10_14-10-49........
*****************************
完全备份当前的LSN: 550515490
查找增量备份文件完成.-------------------------------------------- 完全备份最终的LSN: 550515490 -------------------------------------------- prepare:完整备份以及回滚那些未提交的事务...........
*****************************
数据库还原中 ...请稍等
*****************************
1.恭喜,还原成功!.
*****************************
修改mysql目录的权限.
2.权限修改成功!
*****************************
启动本机mysql端口为:3306的服务
mysql启动中....请稍等...
mysql启动中....请稍等...
mysql启动中....请稍等...mysql                                      ****启动成功****

MySQL的恢复脚本相关推荐

  1. 【数据库运维】MYSQL备份恢复管理(上)

    目录 MYSQL备份恢复管理 一,备份类型 二,逻辑备份优缺点 三,MySQL备份内容 四,MySQL备份工具 五,MySQL备份策略 1,策略一:直接拷贝数据库文件 案例:直接拷贝备份数据库comp ...

  2. mysql如何恢复单表_MySQL如何恢复单库或单表,以及可能遇到的坑

    前言: MySQL 逻辑备份工具最常用的就是 mysqldump 了,一般我们都是备份整个实例或部分业务库.不清楚你有没有做过恢复,恢复场景可能就比较多了,比如我想恢复某个库或某个表等.那么如何从全备 ...

  3. MySQL备份恢复方案

    MySQL备份方案 随着数据不断增加,而且为了兼容以后的innodb存储引擎, 所以考虑采用mysqldump全备+日志增量备份的策略.使用mysqldump对于mysql大部分mysql存储引擎比如 ...

  4. 详解mysql备份恢复的三种实现方式

    一.Mysql备份策略: 完整备份: 完整备份就是指对某一个时间点上的所有数据或应用进行的一个完整拷贝,对数据量大的,备份时间较长,当然数据在恢复的时候快. 增量备份: 备份自上一次备份(包括完整备份 ...

  5. Mysql 备份恢复看这一篇就够了

    Mysql 备份恢复 一.备份分类.备份策略 1.1 造成数据丢失的原因: 程序错误 人为操作错误 运算错误 磁盘故障 灾难(如火灾.地震)和盗窃 1.2 数据库备份的分类 1)物理备份:对数据库操作 ...

  6. mysql galera 恢复_galera mariadb集群恢复策略

    1 galera mariadb 首先MariaDB是一个数据库,可以看成是MySQL的一个分支,由于MySQL被SUN收购,所以MySQL面临着闭源的风险,当时MySQL之父Widenius并没有加 ...

  7. mysql备份恢复实验

    内容大纲: 一 mysqldump备份 二 sql语句备份 三 mysqlbinlog备份恢复 一 mysqldump数据文件备份恢复 mysql> use cw_d; Database cha ...

  8. mysql安装check requirements出错_精心整理的mysql主从监控脚本,值得收藏

    概述 分享下最近整理的一个mysql主从监控脚本,仅供参考. 一.邮件配置 1.安装邮件服务 yum -y install sendmail mailx 2.修改配置 # vi /etc/mail.r ...

  9. Mysql自动备份脚本

    1.Mysql自动备份脚本 #!/bin/sh # 数据库基本信息 #数据库名称 DB_NAME="test" #用户名 DB_USER="root" #密码 ...

最新文章

  1. Java-Character String StringBuffer StringBuilder
  2. 专访刘伟:软件开发人员的内功修炼之道
  3. 安装Orchard错误
  4. Weex 解决Print: Entry, :CFBundleIdentifier, Does Not Exist 错误方法
  5. java绘制图形_java绘制基本图形.doc
  6. java中jnum i .length,java数组和多维数组
  7. HUT-XXXX Strange display 容斥定理,线性规划
  8. 第3章   IP寻址
  9. javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转换为YUV、BGR24或RGB24等图像像素数据...
  10. python 如何做web界面_python的web实例教程,用python做个简单web界面选什么框架最简单...
  11. 7-9 剥洋葱 (15 分)
  12. C语言二进制、八进制、十进制、十六进制深入探究
  13. MySQL-InnoDB锁
  14. 什么是根域名服务器?
  15. Spotify网络钓鱼活动目标锁定音乐爱好者
  16. java写网页_初次尝试通过java写简单网站
  17. 【阿朱标红】O2O五年三次创业的九大经验(天天用车CEO翟光龙)
  18. 软考备战之计算机专业词汇
  19. 终极套娃 2.0|云原生 PaaS 平台的可观测性实践分享
  20. Simplify and Robustify Negative Sampling for Implicit Collaborative Filtering (Nips‘20) 论文小结

热门文章

  1. 想拥有一台属于你自己的无人机嘛?
  2. 在悬崖下得到鸿蒙塔,第一次夜宿在悬崖峭壁上:垂直高度356米,峡谷深渊就在边上...
  3. 体温高会折寿?温州大学学者发现体温比代谢率更会影响寿命,已在小鼠身上验证 | Nature子刊...
  4. 去年押中数字人爆发,今年看好什么?百度研究院2022十大科技趋势预测出炉
  5. 动视暴雪员工大罢工:因CEO被曝多次包庇高管性侵下属、本人曾性骚扰助理
  6. 张亚勤清华AIR战队首次亮相,这阵容不是一般强
  7. 苹果认输!组装iPhone,富士康工人比机器好多了
  8. GitHub年度报告:Python首次击败Java,中国成第二大开源贡献国
  9. 中国自研数据库打破西方垄断:阿里成绩刷新世界尘封9年纪录,性能2倍于第二名...
  10. 百度Q2扭亏为盈,市值一夜大涨300亿,李彦宏:呼唤猛将雄兵,要再上行业之巅...