修复了几个bug,共享一下!


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


     


    # Prepare增量备份集

    for i in `find $PARENT_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n`; do


      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

    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 "启动本机mysql端口为:$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