MySQL mysqlpump並行備份
前言:
MySQL 5.7新出的資料庫匯出方法,官方的書法是用mysqlpump代替mysqldump;
mysqldump匯出非常慢是單線程的【不過您也可以通過系統層並行實現mysqldump並行備份來實現mysqlpump,不過匯出sql表結構順序還是不同噠】;
mysqlpump是多線程的,在社區版本中mydumper是多線程的。 mysqlpump會有問題,要在5.7.11之後使用【因為MySQL 5.7.11 版本解決了一致性備份問題】
mysqlpump的文法與mysqldump高度相容,支援基於庫和表的並行匯出,對比mysqldump速度提升非常明顯。
mysqlpump的並行匯出功能的架構為:隊列+線程,允許有多個隊列,每個隊列下有多個線程,而一個隊列可以綁定1個或者多個資料庫。
但是,對於每張表的匯出只能是單個線程的, 這和mydumper工具是不一樣的 ,因為mydumper支援一張表多個線程以chunk的方式大量匯出;
這在主鍵是隨機的情況下,匯出速度還能有提升。mysqlpump的架構如所示:
****** 實驗結果
****** mysqldump 備份時間為80分鐘
****** mysqlpump 並行4備份時間為40分鐘【由於本庫中最大表單獨匯出就40分鐘,所以若資料庫中表大小都比較平均,效能比會更好....(單獨大表並行匯出mydumper...還在實驗)】
重點參數介紹
1. 支援基於表的多線程匯出功能(--default-parallelism,預設為2,--parallel-schemas,控制並行匯出的庫)
2. 匯出的時候帶有進度條(--watch-progress,預設開啟)
3. 支援直接壓縮匯出匯入(參數--compress-output,而且支援ZLIB和LZ4)
[root@localhost ~]#mysqlpump -uroot -p123 -A --parallel-schemas=4:db7 --parallel-schemas=1:db6 --skip-watch-progress > /data/all.sql
後台看並行情況
mysql> show processlist;
+----+-------------+-----------+------+---------+------+-----------------------------------------------+
| Id | User | Host | db | Command | Time | State Info |
+----+-------------+-----------+------+---------+------+-----------------------------------------------+
| 43 | root | localhost | NULL | Query | 10 | Sending data | SELECT SQL_NO_CACHE * FROM `db7`.`account_bill_pool` |
| 44 | root | localhost | NULL | Query | 9 | Sending to client | SELECT SQL_NO_CACHE * FROM `db7`.`bill_check_diff_dtl` |
| 45 | root | localhost | NULL | Query | 0 | Sending to client | SELECT SQL_NO_CACHE * FROM `db7`.`bill_checkstk_inventory`|
| 46 | root | localhost | NULL | Query | 3 | Sending data | SELECT SQL_NO_CACHE * FROM `db7`.`bill_checkstk_in_transit` |
| 72 | root | localhost | NULL | Query | 6 | Sending data | SELECT SQL_NO_CACHE * FROM `db6`.`account_bill_pool` |
+----+-------------+-----------+------+---------+------+----------------------------------------+
mysql>
查看匯出sql內容
CREATE TABLE `mysql`.`help_keyword` (
`help_keyword_id` int(10) unsigned NOT NULL,
`name` char(64) NOT NULL,
PRIMARY KEY (`help_keyword_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='help keywords' ;
INSERT INTO `mysql`.`help_keyword` VALUES (9,"MASTER_SSL_CA"),(367,"MASTER_SSL_CERT");
ALTER TABLE `mysql`.`help_keyword` ADD UNIQUE KEY `name` (`name`);
** 先建表後插入資料最後建立索引,比mysqldump好一些(mysqldump是建立表的時候同時建立索引,再插入資料,這樣的效率不如mysqlpump)
擴充:
5.7.9以後版本 --default-parallelism 多線程才能與--single-transaction合用.
[root@localhost data]# mysqlpump -uroot -p123 -B mysql --single-transaction > aa.sql
mysqlpump: [ERROR] (1) Usage of --single-transaction is mutually exclusive with parallelism.
Dump process encountered error and will not continue.
[root@localhost data]#
[root@localhost data]# mysqlpump -uroot -p123 -B mysql --single-transaction --default-parallelism=0 > aa.sql
Dump progress: 0/1 tables, 2/2 rows
Dump completed in 623 milliseconds
[root@localhost data]#
詳細參數介紹 mysqlpump --help
本文永久更新連結地址: