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

#!/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主从复制(Replication)(MySQL数据同步)配置

    MySQL是开源的关系型数据库系统.复制(Replication)是从一台MySQL数据库服务器(主服务器master)复制数据到另一个服务器(从服务器slave)的一个进程. 配置主服务器(mast ...

  2. 聊聊用CSS3来玩立方体

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 虽然现在很多浏览器都还不支持css3的3D转换,不过估计也已经有很多人都有玩css3的3D了......所以我这篇也就相当于水一下了,哈哈 ...

  3. BZOJ 4197 NOI 2015 寿司晚宴 状压DP

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 694  Solved: 440[Submit][Status] ...

  4. PHP--SPL扩展学习笔记

    一. SPL是干嘛的 SPL是用于解决典型问题(standard problems)的一组接口与类的集合. 数据结构: .实现双向列表 SplDoublyLinkedList implements I ...

  5. Null 和 Undefined

    在JavaScript中存在这样两种原始类型:Null与Undefined.这两种类型常常会使JavaScript的开发人员产生疑惑,在什么时候是Null,什么时候又是Undefined? Undef ...

  6. ROS知识(9)----NodeHandle命令空间问题

    一直被NodleHandle的构造函数的命名空间搞混淆了.例如: ros::NodeHandle node_private("~/"); ros::NodeHandle node_ ...

  7. LAMP LNMP 和 LNMPA

    LAMP指的是:Linux+Apache+MySQL+Perl/PHP/Python LAMP是一个缩写,它指一组通常一起使用来运行动态网站或者服务器的自由软件: Linux,操作系统: Apache ...

  8. MYSQL 源代码编绎脚本

    http://blog.csdn.net/hopingwhite/article/details/5808101

  9. Windows操作系统下的MySQL主从复制及读写分离

    一.主服务器(master)配置 1.修改MySQL配置文件my.ini [mysqld] log-bin=mysql-binlog-bin-index=mysql-bin.indexserver-i ...

  10. C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序

    本篇主要体验:编写C#,IL代码,用"VS2012开发人员命令提示"编译成程序集,并运行程序. □ C#文件编译为程序集 →在F盘创建as文件夹→在as文件夹下创建MyClass. ...