#!/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
查看更多关于实战:INNOBACKUPEXformysql5.6自动还原脚本 - mysql数据的详细内容...