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

#!/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. 特征向量、特征值以及降维方法(PCA、SVD、LDA)

    一.特征向量/特征值 Av = λv 如果把矩阵看作是一个运动,运动的方向叫做特征向量,运动的速度叫做特征值.对于上式,v为A矩阵的特征向量,λ为A矩阵的特征值. 假设:v不是A的速度(方向) 结果如 ...

  2. 关于PyCharm database查看db.sqlites文件无内容的一种可能解决方法

    初学python,学到了scrapy爬虫数据入库,在网上跟着一个视频课进行学习,但是碰到了如下问题: 这里新建了数据库文件之后,将这个.sqlite文件拖动到Database里面,然后出现了上图描述问 ...

  3. 通过TortoiseGit上传项目到GitHub

    1.安装msysgit和TortoiseGit : 2.TortoiseGit 设置: (1).确保安装成功: (2).设置用户名和邮箱: 3.登陆github并进入设置页面: 4.添加 SSH Ke ...

  4. 【推导】Codeforces Round #484 (Div. 2) C. Cut 'em all!

    题意:给你一棵树,让你切掉尽可能多的边,使得产生的所有连通块都有偶数个结点. 对于一棵子树,如果它有奇数个结点,你再从里面怎么抠掉偶数结点的连通块,它都不会变得合法.如果它本来就有偶数个结点,那么你怎 ...

  5. PHP中CGI,FastCGI,PHP-CGI与PHP-FPM对比

    CGI CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上. CGI可以用任何一 ...

  6. 读书笔记_Effective_C++_条款三十九:明智而审慎地使用private继承

    private继承的意义在于“be implemented in turns of”,这个与上一条款中说的复合模型的第二层含义是相同的,这也意味着通常我们可以在这两种设计方法之间转换,但书上还是更提倡 ...

  7. 云计算大会有感—MapReduce和UDF

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.參会有感       首先还是非常感谢CSDN能给我票,让我有机会參加这次中国云计算峰会.感觉不写点什么对不 ...

  8. Spartan-6 - How to connect *CMP* pins?

    http://www.xilinx.com/support/answers/35171.htm How to connect the following pins in my design? CMPM ...

  9. [MySql]windows下设置mysql默认编码

    摘要 在安装好mysql的时候,如果新建数据库或者表默认的编码为latin1,如果这时候插入中文时,出出现类似下面的乱码的问题. SQLException: Incorrect string valu ...

  10. MVC实现有关时间的进度条,使用jQuery ui的progressbar

    在电商网站中,有时候通过进度条来直观地显示用户是否到期以及用户当前的状态. 设计这样的一个Model. public class User { public int Id { get; set; } ...