mysqlpump是mysql5.7.8版本後特有的邏輯備份工具,相對於mysqldump和mysqldumper,mysqlpump擁有更多特性,官方文檔的描述以下:mysql
mysqlpump features include: Parallel processing of databases, and of objects within databases, to speed up the dump process Better control over which databases and database objects (tables, stored programs, user accounts) to dump Dumping of user accounts as account-management statements (CREATE USER, GRANT) rather than as inserts into the mysql system database Capability of creating compressed output Progress indicator (the values are estimates) For dump file reloading, faster secondary index creation for InnoDB tables by adding indexes after rows are inserted
一、支持多線程備份數據庫和數據庫對象,加快備份進程。算法
二、有更好的控制策略去備份數據庫和數據庫對象(表、存儲過程、帳戶)。sql
三、備份用戶經過帳戶管理SQL(create user,grant)而再也不是往mysql系統庫插入記錄的方式shell
四、能建立壓縮文件數據庫
五、顯示進度(估算值)多線程
六、從新加載(還原)備份文件,先建表後插入數據最後創建索引,減小了索引維護開銷,加快了還原速度。
併發
注:mysql5.7.11版本後,mysqlpump才解決了一致性備份的問題,若是早於這個版本,邏輯備份最好採用mysqldump解決一致性備份問題。ide
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: shell> mysqlpump --single-transaction --default-parallelism=0
爲了測試下mysqlpump性能,在本身虛擬機上作了小測試,工具
測試虛擬機環境:
性能
主機:
CPU:Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz 4核
內存:1G
磁盤:SCSI硬盤 10G
數據庫:
版本:5.7.16
用sysbench準備測試數據,如下是測試數據準備腳本:
[root@mysql1 shell]# cat test_sysbench.sh #!/bin/sh sysbench --test=oltp --mysql-host=192.168.110.100 --mysql-port=3307 --mysql-user=root --mysql-password=root --mysql-db=sbtest2 --oltp-num-tables=4 --oltp-table-size=500000 --report-interval=100 --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select --oltp-read-only=off --max-time=30 --num-threads=16 prepare sysbench --test=oltp --mysql-host=192.168.110.100 --mysql-port=3307 --mysql-user=root --mysql-password=root --mysql-db=sbtest3 --oltp-num-tables=4 --oltp-table-size=500000 --report-interval=100 --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select --oltp-read-only=off --max-time=30 --num-threads=16 prepare sysbench --test=oltp --mysql-host=192.168.110.100 --mysql-port=3307 --mysql-user=root --mysql-password=root --mysql-db=sbtest4 --oltp-num-tables=4 --oltp-table-size=500000 --report-interval=100 --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select --oltp-read-only=off --max-time=30 --num-threads=16 prepare
測試結果以下:(注意每次測試都須要重啓mysql服務,以免內存緩衝對測試結果有所影響)
shell>time mysqlpump -uroot -proot -S /mysqldata/mysql/mysql3307/mysql3307.sock -A --single-transaction --default-parallelism=1 > pump.sql real 0m46.317s user 0m13.602s sys 0m3.949s shell>time mysqlpump -uroot -proot -S /mysqldata/mysql/mysql3307/mysql3307.sock -A --single-transaction --default-parallelism=2 > pump.sql real 0m48.707s user 0m15.087s sys 0m3.965s shell>time mysqlpump -uroot -proot -S /mysqldata/mysql/mysql3307/mysql3307.sock -A --single-transaction --default-parallelism=4 > pump.sql real 0m55.529s user 0m14.783s sys 0m4.143s shell>time mysqldump -uroot -proot -S /mysqldata/mysql/mysql3307/mysql3307.sock --set-gtid-purged=OFF -A --single-transaction > dump.sql real 0m57.089s user 0m8.870s sys 0m3.441s ++++++++++++++++++++++++++++++++++++++++++分割線+++++++++++++++++++++++++++++++++++++++++++ shell>time mysqlpump -uroot -proot -S /mysqldata/mysql/mysql3307/mysql3307.sock -A --single-transaction --default-parallelism=1 --compress_output=LZ4 --skip-watch-progress > pump.sql real 1m6.681s user 0m19.521s sys 0m4.041s shell>time mysqlpump -uroot -proot -S /mysqldata/mysql/mysql3307/mysql3307.sock -A --single-transaction --default-parallelism=1 --compress_output=ZLIB --skip-watch-progress > pump.sql real 1m8.877s user 0m27.315s sys 0m4.693s shell>time mysqldump -uroot -proot -S /mysqldata/mysql/mysql3307/mysql3307.sock --set-gtid-purged=OFF -A --single-transaction |gzip> dump.sql.gz real 1m8.567s user 0m20.797s sys 0m8.082s
從測試結果上能夠發現:
一、mysqlpump確實比mysqldump效率高。
二、可是因爲測試機磁盤IO有限,致使併發線程數從1提高到2和4的時候,因爲IO的瓶頸,備份的時間反而增長。
三、因爲測試的庫表數據較小,測試數據有所失真,建議準備多幾個庫和大表的數據進行測試,效果會更明顯。
四、mysqlpump的LZ4壓縮算法壓縮效率高於ZLIB壓縮算法。
mysqlpump用法同mysqldump用法高度一致,最爲有看點的就是:
一、支持基於表的多線程導出功能(--default-parallelism,默認爲2,--parallel-schemas,控制並行導出的庫)
二、導出的時候帶有進度條(--watch-progress,默認開啓)
三、支持直接壓縮導出導入(參數--compress-output,並且支持ZLIB和LZ4)
詳細的用法能夠經過查找官方文檔or mysqlpump --help。