zoukankan      html  css  js  c++  java
  • 实战:INNOBACKUPEX for mysql 5.6自己主动还原脚本-v2

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

    #!/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 " | 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 " | 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 " | 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


     

  • 相关阅读:
    Zookeeper ZAB 协议分析
    Docker技术快速精通指南
    Oracle闪回技术详解
    怎样打造一个分布式数据库
    使用js冒泡实现点击空白处关闭弹窗
    也谈谈我对Docker的简单理解
    Docker技术快速精通指南
    Oracle优化网上常见的5个错误观点
    使用Spring AOP实现MySQL读写分离
    RESTEASY ,从学会使用到了解原理。
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6693973.html
Copyright © 2011-2022 走看看