首页 > 代码库 > 实战:INNOBACKUPEX for mysql 5.6自动还原脚本

实战:INNOBACKUPEX for mysql 5.6自动还原脚本

 

#!/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 # 还原的时候使用的内存限制数

 

#############################################################################

#显示错误

#############################################################################

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`
`echo ‘chown -R mysql:mysql‘ ${mysqldatadir:8}`
echo "3.权限修改成功!"
echo "*****************************"


#自动启动mysql
echo -n "请输入确认启动mysql[1]:"
read var
echo "你输入的是$var"
errorlog=`grep -i "^log-error" $MY_CNF`
if [ $var = 1 ]  ; then
echo "mysql启动中............"
`/usr/local/mysql/bin/mysqld_safe  > /dev/null & `
sleep 10 
 PortNum=`netstat -lnt|grep 3306|wc -l`
 if [ $PortNum = 1  ];
 then
  echo "4.mysql启动成功"
 echo "*****************************"
 else
   echo "4.mysql启动失败,请检查错误日志$errorlog"
 echo "*****************************************"
 fi
 exit 0
else
echo "输入不正确!"
fi

 

END_RESTORE_TIME=`date +%F‘ ‘%T‘ ‘%w`
echo "数据库还原完成于: $END_RESTORE_TIME"
exit 0