Heim  >  Artikel  >  Datenbank  >  实战:INNOBACKUPEXformysql5.6自动还原脚本_MySQL

实战:INNOBACKUPEXformysql5.6自动还原脚本_MySQL

WBOY
WBOYOriginal
2016-06-01 13:08:40860Durchsuche

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn