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