• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL官方导出工具mysqlpump的使用

    简介

    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

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

    优缺点

    总结一下

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

    以上就是MySQL官方导出工具mysqlpump的使用的详细内容,更多关于mysqlpump的使用的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • mysqldump你可能不知道的参数
    • MySQL5.7 mysqldump备份与恢复的实现
    • linux使用mysqldump+expect+crontab实现mysql周期冷备份思路详解
    • MySql使用mysqldump 导入与导出方法总结
    • MySQL之mysqldump的使用详解
    • 如何用mysqldump进行全量和时间点备份
    • docker 使用mysqldump命令备份导出项目中的mysql数据
    • MySQL数据迁移使用MySQLdump命令
    • PHP定时备份MySQL与mysqldump语法参数详解
    • mysql备份脚本 mysqldump使用方法详解
    • 详解 linux mysqldump 导出数据库、数据、表结构
    • 详谈mysqldump数据导出的问题
    上一篇:新手必备之MySQL msi版本下载安装图文详细教程
    下一篇:Mysql官方性能测试工具mysqlslap的使用简介
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL官方导出工具mysqlpump的使用 MySQL,官方,导出,工具,mysqlpump,