mysqldump是mysql官方自帶的備份工具,是一個很好用的mysql數據轉移工具,具備兼容強強、跨版本等特色mysql
mydumper是一個針對MySQL的高性能多線程備份和恢復工具,它提供了併發備份功能,備份效率有很大提升,而且按照單表進行備份,表恢復更加方便。c++
mydumper主要特性有:正則表達式
• 輕量級C語言寫的sql
• 執行速度比mysqldump快10倍數據庫
• 事務性和非事務性表一致的快照(適用於0.2.2以上版本)多線程
• 快速的文件壓縮併發
• 支持導出binlogsocket
• 多線程恢復(適用於0.2.1以上版本)工具
• 以守護進程的工做方式,定時快照和連續二進制日誌(適用於0.5.0以上版本)性能
• 開源 (GNU GPLv3)
本文將對兩個工具進行簡單的對比測試,並給出參考結果。
因爲mysqldump使用較多,比較熟悉,因此這裏主要介紹mydumper的安裝使用。
Mydumper下載地址:https://launchpad.net/mydumper,最新的穩定版本是0.6.2,下載以後按照以下方式安裝:
1 # yum install glib2-devel mysql-devel zlib-devel pcre-devel gcc-c++ 2 # wget http://launchpad.net/mydumper/0.6/0.6.2/+download/mydumper-0.6.2.tar.gz 3 # tar zxvf mydumper-0.6.2.tar.gz 4 # cd mydumper-0.6.2 5 # cmake . 6 # make 7 # make install
mydumper安裝完成以後包括導出的mydumper工具和導入的myloader,主要參數以下:
mydumper參數介紹: -B, --database 須要備份的庫 -T, --tables-list 須要備份的表,用,分隔 -o, --outputdir 輸出目錄 -s, --statement-size Attempted size of INSERT statement in bytes, default 1000000 -r, --rows 試圖分裂成不少行塊表 -c, --compress 壓縮輸出文件 -e, --build-empty-files 即便表沒有數據,仍是產生一個空文件 -x, --regex 支持正則表達式 -i, --ignore-engines 忽略的存儲引擎,用,分隔 -m, --no-schemas 不導出表結構 -k, --no-locks 不執行臨時共享讀鎖 警告:這將致使不一致的備份 -l, --long-query-guard 長查詢,默認60s --kill-long-queries kill掉長時間執行的查詢(instead of aborting) -b, --binlogs 導出binlog -D, --daemon 啓用守護進程模式 -I, --snapshot-interval dump快照間隔時間,默認60s,須要在daemon模式下 -L, --logfile 日誌文件 -h, --host -u, --user -p, --password -P, --port -S, --socket -t, --threads 使用的線程數,默認4 -C, --compress-protocol 在mysql鏈接上使用壓縮 -V, --version -v, --verbose 更多輸出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2 myloader參數介紹: -d, --directory 導入備份目錄 -q, --queries-per-transaction 每次執行的查詢數量, 默認1000 -o, --overwrite-tables 若是表存在刪除表 -B, --database 須要還原的庫 -e, --enable-binlog 啓用二進制恢復數據 -h, --host -u, --user -p, --password -P, --port -S, --socket -t, --threads 使用的線程數量,默認4 -C, --compress-protocol 鏈接上使用壓縮 -V, --version -v, --verbose 更多輸出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
mydumper備份時須要指定一個備份目錄,不能像mysqldump同樣備份整個庫指定到某個特定的sql文件:
1 mydumper -u root -p ${MYSQLPASSWD} -B ${DB_NAME} -o ${BACKUPDIR} -t 4
導出的文件以下圖所示:
每一個代表後接schema的sql文件的是表結構文件,另外一個是表數據,若是表沒有數據默認只有一個schema的文件,能夠加上-e參數強制生成一個空的數據文件。若是加上-c參數就會對每一個導出的文件進行壓縮打包,以下圖所示:
1 myloader -u root -p ${MYSQLPASSWD} -d ${BACKUPDIR} -o -B ${DB_NAME}
測試方式:分別採用mysqldump分表備份方式和mydumper的方式,mydumper默認4個線程,對單個或多個庫進行備份,主要觀察備份時間以及備份期間機器的CPU使用狀況。
對單個數據庫進行備份狀況,默認採用4個線程同時備份:
|
200M |
4G |
7G |
30G |
mysqldump |
8s |
2m58s |
5m50s |
13m13s |
mydumper |
4s |
1m38s |
2m56s |
7m59s |
對多個數據庫連續備份,總共約8G大小的庫
方式 |
時間 |
mysqldump |
5m14s |
mydumper |
2m05s |
在測試過程當中,觀察機器的CPU使用狀況,採用mysqldump的CPU使用約在98%左右,採用mydumper的狀況下CPU使用約在200%-400%之間。因此對於消耗CPU的遊戲來講,採用mydumper無疑會增大CPU消耗負擔,而且可能對遊戲產生影響,因此並不太建議採用mydumper,而若是是專門的數據庫而且CPU較爲空閒的狀況,能夠採用,適當增多線程數,能夠更快的完成備份。
另外在標配的單盤的機器上測試的時候發下,線程數設置爲2的時候的時候,IO已經跑滿了,相對於線程數爲1的時候速度有顯著提高,可是在IO跑滿以後,設置線程數爲四、八、10,線程數越大,CPU消耗會越大,可是對整個備份時間並無太大影響了,因此在cpu足夠空閒的狀況下,IO是影響mydumper性能的瓶頸所在,使用的時候根據實際IO狀況合理設置線程數。