Oracle官方并行邏輯備份工具mysqlpump
來自: http://www.innomysql.net/article/25383.html
昨天Inside君寫到MySQL 5.7.11版本發布,其中 最有意義 的部分在于官方修復了之前mysqlpump工具一致性備份的問題,使得mysqlpump工具在生產環境中有了用武之地。而在之前MySQL 5.7的文檔中明確寫著,mysqlpump是不支持一致性的備份:
Before MySQL 5.7.11, use of the –single-transaction option is mutually exclusive with parallelism. To use –single-transaction, disable parallelism by setting –default-parallelism to 0 and not using any instances of –parallel-schemas
在5.7.11版本的change history中,對于這個問題已經有了修復:
mysqlpump tries to do as much work in parallel as possible, but the dump threads lacked a synchronization point before backing up the data, resulting in inconsistent backup.
mysqlpump相對于之前的邏輯備份工具mysqldump來說,Inside君總結的優勢如下:
- 支持基于表的并行導出功能(參數–default-parallelism,默認為2,參數–parallel-schemas,控制并行導出的庫)
- 導出的時候帶有進度條(參數–watch-progress,默認開啟)
- 支持直接壓縮導出導入(參數–compress-output,支持ZLIB和LZ4)
mysqlpump的并行導出功能的架構為:隊列+線程,允許有多個隊列,每個隊列下有多個線程,而一個隊列可以綁定1個或者多個數據庫。但是,對于每張表的導出只能是單個線程的, 這和mydumper工具是不一樣的 ,因為mydumper支持一張表多個線程以chunk的方式批量導出,這在主鍵是隨機的情況下,導出速度還能有提升。mysqlpump的架構如下圖所示:
接著Inside君對比了mysqldump與mysqlpump的導出速度,選擇的數據庫大小為7.8G,每次備份測試時都重啟數據庫,清空緩沖池中的內容。其中各表的大小如下所示:
root@test-1:/mdata/mysql_data# ls -lh tpcc/*.ibd -rw-r----- 1 mysql mysql 1.9G Feb 21 22:58 tpcc/customer.ibd -rw-r----- 1 mysql mysql 160K Feb 21 23:12 tpcc/district.ibd -rw-r----- 1 mysql mysql 208M Feb 21 22:58 tpcc/history.ibd -rw-r----- 1 mysql mysql 17M Feb 21 22:23 tpcc/item.ibd -rw-r----- 1 mysql mysql 32M Feb 22 00:05 tpcc/new_orders.ibd -rw-r----- 1 mysql mysql 2.1G Feb 22 10:00 tpcc/order_line.ibd -rw-r----- 1 mysql mysql 132M Feb 22 00:05 tpcc/orders.ibd -rw-r----- 1 mysql mysql 3.5G Feb 21 23:12 tpcc/stock.ibd -rw-r----- 1 mysql mysql 48K Feb 21 23:11 tpcc/warehouse.ibd
由于只有tpcc單個數據庫,這里mysqlpump測試采用默認單隊列2個線程和單隊列4個線程測試,mysqlpump測試語句如下:
root@test-1:/mdata/mysql_data# time mysqlpump --single-transaction -B tpcc > tpcc.sql root@test-1:/mdata/mysql_data# time mysqlpump --single-transaction --default-parallelism=4 -B tpcc > tpcc.sql
最后的測試結果如下所示:
測試在網易云環境下,這時可以發現默認配置下mysqlpump的速度比起mysqldump快了39.04%,4個線程下快了有48.89%。接著測試多個數據庫備份的場景,這里選擇7.8G大小的tpcc庫和2.4G大小的dbt3數據庫,最后得到的結果mysqlpump比起mysqldump最高快了70%多的時間:
總結
mysqlpump的語法與mysqldump高度兼容,支持基于庫和表的并行導出,對比mysqldump速度提升非常明顯。MySQL 5.7.11版本解決了一致性備份問題,推薦線上環境使用。由于每個數據庫大小,架構不同,測試給出的速度提升只是參考,或許在你的環境會沒有任何差別,也可能速度提升更大。anyway,是時候好好測試mysqlpump,看看對你的生產環境是否會有極大的速度提升。
</div>