多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 數(shù)據(jù)庫 > 數(shù)據(jù)庫應(yīng)用 > xtrabackup自動(dòng)還原腳本v2

xtrabackup自動(dòng)還原腳本v2

來源:程序員人生   發(fā)布時(shí)間:2015-04-14 07:54:51 閱讀次數(shù):2989次
xtrabackup自動(dòng)還原


************************************************************************************************
利用場景:
************************************************************************************************


1.備份目錄為/backup/full和/backup/incre的架構(gòu),前者保存全備,后者保存增量備份


2.如全備為/backup/full/2015-04-08_15⑴4⑶3則將全備的目錄名2015-04-08_15⑴4⑶3
作為/backup/incre/下增量備份的目錄名。這樣設(shè)計(jì)的初衷在于只要全備不過期,那末
這個(gè)全備文件以后的增量備份也不過期.


3.還原時(shí),腳本會自動(dòng)找到最新的全備和最新全備命名的增量備份目錄,并將增量備份
依照前后順序利用日志到全備中,最后完成還原.


4.該版本增加了是不是恢復(fù)所有增量備份,默許是全部增量備份.


************************************************************************************************
腳本
************************************************************************************************


#!/bin/sh
#
# 使用方法:
# ./restore.sh /增量備份父目錄
#ocpyang@126.com


#NOTE:恢復(fù)開始前請確保mysql服務(wù)停止和數(shù)據(jù)和日志目錄清空,如
# rm -rf /usr/local/mysql/innodb_data/*
# rm -rf /usr/local/mysql/data/*
# rm -rf /usr/local/mysql/mysql_logs/innodb_log/*






INNOBACKUPEX=innobackupex
INNOBACKUPEX_PATH=/usr/local/xtrabackup/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 # 還原的時(shí)候使用的內(nèi)存限制數(shù)
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 ⑵ $TMP_LOG | grep 'completed OK!'`" ] ; then
    echo "$INNOBACKUPEX命令履行失敗:"; echo
    echo "---------- $INNOBACKUPEX的毛病輸出 ----------"
    cat $TMP_LOG
    #保存1份備份的詳細(xì)日志
    logfiledate=restore.`date +%Y%m%d%H%M`.txt
    cat $TMP_LOG>/backup/$logfiledate  
    rm -f $TMP_LOG
    exit 1
  fi
}


 






# 選項(xiàng)檢測
if [ ! -x $INNOBACKUPEX_PATH ]; then
  error "$INNOBACKUPEX_PATH在指定路徑不存在,請確認(rèn)是不是安裝或核實(shí)鏈接是不是正確."
fi


  


if [ ! -d $BACKUP_DIR ]; then
  error "備份目錄$BACKUP_DIR不存在.請新建備份主目錄$BACKUP_DIR"
fi


  


if [ $# != 1 ] ; then
  error "使用方法: $0 使用還原目錄的絕對路徑"
fi


  


if [ ! -d $1 ]; then
  error "指定的備份目錄:$1不存在."
fi






PORTNUM00=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`
if [ $PORTNUM00 = 1  ];
then
echo -e "e[31m NOTE:------------------------------------------.e[m" #紅色
echo -e "e[31m mysql處于運(yùn)行狀態(tài),請關(guān)閉mysql. e[m" #紅色
echo -e "e[31m NOTE:------------------------------------------.e[m" #紅色
exit 0
fi


################判斷還原增量備份部份還是所有################
ipname=''
read -p "輸入截止增量備份名[默許所有]:" ipname
echo  
echo "輸入截止增量備份名為:$ipname"




input_value=$1
intpu_res=`echo ${input_value%/*}` 






# Some info output
echo "----------------------------"
echo
echo "$0: MySQL還原腳本"
START_RESTORE_TIME=`date +%F' '%T' '%w`
echo "數(shù)據(jù)庫還原開始于: $START_RESTORE_TIME"
echo










#PARENT_DIR=`dirname ${intpu_res}`
PARENT_DIR=${intpu_res}


if [ $PARENT_DIR = $FULLBACKUP_DIR ]; then
FULL=`ls -t $FULLBACKUP_DIR |head ⑴`
FULLBACKUP=${intpu_res}/$FULL
echo "還原完全備份:`basename $FULLBACKUP`"
echo


else

################判斷還原增量備份部份還是所有################
if [ "$ipname" = '' ];then
 if [ $PARENT_DIR = $INCRBACKUP_DIR ]; then
FULL=`ls -t $FULLBACKUP_DIR |head ⑴`
FULLBACKUP=$FULLBACKUP_DIR/$FULL
if [ ! -d $FULLBACKUP ]; then
error "全備:$FULLBACKUP不存在."
fi
INCR=`ls -t $INCRBACKUP_DIR/$FULL/ |sort -nr | head ⑴ ` #查找最后1個(gè)增量備份文件
echo "還原將從全備全備$FULL開始,到增量$INCR結(jié)束."
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增量備份集,行將增量備份利用到全備目錄中,依照增量備份順序即依照時(shí)間從舊到最新
for i in `find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P " | sort -n `;
do


#判斷最新全備的lsn
#check_full_file=`find $FULLBACKUP/ -mindepth 1 -maxdepth 1 -type d -printf "%P " | sort -nr | head  ⑴`
   
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
   
fetch_full_lastlsn=`grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2`


######判斷增量備份中第1個(gè)增量備份的LSN
#check_incre_file=`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P " | sort -n |  head ⑴`
     
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}" ];then
echo "*****************************************"
echo "LSN相等,不需要prepare!"
echo "*****************************************"
echo
break



else
echo "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>&1
check_innobackupex_fail
 
if [ $INCR = $i ]; then
break
fi
    
fi 
######判斷LSN
done

else
error "未知的備份類型"
  fi


else
FULL=`ls -t $FULLBACKUP_DIR |head ⑴`
FULLBACKUP=$FULLBACKUP_DIR/$FULL
echo "Prepare:完全備份..........."
echo "*****************************"
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_fail





ipt=`stat -c=%Z  $PARENT_DIR/$FULL/$ipname |cut -d = -f 2`
echo "還原的指定增量目錄文件$ipname的紀(jì)元時(shí)間為:$ipt"
for i in `find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P " | sort -n `;
do
f01=`stat -c=%Z  $PARENT_DIR/$FULL/$i |cut -d = -f 2`
if [ "$f01" -le "$ipt" ]; then


if [ $PARENT_DIR = $INCRBACKUP_DIR ]; then
if [ ! -d $FULLBACKUP ]; then
error "全備:$FULLBACKUP不存在."
fi
#INCR=`ls -t $INCRBACKUP_DIR/$FULL/ |sort -nr | head ⑴`
echo "還原將從全備$FULL開始,到增量$ipname結(jié)束."
echo


#判斷最新全備的lsn
#check_full_file=`find $FULLBACKUP/ -mindepth 1 -maxdepth 1 -type d -printf "%P " | sort -nr | head  ⑴`
   
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
   
fetch_full_lastlsn=`grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2`


######判斷增量備份中第1個(gè)增量備份的LSN
check_incre_file=`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P " | sort -n |  head ⑴`
     
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}" ];then
echo "*****************************************"
echo "LSN不需要prepare!"
echo "*****************************************"
echo
break
else 
echo "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>&1
check_innobackupex_fail

fi 

######判斷LSN
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
   
fetch_full_lastlsn=`grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2`
echo "完全備份當(dāng)前的LSN:${fetch_full_lastlsn}"


else
error "未知的備份類型"
fi
else 
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" #紅色
break
fi
done


fi
#################判斷還原增量備份部份還是所有################



fi




echo 
echo "prepare:完全備份和回滾那些未提交的事務(wù)..........."
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_fail




echo "*****************************"
echo "數(shù)據(jù)庫還原中 ...請稍等"
echo "*****************************"


$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --copy-back $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_fail


  
rm -f $TMP_LOG
echo "1.恭喜,還原成功!."
echo "*****************************"




#修改目錄權(quán)限
echo "修改mysql目錄的權(quán)限."
mysqlcnf="/usr/local/mysql/my.cnf"
mysqldatadir=`grep -i "^basedir" $mysqlcnf |cut -d = -f 2`
`echo 'chown -R mysql:mysql' ${mysqldatadir}`
echo "2.權(quán)限修改成功!"
echo "*****************************"




#自動(dòng)啟動(dòng)mysql


INIT_NUM=1
if [ ! -x $MYSQLD_SAFE ]; then
  echo "mysql安裝時(shí)啟動(dòng)文件未安裝到$MYSQLD_SAFE或無履行權(quán)限"
  exit 1  #0是履行成功,1是履行不成功
else
echo "啟動(dòng)本機(jī)mysql端口為:$MYSQL_PORT的服務(wù)"
$MYSQLD_SAFE --defaults-file=$MY_CNF  > /dev/null &
while  [ $INIT_NUM  -le 8 ]
      do
        PORTNUM=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`
        echo "mysql啟動(dòng)中....請稍等..."
        sleep 5
        if [ $PORTNUM = 1  ];
        then
echo -e "e[32m mysql                                      ****啟動(dòng)成功**** e[m"
        exit 0
        fi
        INIT_NUM=$(($INIT_NUM +1))
      done
echo -e "e[31m mysql啟動(dòng)失敗或啟動(dòng)時(shí)間太長,請檢查毛病日志 `echo 'cat ' ${ERRORLOG}` e[m"
echo "*****************************************"
exit 0
fi








END_RESTORE_TIME=`date +%F' '%T' '%w`
echo "數(shù)據(jù)庫還原完成于: $END_RESTORE_TIME"
exit 0








************************************************************************************************
履行結(jié)果:
************************************************************************************************
 
# ./restore.sh /backup/incre/ 
輸入截止增量備份名[默許所有]:2015-04⑴0_14⑴0⑷9


輸入截止增量備份名為:2015-04⑴0_14⑴0⑷9
----------------------------


./restore.sh: MySQL還原腳本
數(shù)據(jù)庫還原開始于: 2015-04⑴0 14:24:51 5


Prepare:完全備份...........
*****************************
還原的指定增量目錄文件2015-04⑴0_14⑴0⑷9的紀(jì)元時(shí)間為:1428646269
還原將從全備2015-04⑴0_14-05⑷0開始,到增量2015-04⑴0_14⑴0⑷9結(jié)束.


完全備份的LSN: 344693290 
增量備份的LSN: 413297865 
Prepare:增量備份集2015-04⑴0_14-08⑴9........
*****************************
完全備份當(dāng)前的LSN: 413297865
還原將從全備2015-04⑴0_14-05⑷0開始,到增量2015-04⑴0_14⑴0⑷9結(jié)束.


完全備份的LSN: 413297865 
增量備份的LSN: 481905295 
Prepare:增量備份集2015-04⑴0_14-09-07........
*****************************
完全備份當(dāng)前的LSN: 481905295
還原將從全備2015-04⑴0_14-05⑷0開始,到增量2015-04⑴0_14⑴0⑷9結(jié)束.


完全備份的LSN: 481905295 
增量備份的LSN: 550515490 
Prepare:增量備份集2015-04⑴0_14⑴0⑷9........
*****************************
完全備份當(dāng)前的LSN: 550515490
查找增量備份文件完成.
 -------------------------------------------- 
 完全備份終究的LSN: 550515490 
 -------------------------------------------- 


prepare:完全備份和回滾那些未提交的事務(wù)...........
*****************************
數(shù)據(jù)庫還原中 ...請稍等
*****************************
1.恭喜,還原成功!.
*****************************
修改mysql目錄的權(quán)限.
2.權(quán)限修改成功!
*****************************
啟動(dòng)本機(jī)mysql端口為:3306的服務(wù)
mysql啟動(dòng)中....請稍等...
mysql啟動(dòng)中....請稍等...
mysql啟動(dòng)中....請稍等...
 mysql                                      ****啟動(dòng)成功**** 
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产一级淫片a免费播放口 国产一级淫片a免费播放口欧美 | 国产农村一一级特黄毛片 | 一区中文字幕 | 日韩欧美在线视频 | 日韩视频观看 | 日本高清免费视频色www | 国产老妇女 | 粉嫩00福利视频在线精品 | 亚洲欧美一区二区三区久久 | 国产精品福利在线观看秒播 | 国产精品视频一区二区三区不卡 | 日韩欧美高清视频 | 韩国三级在线观看我不卡 | 级毛片| 最新久久精品 | 淫片在线观看 | www黄色| 亚洲国产欧美日韩精品一区二区三区 | 国产精品亚洲综合第一区 | 久久男人 | 欧美操人视频 | www.黄色网 | 国产99视频精品免视看7 | 国产日韩高清一区二区三区 | www.羞羞| 亚洲欧美日韩国产综合高清 | 综合九九 | 欧美精品1区2区 | 日韩免费看片 | 国产精品国产三级国产普通话对白 | 欧美在线天堂 | 亚洲区欧美| 欧美日韩一区二区三区视频 | 欧美一区二区三区在线可观看 | 美女啪啪国产 | www免费视频com | free性日韩女人frhd | 日韩精品a在线视频 | videos雌雄同体xxxx视频 | freexxxhd性欧美 | 天啦噜tianlalu精品视频 |