MySQL官方导出工具mysqlpump的使用


Posted in MySQL onMay 21, 2021

简介

mysqlpump 是 mysqldump 的一个衍生,本身也参考了 mydumper 的思路,支持了并行导出数据,因此导出数据的效率比 mysqldump 会高很多。

使用介绍

mysqlpump 的绝大多数参数与 mysqldump 是一样的,整体的使用方法和 mysqldump 没有太多的差异。这里列出一部分 mysqlpump 中比较重要且常用的参数。

 

参数

说明

--default-parallelism=#

设置并行导出的并发度,与 single-transaction 冲突

--single-transaction

创建一个单独的事务来导出所有的表

--exclude-databases=name

导出时排除掉某些库,多个库以逗号分隔

--exclude-tables=name

导出时排除掉某些表,多个表以逗号分隔

--include-databases=name

导出时包含某些库,多个库以逗号分隔

--include-tables=name

导出时包含某些表,多个表以逗号分隔

实际体验

这里对 mysqlpump 做一次简单的试用,目标实例选择 MySQL 5.7,参数中同时采用了single-transaction和default-parallelism,试试看这个冲突的效果。

mysqlpump 侧的输出参考如下信息:

root@VM-64-10-debian:~# mysqlpump -h172.100.10.10 -uroot -p --single-transaction --default-parallelism=16 --set-gtid-purged=OFF -B sbtest > sbtest.sql
Dump progress: 0/1 tables, 250/987400 rows
Dump progress: 0/5 tables, 117250/3946600 rows
Dump progress: 1/5 tables, 258750/3946600 rows
Dump progress: 1/5 tables, 385500/3946600 rows
Dump progress: 1/5 tables, 516750/3946600 rows
Dump progress: 1/5 tables, 639250/3946600 rows
Dump progress: 1/5 tables, 757000/3946600 rows
Dump progress: 1/5 tables, 885000/3946600 rows
Dump progress: 1/5 tables, 1005750/3946600 rows
Dump progress: 1/5 tables, 1114250/3946600 rows
Dump progress: 1/5 tables, 1223250/3946600 rows
Dump progress: 2/5 tables, 1312500/3946600 rows
Dump progress: 2/5 tables, 1430750/3946600 rows
Dump progress: 2/5 tables, 1553000/3946600 rows
Dump progress: 2/5 tables, 1680250/3946600 rows
Dump progress: 2/5 tables, 1809500/3946600 rows
Dump progress: 2/5 tables, 1940750/3946600 rows
Dump progress: 2/5 tables, 2060000/3946600 rows
Dump progress: 2/5 tables, 2175250/3946600 rows
Dump progress: 2/5 tables, 2295250/3946600 rows
Dump progress: 3/5 tables, 2413500/3946600 rows
Dump progress: 3/5 tables, 2554500/3946600 rows
Dump progress: 3/5 tables, 2693500/3946600 rows
Dump progress: 3/5 tables, 2818750/3946600 rows
Dump progress: 3/5 tables, 2941500/3946600 rows
Dump progress: 4/5 tables, 3056000/3946600 rows
Dump progress: 4/5 tables, 3172750/3946600 rows
Dump progress: 4/5 tables, 3280000/3946600 rows
Dump progress: 4/5 tables, 3372000/3946600 rows
Dump progress: 4/5 tables, 3444750/3946600 rows
Dump completed in 126555 milliseconds

可以看到当这两个参数同时启用的时候,mysqlpump 实际上还是在一个一个表的导出。single-transaction的优先级会高于default-parallelism。

去掉single-transaction再进行测试的时候,会发现一个比较有意思的现象,观察 MySQL 的 processlist,会有如下结果:

mysql> show processlist;
+---------+------+--------------------+------+---------+------+-------------------+----------------------------------------------------+
| Id      | User | Host               | db   | Command | Time | State             | Info                                               |
+---------+------+--------------------+------+---------+------+-------------------+----------------------------------------------------+
| 2763496 | root | 172.100.10.10:49086 | NULL | Query   |    0 | starting          | show processlist                                   |
| 2763585 | root | 172.100.10.10:49192 | NULL | Sleep   |  126 |                   | NULL                                               |
| 2763586 | root | 172.100.10.10:49194 | NULL | Sleep   |  126 |                   | NULL                                               |
| 2763587 | root |172.100.10.10:49196 | NULL | Sleep   |  126 |                   | NULL                                               |
| 2763588 | root | 172.100.10.10:49198 | NULL | Sleep   |  126 |                   | NULL                                               |
| 2763589 | root | 172.100.10.10:49200 | NULL | Sleep   |  126 |                   | NULL                                               |
| 2763590 | root | 172.100.10.10:49202 | NULL | Sleep   |  126 |                   | NULL                                               |
| 2763591 | root | 172.100.10.10:49204 | NULL | Sleep   |  126 |                   | NULL                                               |
| 2763592 | root | 172.100.10.10:49206 | NULL | Sleep   |  126 |                   | NULL                                               |
| 2763593 | root | 172.100.10.10:49208 | NULL | Sleep   |  126 |                   | NULL                                               |
| 2763594 | root | 172.100.10.10:49210 | NULL | Sleep   |  126 |                   | NULL                                               |
| 2763595 | root | 172.100.10.10:49212 | NULL | Query   |  125 | Sending to client | SELECT `id`,`k`,`c`,`pad`  FROM `sbtest`.`sbtest5` |
| 2763596 | root | 172.100.10.10:49214 | NULL | Query   |  125 | Sending to client | SELECT `id`,`k`,`c`,`pad`  FROM `sbtest`.`sbtest4` |
| 2763597 | root | 172.100.10.10:49216 | NULL | Query   |  125 | Sending to client | SELECT `id`,`k`,`c`,`pad`  FROM `sbtest`.`sbtest3` |
| 2763598 | root | 172.100.10.10:49218 | NULL | Query   |  125 | Sending to client | SELECT `id`,`k`,`c`,`pad`  FROM `sbtest`.`sbtest2` |
| 2763599 | root | 172.100.10.10:49220 | NULL | Query   |  125 | Sending to client | SELECT `id`,`k`,`c`,`pad`  FROM `sbtest`.`sbtest1` |
| 2763600 | root | 172.100.10.10:49222 | NULL | Sleep   |  125 |                   | NULL                                               |
| 2763601 | root | 172.100.10.10:49224 | NULL | Sleep   |  125 |                   | NULL                                               |
+---------+------+--------------------+------+---------+------+-------------------+----------------------------------------------------+
18 rows in set (0.00 sec)

mysql>

可以很明显的看出来,mysqlpump 的“并行导出”实际上只是基于表级别的并行导出,当存在单个大表的时候,导出的时间会被严重的影响,存在短板效应。

额外的疑问:如果default-parallelism和single-transaction有冲突的话,那么并行导出的时候是不是无法确认数据一致性?

实践出真实,打开 general_log 看一下导出时的操作:

2021-05-12T11:54:09.033215Z        75 Connect   root@172.100.10.10 on  using SSL/TLS
2021-05-12T11:54:09.075347Z        75 Query     FLUSH TABLES WITH READ LOCK //开始锁表
2021-05-12T11:54:09.103132Z        75 Query     SHOW WARNINGS
2021-05-12T11:54:09.106382Z        75 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2021-05-12T11:54:09.106553Z        75 Query     SHOW WARNINGS
2021-05-12T11:54:09.106640Z        75 Query     START TRANSACTION WITH CONSISTENT SNAPSHOT
2021-05-12T11:54:09.108115Z        75 Query     SHOW WARNINGS
2021-05-12T11:54:09.127277Z        76 Connect   root@172.100.10.10 on  using SSL/TLS
2021-05-12T11:54:09.127452Z        76 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2021-05-12T11:54:09.127590Z        76 Query     SHOW WARNINGS
2021-05-12T11:54:09.127680Z        76 Query     START TRANSACTION WITH CONSISTENT SNAPSHOT
2021-05-12T11:54:09.127790Z        76 Query     SHOW WARNINGS
......
2021-05-12T11:54:10.018813Z        90 Connect   root@172.100.10.10 on  using SSL/TLS
2021-05-12T11:54:10.018944Z        90 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2021-05-12T11:54:10.019047Z        90 Query     SHOW WARNINGS
2021-05-12T11:54:10.019150Z        90 Query     START TRANSACTION WITH CONSISTENT SNAPSHOT
2021-05-12T11:54:10.019226Z        90 Query     SHOW WARNINGS
2021-05-12T11:54:10.025833Z        91 Connect   root@172.100.10.10 on  using SSL/TLS
2021-05-12T11:54:10.025934Z        91 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2021-05-12T11:54:10.026048Z        91 Query     SHOW WARNINGS
2021-05-12T11:54:10.026141Z        91 Query     START TRANSACTION WITH CONSISTENT SNAPSHOT
2021-05-12T11:54:10.026219Z        91 Query     SHOW WARNINGS
2021-05-12T11:54:10.026293Z        75 Query     UNLOCK TABLES  //结束锁表
2021-05-12T11:54:10.026406Z        75 Query     SHOW WARNINGS

可以看到并行导出之前,有一个线程加上了全局读锁,然后等所有的并发线程打开事务之后才解锁了表,因此并行导出的时候也是数据一致的。

优缺点

  • 优点:
    • 并行备份数据库和数据库中的对象,比 mysqldump 更高效。
    • 更好的控制数据库和数据库对象(表,存储过程,用户帐户)的备份。
    • 备份进度可视化。
  • 缺点:  
    • 只能并行到表级别,如果有一个表数据量特别大那么会存在非常严重的短板效应。
    • 导出的数据保存在一个文件中,导入仍旧是单线程,效率较低。
    • 无法获取当前备份对应的binlog位置。

总结一下

尽管 mysqlpump 还有非常多的不足,但是相比较于原始的 mysqldump 已经有了非常大的进步,从这个工具的发布也可以看出来 Oracle 终于开始重视 MySQL 的生态工具了,期待官方提供更多的更优秀的生态工具。

以上就是MySQL官方导出工具mysqlpump的使用的详细内容,更多关于mysqlpump的使用的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
Mysql基础之常见函数
Apr 22 MySQL
详解MySQL的Seconds_Behind_Master
May 18 MySQL
分析MySQL抛出异常的几种常见解决方式
May 18 MySQL
MySQL 查询速度慢的原因
May 25 MySQL
安装配置mysql及Navicat prenium的详细流程
Jun 10 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 MySQL
MySQL基于索引的压力测试的实现
Nov 07 MySQL
MySQL之select、distinct、limit的使用
Nov 11 MySQL
mysql创建存储过程及函数详解
Dec 04 MySQL
MySQL实现配置主从复制项目实践
Mar 31 MySQL
mysql拆分字符串作为查询条件的示例代码
Jul 07 MySQL
MySQL新手入门进阶语句汇总
Sep 23 MySQL
新手必备之MySQL msi版本下载安装图文详细教程
MySQL数据库压缩版本安装与配置详细教程
MySQL 8.0 之不可见列的基本操作
May 20 #MySQL
Mysql Online DDL的使用详解
May 20 #MySQL
MySQL 存储过程的优缺点分析
May 20 #MySQL
IDEA 链接Mysql数据库并执行查询操作的完整代码
MySQL 覆盖索引的优点
May 19 #MySQL
You might like
php UBB 解析实现代码
2011/11/27 PHP
php引用传值实例详解学习
2013/11/06 PHP
php验证session无效的解决方法
2014/11/04 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
2019/10/09 PHP
PHP date_default_timezone_set()设置时区操作实例分析
2020/05/16 PHP
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
2016/06/08 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
Javascript自定义事件详解
2017/01/13 Javascript
AngularJS Toaster使用详解
2017/02/24 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
2017/06/13 Javascript
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
python实现定时播放mp3
2015/03/29 Python
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
Django 反向生成url实例详解
2019/07/30 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
linux面试题参考答案(7)
2012/10/29 面试题
证婚人搞笑证婚词
2014/01/10 职场文书
护理毕业生自我鉴定
2014/02/11 职场文书
优质服务活动实施方案
2014/05/02 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android