实战: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\n " | 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\n " | 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\n" | 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