標籤:
http://afei2.sinaapp.com/?p=456
今天線上上使用mysqldump將資料表從一個庫匯入到另外一個庫,結果速度特別慢,印象中有個多線程的資料匯入匯出工具Mydumper,於是簡單的調查和測試一下。
下午導資料的過程中,這個表是沒有更新的,因此不需要確保多個資料之間的一致性,就簡單的寫個shell指令碼啟動多個mysqldumper來導資料,這樣有幾個問題:
- 需要處理表資料大小不均勻的問題,有的會很快結束,有的會比較慢。
- 如果需要保證多個匯出之間的一致性時,則無法保證。
Mydumper是一個使用c語言編寫的多線程匯出匯入工具,並且能夠保證多個表之間的一致性。Mydumper已經好幾篇blog在討論:Mydumper效能測試,Mydumper使用和源碼分析。通過stronghearted的測試,我們看到不是線程越多越好,6個線程的時候速度最快(這個肯定跟機器的配置等諸多因素有關,只能作為一個經驗值而不是絕對值,機器好的時候,線程越多越好)。一、原理Mydumper如何保證資料的一致性?下面是官方給出的解答,摘抄如下,主要是使用flush tables with read lock和start transaction with consistent snapshot,在flush tables with read lock時開啟所有的線程,並且通過show master status和show slave status獲得當前的position(便於使用Mydumper重建slave以及確保多個表之間的資料一致性)。
- Global write lock is acquired (“FLUSH TABLES WITH READ LOCK”)
- Various metadata is read (“SHOW SLAVE STATUS”,”SHOW MASTER STATUS”)
- Other threads connect and establish snapshots (“START TRANSACTION WITH CONSISTENT SNAPSHOT”),On pre-4.1.8 it creates dummy InnoDB table, and reads from it.
- Once all worker threads announce the snapshot establishment, master executes “UNLOCK TABLES” and starts queueing jobs.
二、安裝
- 下載源碼,https://launchpad.net/mydumper
- 閱讀README,根據不同的OS,安裝不同的依賴
- cmake .
- make
三、使用
Mydumper不能讀取/etc/my.cnf中設定檔,需要手工制定使用者名稱、密碼等等
mydumper -P 3306 -u admin -p ‘***‘ -h db23 -B meituan -T test1,test2,test3,test4,test5 -o ./ myloader -v 3 --threads=6 -P 3306 -u admin -p ‘***‘ -h 127.0.0.1 -S /opt/tmp/mysql3306.sock -B test -d ./ |
四、測試
對mysqldump和Mydumper做了一個簡單測試,測試結果如下(測試結果受環境影響,結果僅供參考):5張表,每張表600M。
匯出:遠程進行,匯出兩遍,取最小值。mysqldump 37sMydumper 21s
匯入:mysqldump 14m4smydumper 9m4s五、結論結論:Mydumper在匯出匯入處理程序因為可以多線程進行,因此速度上肯定是優於mysqldump,可以用來替換mysqldump;Mydumper不能讀取/etc/my.cnf中的設定檔,這個挺麻煩的,必須進行指定。0 您可能也喜歡:
- MYSQL資料檔案--.frm檔案(表結構恢複)
- mysql使用event每天將資料備份為一張表
- MySQL Replication過濾選項replicate*過濾規則
- 更改Innodb 資料頁大小最佳化MySQL
MySQL多線程資料匯入匯出工具Mydumper