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

#!/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. MySQL 语句分析

    公司使用的数据库是 MySQL 数据库,我对于 MySQL 的了解仅仅是上学的时候学过PHP略微了解. 我认为,作为一个后端程序员,除了在意功能能不能实现之外, 在实现功能之后,还要去想有没有更好的办 ...

  2. 「HNOI2018」转盘

    「HNOI2018」转盘 现场推出了大部分结论但是只写了 \(40\) 分暴力,被贺指导踩爆,现在还有点怀念 HNOI2018 贺指导对着镜子荒野行动的日子,那几天他云球迷瞎**指点篮球,被送上指导称 ...

  3. CF961E Tufurama 主席树

    对原问题进行转化 考虑对每个$i$,询问在$j \in [i + 1, a[i]]$中满足$a[j] \geqslant i$的个数 这样子可以做到不重不漏 个数满足差分的性质,使用主席树来维护即可 ...

  4. [POI2015]Odwiedziny

    [POI2015]Odwiedziny 题目大意: 一棵\(n(n\le5\times10^4)\)个点的树,\(n\)次询问从一个点到另一个点的路径上,每次跳\(k\)个点,所经过的点权和. 思路: ...

  5. Atlas 安装运行随笔

    Atlas 是一个用于数据库负载均衡 ,读写分离的中间件,他实现了mysql 的语法,对于普通调用DAL 层来说的话,和mysql 是一样的. 一,安装1,从源码安装 , 可以参考 http://bl ...

  6. hdoj 5119 Happy Matt Friends 背包DP

    Happy Matt Friends Time Limit: 6000/6000 MS (Java/Others) Memory Limit: 510000/510000 K (Java/Others ...

  7. Codeforces Round #294 (Div. 2)D - A and B and Interesting Substrings 字符串

    D. A and B and Interesting Substrings time limit per test 2 seconds memory limit per test 256 megaby ...

  8. 重温PHP之插入排序

    插入排序基本思路:将数组分为两个区(已排序区和未排序区),假定数组的第一个元素处于已排序区, 第一个元素之后的所有元素都处于未排序部分.排序时用到双层循环,外层循环用于从未排序部分中取出待排序元素,并 ...

  9. 事件冒泡与捕获&事件托付

    设想这样一种情况 一个div里面有个span元素  ,当鼠标单击span时,这个事件算是谁的? div还是span? 准确的说两个都触发了,这种认可大家都允许,事实就是这种, 第二个问题来了,这个事件 ...

  10. Tasker to proximity screen off

    If you are using proximity screen off pro or smart screen off, you may know how convenient it is to ...