MySQL并行导入导出工具——mysqlpump

一、 mysqlpump简介

mysql官方从5.7开始推出了mysqlpump工具,它和mysqldump一样属于逻辑备份。

1. 优点

  • 基于表并行备份数据库和数据库中对象,加快备份过程。(--default-parallelism)
  • 更好地控制数据库和数据库对象(表,存储过程,用户帐户)的备份。
  • 备份用户账号作为帐户管理语句(CREATE USER,GRANT),而不是直接插入到MySQL的系统数据库。
  • 支持直接压缩导出
  • 导出可显示进度(估计值)。
  • 导出时可以排除或指定数据库。
  • 导入备份文件时,先建表后插入数据最后建立索引,减少了索引维护开销,加快了还原速度。

2. 不足

  • 官方表示在5.7.11之前无法保证数据的一致性,所以5.7.11之前该工具基本无法使用
  • 5.7.11之前,--defaut-parallelism>0时与--single-transaction互斥,无法使用并行。直到5.7.11才解决了--single-transaction和--default-parallelism互斥的问题
  • mysqlpump的并行是基于表的,对db中只有几个超大表其余表都很小的场景,并行备份基本无用,甚至速度还不如mysqldump

二、mysqlpump备份原理

并行导出的架构为:队列+线程。允许有多个队列(--parallel-schemas),每个队列下有多个线程(N),每个队列可以绑定1个或者多个数据库(逗号分隔)。mysqlpump的备份是基于表并行的,对于每张表的导出只能是单个线程的。如果某个库有一张表非常大,可能大部分的时间都是消耗在这个表的备份上面,mysqlpump并行备份的效果就不明显,此时可以利用mydumper导出。mydumper是以chunk方式批量导出,即它支持对表的并行导出。

5c81d4e28a66277f487e6807aa98f9ff06139321

三、mysqlpump重要参数

mysqlpump参数与mysqldump基本类似,下面只介绍重要及常用的参数,其余参数参考官方文档

MySQL :: MySQL 5.7 Reference Manual :: 4.5.6 mysqlpump — A Database Backup Program

参数含义备注
-A, --all-databases备份所有数据库
--add-locks备份表时使用LOCK TABLES和UNLOCK TABLES这个参数不支持并行备份,需要关闭并行备份功能:default-parallelism=0
--character-sets-dir=name指定备份数据导出字符集
--compress-output=name直接压缩导出目前支持LZ4和ZLIB压缩算法
-B, --databases指定备份数据库,多个库之间用逗号分隔
--default-parallelism默认备份并行线程数,设为0表示默认不使用并行备份默认为2
--defer-table-indexes延迟创建索引,将全部数据备份结束后再创建索引,默认开启。mysqldump导入先创建表和索引,然后加载原数据,资源消耗不仅有备份还有对二级索引的维护
 --exclude-databases=name备份时排除该参数指定的数据库,多个数据库之前使用,分隔
--exclude-tables=name备份时排除该参数指定的表,多个表之前使用,分隔
--include-databases=name备份指定数据库,多个数据库之前使用,分隔
--include-tables=name备份指定表,多个表之前使用,分隔
--parallel-schemas=[N:]db_list指定要并行备份的库及并行度N,多个库之间用逗号分隔。(注意是指定的库一共用N个线程,而不是每个用N个线程)若不指定并行度则由-default-parallelism参数决定,默认为2。
-d, --skip-dump-rows只备份表结构,不备份数据
--users备份数据库用户,备份形式为create user ... ,grant ....如果只需要备份数据库账号可以使用 mysqlpump --exclude-databases=% --users
--add-drop-user在CREATE USER语句之前增加DROP USER这个参数需要和--users一起使用,否则不生效
--watch-progress显示备份进度,默认开启
--single-transaction对于innodb表,在备份开始的时候会开启一个事务,并且设置隔离级别为RR,保证备份数据的一致性。备份期间应避免DDL。5.7.11后解决了--single-transaction才能与--default-parallelism共用

四、 常见用法

1.   指定库导出:(-B, --databases)

#单库导出
mysqlpump -B webplus > backup.sql

#多库导出
mysqlpump --databases webplus1webplus2 webplus3 > backup.sql

2.   全库导出:(-A, --all-databases)

mysqlpump --all-databases > backup.sql

3.   导出指定表:

mysqlpump 库名 表1 表2 > backup.sql

mysqlpump webplus T_ARTICLE T_SITEARTICLE > backup.sql

4.   导出时排查指定库、表:

mysqlpump --include-databases=db1,db2 --exclude-tables=db1.t1,db2.t2 > backup.sql

mysqlpump --user=root --password --exclude-databases=db1,db2 > backup.sql

5.   指定错误日志

mysqlpump --log-error-file=/opt/mysqlerror.logwebplus > backup.sql

6.   不锁表导出
--single-transaction参数使用时mysql不锁表热备份,但是备份时需要避免使用DDL语句

mysqlpump --single-transactionwebplus > backup.sql

7.   多线程导出

默认线程(--default-parallelism)和指定线程(--parallel-schemas)

mysqlpump --default-parallelism=5 --parallel-schemas=4:webplusA --parallel-schemas=3:webplusB,webplusC webplusD >backup.sql

此时webplusA调用4线程,webplusB、C调用3线程,webplusD调用5线程(默认值),show processlist将会看到4+3+5=12线程正在进行pump。图为pump 5线程与dump 单线程比较,运行前均重启数据库


8.   压缩导出

使用zlib/lz4进行压缩导出(导出时同时压缩,含有--compress-output时--compress为默认值,--compress可省略)

mysqlpump --compress --compress-output=LZ4> backup.lz4
mysqlpump --compress --compress-output=ZLIB> backup.zlib

实际压缩时间及文件大小:

  • dump不压缩     57秒             大小约1800MB
  • dump+tar:    2分05秒        压缩文件约333M 约占原文件18.5%
  • pump zlib:     1分33秒       压缩文件约346M 约占原文件19.2%
  • pump lz4:      30秒            压缩文件约509M 约占原文件28.2%


 

参考

MySQL mysqlpump并行备份_数据库技术_Linux公社-Linux系统门户网站

文章-阿里云开发者社区-云计算社区-阿里云

统一身份认证登录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hehuyi_In

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值