溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

mysqldump5.7以下版本如何實現(xiàn)并發(fā)備份

發(fā)布時間:2021-11-02 17:21:19 來源:億速云 閱讀:309 作者:小新 欄目:MySQL數(shù)據(jù)庫

這篇文章主要為大家展示了“mysqldump5.7以下版本如何實現(xiàn)并發(fā)備份”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“mysqldump5.7以下版本如何實現(xiàn)并發(fā)備份”這篇文章吧。

mysqldump5.7以下版本多線程備份單表

【背景說明】

mysqldump適用于備份單表,或者數(shù)量級較小的庫的備份。一般情況下innobackupex備份數(shù)量級大的庫,速度是很快的。但是其瓶頸在于如果業(yè)務(wù)需要多實例部分對象遷移到新的實例里,此時就無法滿足該情況。(mysqldumper在此不做討論)。

下面簡單列舉mysqldump適用的場景:

  • 備份多個單表

  • 備份一個或多個庫

  • 備份存儲過程、自定義函數(shù)或事件

  • 只備份數(shù)據(jù)不備份表結(jié)構(gòu)

  • 只備份表結(jié)構(gòu)不備份數(shù)據(jù)

  • 其他

mysqldump雖然使用起來比較靈活,但是它無法實現(xiàn)并發(fā)備份,故本文描述的就是實現(xiàn)如何用mysqldump實現(xiàn)并發(fā)備份

【思路說明】

把需要備份的一個庫或多個庫,提取這些庫下面所有的表進行一個個備份:這樣可以利用腳本進行多線程備份這些單表,從而實現(xiàn)庫級的并發(fā)備份。

【具體腳本】

點擊(此處)折疊或打開

  1. #!/bin/bash

  2. #注釋:mysqldump多線程備份多表

  3. #Auther:cyt

  4. #date:2016-06-23

  5. #按照多實例循環(huán)框架

  6. function instance()

  7. {

  8.         for port in `ps -ef | grep -v -E "mysqld_safe|awk" | awk '/mysqld /,/port=/''{for(i=1;i<=NF;i++){if($i~/port=/) print gsub(/--port=/,""),$i}}' | awk '{print $2}'`

  9.           do

  10.              ##避免循環(huán)的port和sock不匹配

  11.              sock=`ps -ef | grep "${port}"| grep -v -E "mysqld_safe|awk" | awk '/mysqld /,/socket=/''{for(i=1;i<=NF;i++){if($i~/socket=/) print gsub(/--socket=/,""),$i}}' | awk '{print $2}'`

  12.              #由于該腳本是并行備份,以防由于繁忙,導(dǎo)致獲取不到dump連接,故將該參數(shù)調(diào)大(備份完后會調(diào)小)

  13.              mysql -u$DB_USER -p$DB_PASSWORD --host= --socket=$sock --host=$host -BN -e "SET GLOBAL net_write_timeout=1800";

  14.              #調(diào)用輸出備份命令的日志函數(shù)

  15.              log

  16.              echo "-----端口號為"$port"的mysql實例開始按表并發(fā)備份:開始時間為"`date "+%Y-%m-%d %H:%M:%S"`

  17.              #調(diào)用備份函數(shù)

  18.              dumpAllTable

  19.              #計算備份所用時間

  20.              END=`date "+%Y-%m-%d %H:%M:%S"`

  21.              END_T=`date -d "$END" +%s`

  22.              TIME_INVENTAL_M=$[($END_T-$BEGIN_T)/60]

  23.              TIME_INVENTAL_S=$[($END_T-$BEGIN_T)%60]

  24.              echo '-----端口號為'$port'的mysql實例于' $END '備份完成,使用時間為 '$TIME_INVENTAL_M'分鐘'$TIME_INVENTAL_S'秒'

  25.              #調(diào)用tardump函數(shù),對備份文件進行壓縮,注意本次壓縮會刪掉原文件

  26.              tardump

  27.              #將參數(shù)改為默認,以防耗盡內(nèi)存

  28.              mysql -u$DB_USER -p$DB_PASSWORD --host= --socket=$sock --host=$host -BN -e "SET GLOBAL net_write_timeout=60";

  29.         done

  30. }




  31. #將要備份的單表從大到小輸出到日志里面

  32. function log()

  33. {

  34.             BACKUP_DIR=/data/backup/$DATE/$port;

  35.             mkdir -p  $BACKUP_DIR

  36.             #過濾掉MySQL自帶的DB

  37.             if [ -e ${BACKUP_DIR}/cyt.log ];

  38.             then rm -rf ${BACKUP_DIR}/cyt.log;

  39.             fi;

  40.             for a in `mysql -u$DB_USER -p$DB_PASSWORD --socket=$sock --host=$host -BN -e"show databases;" |sed '/^performance_schema$/'d|sed '/^mysql/'d |sed '/^information_schema$/'d|sed '/^information_schema$/'d|sed '/^test$/'d|sed '/^sys$/'d  `

  41.                  do

  42.                     mkdir -p ${BACKUP_DIR}/${a}

  43.                     for j in `mysql -u$DB_USER -p$DB_PASSWORD --host= --socket=$sock --host=$host -BN -e "select table_name from information_schema.tables where table_schema='${a}' order by table_rows desc;"`

  44.                     do

  45.                           echo 'mysqldump -u'$DB_USER' -p'$DB_PASSWORD' --socket='$sock' --host='$host' --set-gtid-purged=OFF -c --single_transaction=OFF -q --skip-add-locks ' ${a} ${j}'>'$BACKUP_DIR'/'${a}'/'${j}'.sql'>>$BACKUP_DIR/cyt.log;

  46.                     done

  47.                  done

  48. }


  49.    


  50. #調(diào)用函數(shù)log,查看log日志調(diào)用并發(fā)函數(shù)實現(xiàn)多線程備份

  51. function dumpAllTable()

  52. {

  53.         local schemaFile="${BACKUP_DIR}/cyt.log"

  54.         #最大的表先備份(因多進程并發(fā),最短完成時間依賴于最大表的完成)

  55.         allTable=`cat $schemaFile | wc -l`

  56.         i_import=0

  57.         declare -a array_cmds

  58.         i_array=0

  59.         while read file; do

  60.                 i_import=`expr $i + 1`

  61.                 array_cmds[i_array]="${file}"

  62.                 i_array=`expr ${i_array} + 1`

  63.         done < ${BACKUP_DIR}/cyt.log

  64.         execConcurrency "${threadsNum}" "${array_cmds[@]}"

  65. }






  66. #并發(fā)函數(shù)

  67. function execConcurrency()

  68. {

  69.         #并發(fā)數(shù)據(jù)量

  70.         local thread=$1

  71.         #并發(fā)命令

  72.         local cmd=$2

  73.         #定義管道,用于控制并發(fā)線程

  74.         tmp_fifofile="/tmp/$$.fifo"

  75.         mkfifo $tmp_fifofile

  76.         #輸入輸出重定向到文件描述符6

  77.         exec 6<>$tmp_fifofile

  78.         rm -f $tmp_fifofile

  79.         #向管道壓入指定數(shù)據(jù)的空格

  80.         for ((i=0;i<$thread;i++)); do

  81.                 echo

  82.         done >&6

  83.         #遍歷命令列表

  84.         while [ "$cmd" ]; do

  85.                 #從管道取出一個空格(如無空格則阻塞,達到控制并發(fā)的目的)

  86.                 read -u6

  87.                 #命令執(zhí)行完后壓回一個空格

  88.                 { eval $2;echo >&6; } & #> /dev/null 2>&1 &

  89.                 shift

  90.                 cmd=$2

  91.         done

  92.         #等待所有的后臺子進程結(jié)束

  93.         wait

  94.         #關(guān)閉df6

  95.         exec 6>&-

  96. }


  97. #壓縮備份文件

  98. function tardump()

  99. {

  100.     #使用tar壓縮

  101.     if [ -d ${BACKUP_DIR} ] && [ -n ${port} ]

  102.     then

  103.         echo "-----開始進行壓縮端口號為"$port"的mysql實例的備份:開始時間"`date "+%Y-%m-%d %H:%M:%S"`

  104.         cd $BACKUP_DIR;

  105.         for b in `find $BACKUP_DIR -maxdepth 1 -type d ! -iname "${port}*" ! -iname '*.sql' ! -iname '*tar.gz' `

  106.             do

  107.                 c=`basename $b`

  108.                 tar -zcvf $c'_'$(date +%F_%H-%M).tar.gz $c --remove-files > /dev/null

  109.         done

  110.      else echo "沒有可以進行壓縮的文件";

  111.     fi;

  112.     echo "-----壓縮端口號為"$port"的mysql實例的備份文件:結(jié)束時間"`date "+%Y-%m-%d %H:%M:%S"`

  113. }


  114. #主函數(shù)

  115. function main()

  116. {

  117.         #獲取本地IP地址

  118.         host=`ifconfig | grep 'inet addr:' | grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'`

  119.         DATE=`date +%F`

  120.         #本次備份mysqldump --host --socket如果是本地用戶備份,建議去掉host;(多實例本地用戶密碼問題需注意)

  121.         #數(shù)據(jù)庫用戶

  122.         DB_USER='cyt'

  123.         #數(shù)據(jù)庫用戶對應(yīng)的密碼

  124.         DB_PASSWORD='cyt'

  125.         #記錄開始的時間

  126.         BEGIN=`date "+%Y-%m-%d %H:%M:%S"`

  127.         BEGIN_T=`date -d "$BEGIN" +%s`

  128.         echo '--------------開始按表并發(fā)備份:開始時間為 '$BEGIN

  129.         #設(shè)置并發(fā)備份的線程數(shù)

  130.         threadsNum=10

  131.         #調(diào)用instance函數(shù)

  132.         instance

  133.         echo '--------------backup all database successfully?。?!結(jié)束時間:' `date "+%Y-%m-%d %H:%M:%S"`

  134. }


  135. main

【腳本說明】

  • 由于該腳本是并行備份,以防由于繁忙,導(dǎo)致獲取不到dump連接,故將該參數(shù)調(diào)大(該數(shù)據(jù)庫版本是5.6.19,腳本在備份完后會調(diào)?。?

mysql -u$DBUSER -p$DBPASSWORD --host= --socket=$sock --host=$host -BN -e "SET GLOBAL netwritetimeout=1800";

  • 由于想要利用并發(fā)函數(shù),將要使用的命令導(dǎo)入到${BACKUP_DIR}/cyt.log日志里,然后通過并發(fā)函數(shù)execConcurrency和數(shù)組dumpAllTable來實現(xiàn)本腳本的目的

  • 本腳本可以實現(xiàn)多實例備份,如果多實例備份的用戶名和密碼不同,可以使用case命令,下面是簡單舉例

    點擊(此處)折疊或打開



    1. if [ $port -eq 3306 ]; then

    2.         case $IP in

    3.          '10.240.5.11')

    4.             DB_USER='CYT1'

    5.             DB_PASSWORD='1'

    6.             ;;

    7.             '10.240.5.12')

    8.             DB_USER='CYT2'

    9.             DB_PASSWORD='2'

    10.             ;;

    11.             '10.240.5.13')

    12.             DB_PASSWORD='3'

    13.             ;;

    14.            esac

    15.         else

    16.           DB_PASSWORD='4'

    17.       fi

以上是“mysqldump5.7以下版本如何實現(xiàn)并發(fā)備份”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI