MySQL的恢複指令碼

來源:互聯網
上載者:User

標籤:***   nbsp   2.3   設計   app   .net   tor   執行   絕對路徑   

原文轉自:

http://blog.csdn.net/dbanote/article/details/13295727

應用情境:************************************************************************************************1.備份目錄為/backup/full和/backup/incre的架構,前者儲存全備,後者儲存增量備份2.如全備為/backup/full/2015-04-08_15-14-33則將全備的目錄名2015-04-08_15-14-33作為/backup/incre/下增量備份的目錄名。這樣設計的初衷在於只要全備不到期,那麼這個全備檔案之後的增量備份也不到期.3.還原時,指令碼會自動找到最新的全備和最新全備命名的增量備份目錄,並將增量備份按照先後順序應用日誌到全備中,最後完成還原.4.該版本增加了是否恢複所有增量備份,預設是全部增量備份.************************************************************************************************指令碼************************************************************************************************#!/bin/sh#[email protected]#xtrabackup 2.3.3# 使用方法:# ./restore.sh /增量備份父目錄或全備的父目錄名#eg1:./restore.sh /data/backup/full/#eg2:./restore.sh /data/backup/incre/#NOTICE:增量備份還原如果指定檔案,則還原到指定檔案名稱的上一個檔案末截止.#即輸入的增量檔案名稱應為需要截止的增量檔案名稱的下一個檔案#NOTE:恢複開始前請確保mysql服務停止以及資料和日誌目錄清空,如# rm -rf /data/mysql/innodb_data/*# rm -rf /data/mysql/data/*# rm -rf /data/mysql/mysql_logs/innodb_log/*echo "*************************************************************************"echo -e ‘\e[32m 提示:mysql連接埠根據實際環境修改. \e[m‘ #紅色echo "*************************************************************************"INNOBACKUPEX=innobackupexINNOBACKUPEX_PATH=/usr/local/xtrabackup/bin/$INNOBACKUPEXTMP_LOG="/var/log/restore.$$.log"MY_CNF=/etc/my.cnfBACKUP_DIR=/data/backup # 你的備份主目錄FULLBACKUP_DIR=$BACKUP_DIR/full # 全庫備份的目錄INCRBACKUP_DIR=$BACKUP_DIR/incre # 增量備份的目錄MEMORY=2048M # 還原的時候使用的記憶體限制數ERRORLOG=`grep -i "^log-error" $MY_CNF |cut -d = -f 2`MYSQLD_SAFE=/data/mysql/bin/mysqld_safeMYSQL_PORT=33107##############################################################################顯示錯誤#############################################################################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不存在.請建立備份主目錄$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 0fi ################判斷還原增量備份部分還是所有################echo "*************************************************************************"echo -e "\e[31m 輸入的增量檔案名稱應為截止的增量檔案名稱的下一個檔案.\e[m" #紅色echo "*************************************************************************"ipname=‘‘read -p "輸入截止增量備份名[預設所有]:" ipnameechoecho "輸入截止增量備份名為:$ipname"input_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 ]; thenFULL=`ls -t $FULLBACKUP_DIR |head -1`FULLBACKUP=${intpu_res}/$FULLecho "還原完全備份:`basename $FULLBACKUP`"echoelse################判斷還原部分增量備份還是所有增量備份################if [ "$ipname" = ‘‘ ];then if [ $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/ |sort -nr | 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`######判斷增量備份中第一個增量備份的LSN#check_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 "完全備份$FULLBACKUP的LSN值:${fetch_full_lastlsn} "echo "增量備份$i的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 "未知的備份類型"  fielseFULL=`ls -t $FULLBACKUP_DIR |head -1`FULLBACKUP=$FULLBACKUP_DIR/$FULLecho "Prepare:完整備份..........."echo "*****************************"$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1check_innobackupex_failipt=`stat -c=%Z  $PARENT_DIR/$FULL/$ipname |cut -d = -f 2`echo "還原的指定增量目錄檔案$ipname的紀元時間為:$ipt"for i in `find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n `;do#判斷for迴圈取到的檔案名稱是否為輸入的檔案名稱,如果是則停止迴圈if [ "$i" =  "$ipname" ]; thenbreak;elsef01=`stat -c=%Z  $PARENT_DIR/$FULL/$i |cut -d = -f 2`if [ "$f01" -le "$ipt" ]; thenif [ $PARENT_DIR = $INCRBACKUP_DIR ]; thenif [ ! -d $FULLBACKUP ]; thenerror "全備:$FULLBACKUP不存在."fi#INCR=`ls -t $INCRBACKUP_DIR/$FULL/ |sort -nr | head -1`echo "還原將從全備$FULL開始,到增量$ipname結束."echo#判斷最新全備的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 -e "\e[31m LSN不需要prepare或備份間隔期間無資料變化 \e[m" #紅色echo "*****************************************"fi echoecho "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######判斷LSNcheck_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints   fetch_full_lastlsn=`grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2`echo "完全備份當前的LSN:${fetch_full_lastlsn}"elseerror "未知的備份類型"fielse echo "尋找增量備份檔案完成."check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints   fetch_full_lastlsn=`grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2`echo -e "\e[31m -------------------------------------------- \e[m" #紅色echo -e "\e[31m 完全備份最終的LSN:${fetch_full_lastlsn} \e[m" #紅色echo -e "\e[31m -------------------------------------------- \e[m" #紅色breakfifidonefi################判斷還原部分增量備份還是所有增量備份################fiecho echo "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="/data/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 10 ]      do        PORTNUM=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`        echo "mysql啟動中....請稍等..."        sleep 10        if [ $PORTNUM = 1  ];        thenecho -e "\e[32m mysql                                      ****啟動成功**** \e[m"        exit 0        fi         INIT_NUM=$(($INIT_NUM +1))      doneecho -e "\e[31m mysql啟動失敗或啟動時間過長,請檢查錯誤記錄檔 `echo ‘cat ‘ ${ERRORLOG}` \e[m"echo "*****************************************"exit 0fiEND_RESTORE_TIME=`date +%F‘ ‘%T‘ ‘%w`echo "資料庫還原完成於: $END_RESTORE_TIME"exit 0************************************************************************************************執行結果:************************************************************************************************ # ./restore.sh /backup/incre/ 輸入截止增量備份名[預設所有]:2015-04-10_14-10-49輸入截止增量備份名為:2015-04-10_14-10-49----------------------------./restore.sh: MySQL還原指令碼資料庫還原開始於: 2015-04-10 14:24:51 5Prepare:完整備份...........*****************************還原的指定增量目錄檔案2015-04-10_14-10-49的紀元時間為:1428646269還原將從全備2015-04-10_14-05-40開始,到增量2015-04-10_14-10-49結束.完全備份的LSN: 344693290 增量備份的LSN: 413297865 Prepare:增量備份集2015-04-10_14-08-19........*****************************完全備份當前的LSN: 413297865還原將從全備2015-04-10_14-05-40開始,到增量2015-04-10_14-10-49結束.完全備份的LSN: 413297865 增量備份的LSN: 481905295 Prepare:增量備份集2015-04-10_14-09-07........*****************************完全備份當前的LSN: 481905295還原將從全備2015-04-10_14-05-40開始,到增量2015-04-10_14-10-49結束.完全備份的LSN: 481905295 增量備份的LSN: 550515490 Prepare:增量備份集2015-04-10_14-10-49........*****************************完全備份當前的LSN: 550515490尋找增量備份檔案完成. --------------------------------------------  完全備份最終的LSN: 550515490  -------------------------------------------- prepare:完整備份以及復原那些未提交的事務...........*****************************資料庫還原中 ...請稍等*****************************1.恭喜,還原成功!.*****************************修改mysql目錄的許可權.2.許可權修改成功!*****************************啟動本機mysql連接埠為:3306的服務mysql啟動中....請稍等...mysql啟動中....請稍等...mysql啟動中....請稍等... mysql                                      ****啟動成功****  

 

MySQL的恢複指令碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.