脚本再次更新,共享一下!

#!/bin/sh

#

# 用法:

# ./restore.sh /你备份文件的全路径

#ocpyang@126.com

INNOBACKUPEX=innobackupex

INNOBACKUPEX_PATH=/usr/bin/$INNOBACKUPEX

TMP_LOG="/var/log/restore.$$.log"

MY_CNF=/usr/local/mysql/my.cnf

BACKUP_DIR=/backup # 你的备份主文件夹

FULLBACKUP_DIR=$BACKUP_DIR/full # 全库备份的文件夹

INCRBACKUP_DIR=$BACKUP_DIR/incre # 增量备份的文件夹

MEMORY=4096M # 还原的时候使用的内存限制数

ERRORLOG=`grep -i "^log-error" $MY_CNF |cut -d = -f 2`

MYSQLD_SAFE=/usr/local/mysql/bin/mysqld_safe

MYSQL_PORT=3306

#############################################################################

#显示错误

#############################################################################

error()

{

    echo "$1" 1>&2

    exit 1

}

#############################################################################

# 检查innobackupex错误输出

#############################################################################

check_innobackupex_fail()

{

    if [ -z "`tail -2 $TMP_LOG | grep 'completed OK!'`" ] ; then

    echo "$INNOBACKUPEX命令运行失败:"; echo

    echo "---------- $INNOBACKUPEX的错误输出 ----------"

    cat $TMP_LOG

    #保留一份备份的具体日志

    logfiledate=restore.`date +%Y%m%d%H%M`.txt

    cat $TMP_LOG>/backup/$logfiledate 

    rm -f $TMP_LOG

    exit 1

  fi

}

# 选项检測

if [ ! -x $INNOBACKUPEX_PATH ]; then

  error "$INNOBACKUPEX_PATH在指定路径不存在,请确认是否安装或核实链接是否正确."

fi

if [ ! -d $BACKUP_DIR ]; then

  error "备份文件夹$BACKUP_DIR不存在."

fi

if [ $# != 1 ] ; then

  error "用法: $0 使用还原文件夹的绝对路径"

fi

if [ ! -d $1 ]; then

  error "还原到:$1不存在."

fi

# Some info output

echo "----------------------------"

echo

echo "$0: MySQL还原脚本"

START_RESTORE_TIME=`date +%F' '%T' '%w`

echo "数据库还原開始于: $START_RESTORE_TIME"

echo

PARENT_DIR=`dirname $1`

if [ $PARENT_DIR = $FULLBACKUP_DIR ]; then

 FULLBACKUP=$1

 echo "还原`basename $FULLBACKUP`"

 echo

else

 if [ `dirname $PARENT_DIR` = $INCRBACKUP_DIR ]; then

 INCR=`basename $1`

 FULL=`basename $PARENT_DIR`

 FULLBACKUP=$FULLBACKUP_DIR/$FULL

  if [ ! -d $FULLBACKUP ]; then

  error "全备:$FULLBACKUP不存在."

  fi

 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

#推断lsn

 check_incre_file=`find $PARENT_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n " | sort -nr  |grep -v '^$' | head -n 1`

check_incre_lastlsn=${PARENT_DIR}/${check_incre_file}/xtrabackup_checkpoints

fetch_incre_lastlsn=`grep -i "^last_lsn" ${check_incre_lastlsn} |cut -d = -f 2`

check_full_file=`find $FULLBACKUP/ -mindepth 1 -maxdepth 1 -type d -printf "%P\n " | sort -nr  |grep -v '^$' | head -n 1`

check_full_lastlsn=$FULLBACKUP/${check_full_file}/xtrabackup_checkpoints

fetch_full_lastlsn=`grep -i "^last_lsn" ${check_incre_lastlsn} |cut -d = -f 2`

# Prepare增量备份集,即将增量备份应用到全备文件夹中

 for i in `find $PARENT_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n`;

 do

 ######推断LSN

  if [ "${fetch_incre_lastlsn}"="${fetch_full_lastlsn}" ];then

  echo "*****************************************"

  echo "LSN不须要prepare!"

  echo "*****************************************"

  echo

  break

  else

######推断LSN

  echo "Prepare增量备份集$i........"

  echo "*****************************"

  $INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP --incremental-dir=$PARENT_DIR/$i > $TMP_LOG 2>&1

  check_innobackupex_fail

if [ $INCR = $i ]; then

  break

  fi

fi

 ######推断LSN

 done

 

 else

 error "未知的备份类型"

 fi

fi

echo "prepare全备集,回滚那些未提交的事务..........."

$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1

check_innobackupex_fail

echo "*****************************"

echo "1.数据库还原中 ...请稍等"

echo "*****************************"

$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --copy-back $FULLBACKUP > $TMP_LOG 2>&1

check_innobackupex_fail

rm -f $TMP_LOG

echo "2.恭喜,还原成功!."

echo "*****************************"

#改动文件夹权限

echo "改动mysql文件夹的权限."

mysqlcnf="/usr/local/mysql/my.cnf"

mysqldatadir=`grep -i "^basedir" $mysqlcnf |cut -d = -f 2`

`echo 'chown -R mysql:mysql' ${mysqldatadir}`

echo "3.权限改动成功!"

echo "*****************************"

#自己主动启动mysql

INIT_NUM=1

if [ ! -x $MYSQLD_SAFE ]; then

  echo "mysql安装时启动文件未安装到$MYSQLD_SAFE或无运行权限"

  exit 1  #0是运行成功,1是运行不成功

else

 echo "启动本机mysqlport为:$MYSQL_PORT的服务"

 $MYSQLD_SAFE --defaults-file=$MY_CNF  > /dev/null &

 while  [ $INIT_NUM  -le 6 ]

 do

 PORTNUM=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`

 echo "mysql启动中....请稍等..."

 sleep 5

  if [ $PORTNUM = 1  ];

  then

   echo "mysql                                      ****启动成功****"

  exit 0

  fi 

 INIT_NUM=$(($INIT_NUM +1))

 done

   echo -e "mysql启动失败或启动时间过长,请检查错误日志`echo 'cat ' ${ERRORLOG}`"

 echo "*****************************************"

 exit 0

fi

END_RESTORE_TIME=`date +%F' '%T' '%w`

echo "数据库还原完毕于: $END_RESTORE_TIME"

exit 0

实战:INNOBACKUPEX for mysql 5.6自己主动还原脚本-v2的更多相关文章

  1. 实战:INNOBACKUPEX for mysql 5.6自己主动备份脚本

    #backup.sh #!/bin/sh # # 第一次运行它的时候它会检查是否有全然备份,否则先创建一个全库备份 # 当你再次执行它的时候.它会依据脚本中的设定来基于之前的全库备份进行增量备份 #o ...

  2. Xtrabackup原理及使用innobackupex进行MySQL数据库备份恢复

    Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具. Xtrabackup中主要包含两个工 ...

  3. Mysql备份系列(3)--innobackupex备份mysql大数据(全量+增量)操作记录

    在日常的linux运维工作中,大数据量备份与还原,始终是个难点.关于mysql的备份和恢复,比较传统的是用mysqldump工具,今天这里推荐另一个备份工具innobackupex.innobacku ...

  4. [实战]MVC5+EF6+MySql企业网盘实战(28)——其他列表

    写在前面 本篇文章将实现,其他文件类型的列表. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实战]MVC5+EF ...

  5. [实战]MVC5+EF6+MySql企业网盘实战(27)——应用列表

    写在前面 本篇文章将实现应用列表,同样和其他列表的不同之处,在于查询条件的不同. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘 ...

  6. 二十种实战调优MySQL性能优化的经验

    二十种实战调优MySQL性能优化的经验 发布时间:2012 年 2 月 15 日 发布者: OurMySQL 来源:web大本营   才被阅读:3,354 次    消灭0评论     本文将为大家介 ...

  7. 使用innobackupex备份mysql数据库

    1  因为使用perl脚本编写,安装前应先安装 yum install perl-Time-HiRes -y yum -y install perl-DBD-MySQL.x86_64 一起安装     ...

  8. [实战]MVC5+EF6+MySql企业网盘实战(4)——上传头像

    写在前面 最近又开始忙了,工期紧比较赶,另外明天又要去驾校,只能一个功能一个功能的添加了,也许每次完成的功能确实不算什么,等将功能都实现了,然后在找一个好点的ui对前端重构一下. 系列文章 [EF]v ...

  9. [实战]MVC5+EF6+MySql企业网盘实战(2)——验证码

    写在前面 断断续续,今天算是把验证码的东东弄出来了. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实战]MVC5 ...

随机推荐

  1. 利用Pastezort渗透win7

    下载Pastezort git clone https://github.com/ZettaHack/PasteZort.git 给Pastezort文件夹提升权限 /root/PasteZort/ ...

  2. [CSAcademy]Cycle Tree

    [CSAcademy]Cycle Tree 题目大意: 定义环树是一张无向连通的简单图,它的生成方式如下: \(2\)个点\(1\)条边的图是环树: 对任意一个环树,加入\(k\)个点\(a_{1\s ...

  3. [HNOI2008]玩具装箱

    OJ题号: BZOJ1010 思路: 斜率优化动态规划. 由题意得状态转移方程为$f_i=\displaystyle{\min_{j=0}^{i-1}}\{f_j+\left(i-j-1+\displ ...

  4. 【10.10校内测试】【线段树维护第k小+删除】【lca+主席树维护前驱后驱】

    贪心思想.将a排序后,对于每一个a,找到对应的删除m个后最小的b,每次更新答案即可. 如何删除才是合法并且最优的?首先,对于排了序的a,第$i$个那么之前就应该删除前$i-1$个a对应的b.剩下$m- ...

  5. windows下配置ssh(FreeSSHD + putty)

    windows下配置ssh(FreeSSHD + putty): 1.关于配置过程找到一篇很好的博客,推荐大家先好好看一下,这篇博文解决了大方向问题. 地址:http://blog.csdn.net/ ...

  6. Codeforces Round #297 (Div. 2)A. Vitaliy and Pie 水题

    Codeforces Round #297 (Div. 2)A. Vitaliy and Pie Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: xxx  ...

  7. UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP

    #17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4902  Solved: 1879 题目连接 http:// ...

  8. SVN 提交回滚

    取消对代码的修改分为两种情况:   第一种情况:改动没有被提交(commit). 这种情况下,使用svn revert就能取消之前的修改. svn revert用法如下: # svn revert [ ...

  9. HTML5学习笔记1

    1.HTML5概述 继html4和xhtml1.0后的超文本标记语言最新版本.最重要的三项技术:html5核心规范(标签元素),CSS3,JavaScript2008年发布,主要为了补全功能.特点:1 ...

  10. IE11 全新的F12开发者工具

      我讨厌debug,相信也没多少开发者会喜欢.但是当代码出错之后肯定是要找出问题出在哪里的.不过网页开发的时候遇到 BUG 是一件再正常不过的事情了,我们不能保证自己的代码万无一失,于是使用浏览器的 ...