xtrabackup自動還原指令碼,xtrabackup指令碼

來源:互聯網
上載者:User

xtrabackup自動還原指令碼,xtrabackup指令碼

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=innobackupexINNOBACKUPEX_PATH=/usr/local/xtrabackup/bin/$INNOBACKUPEXTMP_LOG="/var/log/restore.$$.log"MY_CNF=/usr/local/mysql/my.cnfBACKUP_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_safeMYSQL_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不存在."fiPORTNUM00=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`if [ $PORTNUM00 = 1  ];thenecho -e '\e[31m NOTE:------------------------------------------.\e[m' #紅色echo -e '\e[31m mysql處於運行狀態,請關閉mysql. \e[m' #紅色echo -e '\e[31m NOTE:------------------------------------------.\e[m' #紅色exit 0fiinput_value=$1intpu_res=`echo ${input_value%/*}` # Some info outputecho "----------------------------"echoecho "$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 ]; thenFULLBACKUP=${intpu_res}echo "還原全備備份:`basename $FULLBACKUP`"echoelseif [ $PARENT_DIR = $INCRBACKUP_DIR ]; thenFULL=`ls -t $FULLBACKUP_DIR |head -1`FULLBACKUP=$FULLBACKUP_DIR/$FULLif [ ! -d $FULLBACKUP ]; thenerror "全備:$FULLBACKUP不存在."fiINCR=`ls -t $INCRBACKUP_DIR/$FULL/ | head -1`echo "還原將從全備$FULL開始,到增量$INCR結束."echoecho "Prepare:完整備份集..........."echo "*****************************"$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1check_innobackupex_fail         # Prepare增量備份集,即將增量備份應用到全備目錄中,按照增量備份順序即按照時間從舊到最新for i in `find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n `;do#判斷最新全備的lsn#check_full_file=`find $FULLBACKUP/ -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head  -1`    check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints    fetch_full_lastlsn=`grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2`######判斷增量備份中第一個增量備份的LSNcheck_incre_file=`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n |  head -1`      check_incre_lastlsn=$PARENT_DIR/$FULL/$i/xtrabackup_checkpoints      fetch_incre_lastlsn=`grep -i "^last_lsn" ${check_incre_lastlsn} |cut -d = -f 2`echo "完全備份的LSN:${fetch_full_lastlsn} "echo "增量備份的LSN:${fetch_incre_lastlsn} "if [ "${fetch_incre_lastlsn}" -eq "${fetch_full_lastlsn}" ];thenecho "*****************************************"echo "LSN不需要prepare!"echo "*****************************************"echobreakelseecho "Prepare:增量備份集$i........"echo "*****************************"$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP --incremental-dir=$PARENT_DIR/$FULL/$i > $TMP_LOG 2>&1check_innobackupex_fail  if [ $INCR = $i ]; thenbreakfi     fi ######判斷LSNdoneelseerror "未知的備份類型"fifiecho "prepare:全備集復原那些未提交的事務..........."$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1check_innobackupex_failecho "*****************************"echo "資料庫還原中 ...請稍等"echo "*****************************"$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --copy-back $FULLBACKUP > $TMP_LOG 2>&1check_innobackupex_fail  rm -f $TMP_LOGecho "1.恭喜,還原成功!."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 "2.許可權修改成功!"echo "*****************************"#自動啟動mysqlINIT_NUM=1if [ ! -x $MYSQLD_SAFE ]; then  echo "mysql安裝時開機檔案未安裝到$MYSQLD_SAFE或無執行許可權"  exit 1  #0是執行成功,1是執行不成功elseecho "啟動本機mysql連接埠為:$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 0fiEND_RESTORE_TIME=`date +%F' '%T' '%w`echo "資料庫還原完成於: $END_RESTORE_TIME"exit 0************************************************************************************************執行結果:************************************************************************************************  執行結果如下: #./restore.sh  /backup/incre/----------------------------./restore.sh: MySQL還原指令碼資料庫還原開始於: 2015-04-08 15:17:14 3還原將從全備2015-04-08_15-14-33開始,到增量2015-04-08_15-16-06結束.Prepare:完整備份集...........*****************************完全備份的LSN: 62974601 增量備份的LSN: 124278446 Prepare:增量備份集2015-04-08_15-15-25........*****************************完全備份的LSN: 124278446 增量備份的LSN: 185584722 Prepare:增量備份集2015-04-08_15-16-06........*****************************prepare:全備集復原那些未提交的事務...........*****************************資料庫還原中 ...請稍等*****************************1.恭喜,還原成功!.*****************************修改mysql目錄的許可權.2.許可權修改成功!*****************************啟動本機mysql連接埠為:3306的服務3.mysql啟動中....請稍等...3.mysql啟動中....請稍等...3.mysql啟動中....請稍等...mysql                                      ****啟動成功****

相關關鍵詞:
相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.