mysql數(shù)據(jù)庫binlog日志的異地備份-創(chuàng)新互聯(lián)

    MySQL數(shù)據(jù)庫的二進(jìn)制日志binlog記錄了對數(shù)據(jù)庫的全量DDL和DML操作,對數(shù)據(jù)庫的point to point災(zāi)難恢復(fù)起著無法替代的關(guān)鍵作用。因此,基于此類考慮,需要對生產(chǎn)環(huán)境產(chǎn)生的binlog做好相應(yīng)的備份措施。

創(chuàng)新互聯(lián)專注于克拉瑪依企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),成都商城網(wǎng)站開發(fā)??死斠谰W(wǎng)站建設(shè)公司,為克拉瑪依等地區(qū)提供建站服務(wù)。全流程按需制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

    這里主要談及2種備份方法,一種通過腳本定時調(diào)度的方式,強(qiáng)行切換binlog,增量備份二進(jìn)制binlog。另一種則是通過mysqlbinlog的遠(yuǎn)程實(shí)時備份的方式實(shí)現(xiàn)binlog備份。

    1、基于flush logs方式實(shí)現(xiàn)binlog文件切換

    基本原理:通過last_binlog_pos.txt文件記錄上一次備份的位置點(diǎn)信息,下一次備份基于該位置點(diǎn)信息進(jìn)行增量備份。如果是首次備份(last_binlog_pos.txt文件不存在,則全量備份binlog);通過flush logs的方式強(qiáng)行切換binlog文件(只備份到次新的binlog文件),避免備份binlog過程中,MySQL仍對其進(jìn)行寫入操作;備份每個binlog文件對其生產(chǎn)側(cè)和備份側(cè)的binlog文件md5值進(jìn)行校驗(yàn),校驗(yàn)不通過通過配置重傳次數(shù)$num,超過重傳次數(shù)仍md5值校驗(yàn)不通過的話,放棄該binlog備份并記錄到日志。

    腳本如下:

#!/bin/sh ######腳本功能:本地定時備份生產(chǎn)目錄的binlog到備份目錄。##### user="root" password="linzj" port="3306" host="localhost" name=`hostname` last_binlog_dir="/home/mysql/chkpoint" last_binlog_pos="$last_binlog_dir/last_binlog_pos.txt"  ###上一次備份的位置點(diǎn) binlog_backup_dir="/tmp/logbak/$name"                       ###binlog異地存放目錄 mysqlcommand="mysql -u$user -p$password -h$host -P$port -N --protocol=tcp -e " logdir="/home/mysql/log" binlogfile="$logdir/binlog_bak.log" ###腳本運(yùn)行日志存放的目錄必須先行存在,否則后續(xù)寫日志會報(bào)日志文件不存在的問題 if [ ! -d $logdir ] then     mkdir -p $logdir fi function create_timestamps() {     text=$1     echo "$(date +%Y%m%d-%H:%M:%S):$text" >>$binlogfile } function init_binlog_backup_dir() {     ###判斷存放上一次備份位置點(diǎn)的目錄是否存在,不存在就創(chuàng)建     if [ ! -d $last_binlog_dir ]     then         #echo "$(date +%Y%m%d-%H:%M:%S):last binlog save dir is not existed, now create it !!!">>$binlogfile         create_timestamps "last binlog save dir is not existed, now create it !!!"         mkdir -p $last_binlog_dir     fi     ###判斷備份目錄是否存在,不存在就創(chuàng)建     if [ ! -d $binlog_backup_dir ]     then         #echo "$(date +%Y%m%d-%H:%M:%S):binlog backup dir is not existed, now create it !!!">>$binlogfile         create_timestamps "binlog backup dir is not existed, now create it !!!"         mkdir -p $binlog_backup_dir     fi } function binlog_backup() {     ###獲取存放binlog日志的目錄     binlog_dir=`$mysqlcommand "show variables like 'log_bin_index';" 2>/dev/null|awk '{print "dirname "$2}'|sh`     ###獲取binlog日志的index文件名     binlog_index=`$mysqlcommand "show variables like 'log_bin_index';" 2>/dev/null|awk '{print $2}'`          ###獲取binlog日志的個數(shù)信息     binlog_num=`wc -l $binlog_index|awk '{print $1}'`     ###如果是首次備份,偏移量binlog_start為1;如果非首次備份,偏移量binlog_start為上次偏移量+1。     if [ ! -f "$last_binlog_pos" ]       then         binlog_start="1"     else         binlog_last_file=`cat $last_binlog_pos|awk -F \/ '{print $NF}'`         binlog_last=`grep -n $binlog_last_file $binlog_index|awk -F \: '{print $1}'`         binlog_start=`expr ${binlog_last} + 1 `     fi          #echo "binlog_start is $binlog_start"     #flush logs,強(qiáng)制切換到新的binlog文件,避免備份當(dāng)前最新的binlog文件時,mysql仍對其進(jìn)行寫操作###     $mysqlcommand "flush logs" 2>/dev/null        for (( i=$binlog_start;i<=$binlog_num;i++ ))     do         if [ $i == $binlog_num ]         then             ##記錄當(dāng)次備份的最后一個binlog文件,作為本次備份的位置點(diǎn)信息             sed -n "${i}p" $binlog_index > $last_binlog_pos         fi         cd $binlog_dir         logfile=`sed -n "${i}p" $binlog_index|awk '{print "basename "$1}'|sh`                  num=5       ###重傳次數(shù)限制         ###如果拷貝的binlog文件md5值對應(yīng)不上,嘗試重傳$num次,md5值依然對不上,放棄備份binlog并記錄日志。         for(( j=1;j<=$num;j++ ))         do             cp $logfile $binlog_backup_dir             md5_source=`md5sum $logfile|awk '{print $1}'`             md5_backup=`md5sum $binlog_backup_dir/$logfile|awk '{print $1}'`             if [ "$md5_source" = "$md5_backup" ]             then                 gzip $binlog_backup_dir/$logfile                 echo "$(date +%Y%m%d-%H:%M:%S):$logfile backup to the $binlog_backup_dir sucessfully." >> $binlogfile                 break             fi             if [ "$j" == "$num" ]             then                 rm -fr $binlog_backup_dir/$logfile                 echo "$(date +%Y%m%d-%H:%M:%S):$logfile can not backup to the $binlog_backup_dir sucessfully,please check !!!"  >> $binlogfile             fi         done     done } create_timestamps "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"  create_timestamps "the binlog backup start now !!!"                                     init_binlog_backup_dir                                                                  binlog_backup                                                                           create_timestamps "the binlog backup end   now !!!"                                     create_timestamps "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"

    2、通過mysqlbinlog方式實(shí)現(xiàn)遠(yuǎn)程異地備份binlog。

    基本原理:通過mysqlbinlog的--read-from-remote-server、 --stop-never參數(shù)實(shí)現(xiàn)異地binlog實(shí)時備份。通過while死循環(huán)的方式,避免由于網(wǎng)絡(luò)等異常造成的斷連。

    腳本如下:

#!/bin/sh BACKUP_BIN="mysqlbinlog" LOCAL_BACKUP_DIR="/mysqlbackup/logbak/mysql2/"                                          ###異地存放binlog的目錄 BACKUP_LOG="/home/mysql/log/binlog_log" REMOTE_HOST="192.168.124.132" REMOTE_PORT="3306" REMOTE_USER="root" REMOTE_PASS="linzj" MYSQLCOMMAND="mysql -u$REMOTE_USER -p$REMOTE_PASS -P$REMOTE_PORT --protocol=tcp -N -e " FIRST_BINLOG=$($MYSQLCOMMAND "show binary logs" 2>/dev/null|head -1|awk '{print $1}')   ###獲取當(dāng)前數(shù)據(jù)庫最老的binlog if [ ! $FIRST_BINLOG ] then   echo "無法獲取binlog信息,請檢查數(shù)據(jù)庫帳號權(quán)限和當(dāng)前數(shù)據(jù)庫是否打開binlog日志"   exit fi #time to wait before reconnecting after failure SLEEP_SECONDS=10 ##create local_backup_dir if necessary mkdir -p ${LOCAL_BACKUP_DIR} cd ${LOCAL_BACKUP_DIR} ## 運(yùn)行while循環(huán),連接斷開后等待指定時間,重新連接 while : do   if [ `ls -A "${LOCAL_BACKUP_DIR}" |wc -l` -eq 0 ];then      LAST_FILE=${FIRST_BINLOG}   else      LAST_FILE=`ls -l ${LOCAL_BACKUP_DIR} | tail -n 1 |awk '{print $9}'`   fi   ${BACKUP_BIN} --raw --read-from-remote-server --stop-never --host=${REMOTE_HOST} --port=${REMOTE_PORT} --user=${REMOTE_USER} --password=${REMOTE_PASS} ${LAST_FILE}    echo "`date +"%Y/%m/%d %H:%M:%S"` mysqlbinlog停止,返回代碼:$?" | tee -a ${BACKUP_LOG}   echo "${SLEEP_SECONDS}秒后再次連接并繼續(xù)備份" | tee -a ${BACKUP_LOG}     sleep ${SLEEP_SECONDS} done

    綜上所述,這兩種binlog備份的方式各有優(yōu)缺點(diǎn):

    缺點(diǎn):

    第一種方式,必須通過定時調(diào)度的方式實(shí)現(xiàn)備份,極端情況下存在丟失binlog的可能(在兩個定時調(diào)度的窗口時間,MySQL異常并且所有生產(chǎn)binlog不可用,這個窗口時間產(chǎn)生的binlog無法備份到)。

    第二種方式,通過mysqlbinlog的功能去實(shí)現(xiàn)實(shí)時備份,無法確認(rèn)備份的可用性,即無法通過對比文件md5值來判斷文件是否同生產(chǎn)環(huán)境保持一致。極端情況下會出現(xiàn)異常(網(wǎng)絡(luò)異常造成的斷連并且備份路徑的binlog被誤操作),因?yàn)閿噙B是通過while死循環(huán)去實(shí)現(xiàn)重連的,而重連的位置點(diǎn)信息是基于備份路徑下的最新binlog文件。

    優(yōu)點(diǎn):

    第一種方式,可以通過驗(yàn)證md5值的方式確保備份同生產(chǎn)的一致性。備份的邏輯簡單,便于理解。

    第二種方式,可以實(shí)現(xiàn)binlog實(shí)時備份功能。

    所以,基于以上的優(yōu)缺點(diǎn)分析,選擇哪種備份策略,仍需要根據(jù)生產(chǎn)環(huán)境的實(shí)際需要進(jìn)行抉擇。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

本文名稱:mysql數(shù)據(jù)庫binlog日志的異地備份-創(chuàng)新互聯(lián)
分享地址:http://muchs.cn/article20/dhiijo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、營銷型網(wǎng)站建設(shè)、云服務(wù)器、域名注冊、虛擬主機(jī)、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)