xtrabackup自动还原脚本(一)

2015-11-21 01:53:38 · 作者: · 浏览: 17
xtrabackup自动还原

************************************************************************************************
应用场景:
************************************************************************************************

1.备份目录为/backup/full和/backup/incre的架构,前者保存全备,后者保存增量备份

2.如全备为/backup/full/2015-04-08_15-14-33则将全备的目录名2015-04-08_15-14-33
作为/backup/incre/下增量备份的目录名。这样设计的初衷在于只要全备不过期,那么
这个全备文件之后的增量备份也不过期.

3.还原时,脚本会自动找到最新的全备和最新全备命名的增量备份目录,并将增量备份
按照先后顺序应用日志到全备中,最后完成还原.

************************************************************************************************
脚本
************************************************************************************************
#!/bin/sh
#
# 使用方法:
# ./restore.sh /增量备份父目录
#ocpyang@126.com

#NOTE:恢复开始前请确保mysql服务停止以及数据和日志目录清空,如
# rm -rf /usr/local/mysql/innodb_data/*
# rm -rf /usr/local/mysql/data/*
# rm -rf /usr/local/mysql/mysql_logs/innodb_log/*


INNOBACKUPEX=innobackupex
INNOBACKUPEX_PATH=/usr/local/xtrabackup/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 PORTNUM00=`netstat -lnt|grep ${MYSQL_PORT}|wc -l` if [ $PORTNUM00 = 1 ]; then echo -e '\e[31m NOTE:------------------------------------------.\e[m' #红色 echo -e '\e[31m mysql处于运行状态,请关闭mysql. \e[m' #红色 echo -e '\e[31m NOTE:------------------------------------------.\e[m' #红色 exit 0 fi input_value=$1 intpu_res=`echo ${input_value%/*}` # Some info output echo "----------------------------" echo echo "$0: MySQL还原脚本" START_RESTORE_TIME=`date +%F' '%T' '%w` echo "数据库还原开始于: $START_RESTORE_TIME" echo #PARENT_DIR=`dirname ${intpu_res}` PARENT_DIR=${intpu_res} if [ $PARENT_DIR = $FULLBACKUP_DIR ]; then FULLBACKUP=${intpu_res} echo "还原全备备份:`basename $FULLBACKUP`" echo else if [ $PARENT_DIR = $INCRBACKUP_DIR ]; then