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 

相关推荐