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


     

  • 相关阅读:
    leetcode Remove Linked List Elements
    leetcode Word Pattern
    leetcode Isomorphic Strings
    leetcode Valid Parentheses
    leetcode Remove Nth Node From End of List
    leetcode Contains Duplicate II
    leetcode Rectangle Area
    leetcode Length of Last Word
    leetcode Valid Sudoku
    leetcode Reverse Bits
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6693973.html
Copyright © 2011-2022 走看看