mysqlpump淺談:mysqlpump併發的最小粒度是庫還是表,還是行?

e71hao發表於2019-06-04

         mysqlpump這個工具網上有大把大把的文章介紹,相信各位都用得爐火純青。網上的文章都介紹了mysqlpump的一大特色是併發,可是,沒有說清楚mysqlpump併發的最小粒度是什麼?它是怎麼工作原理?現在我就簡單研究下,如有錯誤,還請各位不吝指教!
         首先準備環境,來看下:redhat7.5 +mysql5.7.22  原始碼安裝。我們使用test庫,裡面有12張表,其中tab2和t22這兩張表有476萬條資料,總共3.6G容量。

          
 
         廢話不多說。我們開始測試:


 

       我用了4個併發執行緒,採取的一致性匯出。然後匯出的庫是test.整個匯出很簡單。現在問題來了,這4個併發執行緒是怎麼分工合作的呢?哪個執行緒匯出大表tab2?哪個執行緒匯出大表t22?mysqlpump又是如何判斷這些資料的呢?其實要回答這些問題,我們需要使用命令show processlist ,以及general_log.
      來看下processlist 都記錄了啥:

 

      發現總共有6個會話。其中id 2會話是我的登入會話。還有5個會話。讀到這裡首先會有一個疑問,配置了4個會話,怎麼會有5個嗎?問題2,貌似只有id 4,5會話在工作,id 3,6,7會話都沒有做什麼,事情真的是這樣嗎?
    來看下general log
 

 

看看這些日誌,就可以回答我的問題了:

 1.   5個執行緒分工是這樣:id7會話是管理執行緒,其餘4個匯出執行緒,所以4+1=5,總共5個執行緒。
 2.  id 4,5執行緒分別匯出表t22,tab2.
  3.   id 3,6執行緒不是沒有事情幹,而是人家也分配了任務,也匯出了資料,只不過匯出任務瞬間完成了。
 4.  並行的最小粒度是表,不是庫database,也不是行。其實我覺得如果mysqlpump並行再最佳化,可以到行。比如分配多幾個執行緒匯出大表資料,比如分配2執行緒匯出表t22的400萬行資料,速度會更快。但是控制更加複雜。
 5.管理執行緒知道分配2個執行緒匯出2個大表,還算挺智慧的哦。
不知道各位看明白了沒有,沒有看明白,思考一下。
現在總結如下:
        mysqlpump併發執行緒會有一個管理執行緒,然後有N個工作執行緒。併發匯出的時候,管理執行緒會判斷找出大表來,並分配任務。匯出資料最小的單位是表。

       最後一個問題,mysqlpump是怎麼做到一致性匯出的呢?這個問題留給各位自己思考。

       附上mysql做備份主從同步命令:



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30393770/viewspace-2646610/,如需轉載,請註明出處,否則將追究法律責任。

相關文章