MySQL 官方出品,比 mydumper 更快的多线程逻辑备份工具-MySQL Shell Dump & Load

mysqldump 和 mydumper 是我们常用的两个逻辑备份工具。

无论是 mysqldump 还是 mydumper 都是将备份数据通过 INSERT 的方式写入到备份文件中。

恢复时,myloader( mydumper 中的恢复工具 ) 是多线程导入,且一个 INSERT 语句中包含多条记录,多个 INSERT 操作批量提交。基本上,凡是我们能想到的,有助于提升导入速度的,myloader 都会使用或有选项提供。

单就恢复速度而言,可以说,myloader 就是逻辑恢复工具的天花板。

既然如此,还有办法能继续提升逻辑恢复工具的恢复速度么?毕竟,备份的恢复速度直接影响着灾难发生时数据库服务的 RTO。

答案,有!

这个就是官方在 MySQL Shell 8.0.21 中推出的 Dump & Load 工具。

与 myloader 不一样的是,MySQL Shell Load 是通过 LOAD DATA LOCAL INFILE 命令来导入数据的。

而 LOAD DATA 操作,按照官方文档的说法,比 INSERT 操作快 20 倍。

下面,我们看看 MySQL Shell Dump & Load 的具体用法和实现原理。

本文主要包括以下几个部分:

[En]

This paper mainly includes the following parts:

  1. 什么是 MySQL Shell。
  2. MySQL Shell的安装。
  3. MySQL Shell Dump & Load的使用。
  4. util.dumpInstance的关键特性。
  5. util.loadDump的关键特性。
  6. util.dumpInstance的备份流程。
  7. util.dumpInstance的参数解析。
  8. util.loadDump的参数解析。
  9. 使用 MySQL Shell Dump & Load时的注意事项。

什么是 MySQL Shell

MySQL Shell 是 MySQL 的一个高级客户端和代码编辑器,是第二代 MySQL 客户端。第一代 MySQL 客户端即我们常用的 mysql。

相比于 mysql,MySQL Shell 不仅支持 SQL,还具有以下关键特性:

  1. 支持 Python 和 JavaScript 两种语言模式。基于此,我们可以很容易地进行一些脚本开发工作。
  2. 支持 AdminAPI。AdminAPI 可用来管理 InnoDB Cluster、InnoDB ClusterSet 和 InnoDB ReplicaSet。
  3. 支持 X DevAPI。X DevAPI 可对文档( Document )和表( Table )进行 CRUD(Create,Read,Update,Delete)操作。

除此之外,MySQL Shell 还内置了很多实用工具,包括:

  • checkForServerUpgrade:检测目标实例能否升级到指定版本。
  • dumpInstance:备份实例。
  • dumpSchemas:备份指定库。
  • dumpTables:备份指定表。
  • loadDump:恢复通过上面三个工具生成的备份。
  • exportTable:将指定的表导出到文本文件中。只支持单表,效果同 SELECT INTO OUTFILE 一样。
  • importTable:将指定文本的数据导入到表中。 在线上,如果我们有个大文件需要导入,建议使用这个工具。它会将单个文件进行拆分,然后多线程并行执行 LOAD DATA LOCAL INFILE 操作。不仅提升了导入速度,还规避了大事务的问题。
  • importJson:将 JSON 格式的数据导入到 MySQL 中,譬如将 MongoDB 中通过 mongoexport 导出的数据导入到 MySQL 中。

在使用时注意:

  1. 通过 dumpInstance,dumpSchemas,dumpTables 生成的备份只能通过 loadDump 来恢复。
  2. 通过 exportTable 生成的备份只能通过 importTable 来恢复。

下面,我们重点说说 Dump & Load 相关的工具,包括 dumpInstance,dumpSchemas,dumpTables 和 loadDump。

MySQL Shell 的安装

MySQL Shell 下载地址:https://dev.mysql.com/downloads/shell/。

同 MySQL 一样,提供了多个版本的下载。这里使用 Linux 二进制版本( Linux – Generic )。

#&#xA0;cd&#xA0;/usr/local/<br>#&#xA0;wget&#xA0;https://dev.mysql.com/get/Downloads/MySQL-Shell/mysql-shell-8.0.29-linux-glibc2.12-x86-64bit.tar.gz<br>#&#xA0;tar&#xA0;xvf&#xA0;mysql-shell-8.0.29-linux-glibc2.12-x86-64bit.tar.gz&#xA0;<br>#&#xA0;ln&#xA0;-s&#xA0;mysql-shell-8.0.29-linux-glibc2.12-x86-64bit&#xA0;mysql-shell<br>#&#xA0;export&#xA0;PATH=$PATH:/usr/local/mysql-shell/bin

MySQL Shell Dump & Load 的使用

util.dumpInstance(outputUrl[, options])

备份实例。

其中,outputUrl 是备份目录,其必须为空。options 是可指定的选项。

首先,看一个简单的例子。

[En]

First, look at a simple example.

#&#xA0;mysqlsh&#xA0;-h&#xA0;10.0.20.4&#xA0;-P3306&#xA0;-uroot&#xA0;-p<br>mysql-js>&#xA0;util.dumpInstance('/data/backup/full',{compression:&#xA0;"none"})<br>Acquiring&#xA0;global&#xA0;read&#xA0;lock<br>Global&#xA0;read&#xA0;lock&#xA0;acquired<br>Initializing&#xA0;-&#xA0;done<br>1&#xA0;out&#xA0;of&#xA0;5&#xA0;schemas&#xA0;will&#xA0;be&#xA0;dumped&#xA0;and&#xA0;within&#xA0;them&#xA0;1&#xA0;table,&#xA0;0&#xA0;views.<br>4&#xA0;out&#xA0;of&#xA0;7&#xA0;users&#xA0;will&#xA0;be&#xA0;dumped.<br>Gathering&#xA0;information&#xA0;-&#xA0;done<br>All&#xA0;transactions&#xA0;have&#xA0;been&#xA0;started<br>Locking&#xA0;instance&#xA0;for&#xA0;backup<br>Global&#xA0;read&#xA0;lock&#xA0;has&#xA0;been&#xA0;released<br>Writing&#xA0;global&#xA0;DDL&#xA0;files<br>Writing&#xA0;users&#xA0;DDL<br>Running&#xA0;data&#xA0;dump&#xA0;using&#xA0;4&#xA0;threads.<br>NOTE:&#xA0;Progress&#xA0;information&#xA0;uses&#xA0;estimated&#xA0;values&#xA0;and&#xA0;may&#xA0;not&#xA0;be&#xA0;accurate.<br>Writing&#xA0;schema&#xA0;metadata&#xA0;-&#xA0;done<br>Writing&#xA0;DDL&#xA0;-&#xA0;done<br>Writing&#xA0;table&#xA0;metadata&#xA0;-&#xA0;done<br>Starting&#xA0;data&#xA0;dump<br>101%&#xA0;(650.00K&#xA0;rows&#xA0;/&#xA0;~639.07K&#xA0;rows),&#xA0;337.30K&#xA0;rows/s,&#xA0;65.89&#xA0;MB/s<br>Dump&#xA0;duration:&#xA0;00:00:01s<br>Total&#xA0;duration:&#xA0;00:00:01s<br>Schemas&#xA0;dumped:&#xA0;1<br>Tables&#xA0;dumped:&#xA0;1<br>Data&#xA0;size:&#xA0;126.57&#xA0;MB<br>Rows&#xA0;written:&#xA0;650000<br>Bytes&#xA0;written:&#xA0;126.57&#xA0;MB<br>Average&#xA0;throughput:&#xA0;65.30&#xA0;MB/s

命令中的 /data/backup/full 是备份目录,compression: “none” 指的是不压缩,这里设置为不压缩主要是为了方便查看数据文件的内容。线上使用建议开启压缩。

接下来,让我们来看看备份目录的内容。

[En]

Next, let’s look at the contents of the backup directory.

#&#xA0;ll&#xA0;/data/backup/full/<br>total&#xA0;123652<br>-rw-r-----&#xA0;1&#xA0;root&#xA0;root&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;273&#xA0;May&#xA0;25&#xA0;21:13&#xA0;@.done.json<br>-rw-r-----&#xA0;1&#xA0;root&#xA0;root&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;854&#xA0;May&#xA0;25&#xA0;21:13&#xA0;@.json<br>-rw-r-----&#xA0;1&#xA0;root&#xA0;root&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;240&#xA0;May&#xA0;25&#xA0;21:13&#xA0;@.post.sql<br>-rw-r-----&#xA0;1&#xA0;root&#xA0;root&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;288&#xA0;May&#xA0;25&#xA0;21:13&#xA0;sbtest.json<br>-rw-r-----&#xA0;1&#xA0;root&#xA0;root&#xA0;63227502&#xA0;May&#xA0;25&#xA0;21:13&#xA0;sbtest@sbtest1@0.tsv<br>-rw-r-----&#xA0;1&#xA0;root&#xA0;root&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;488&#xA0;May&#xA0;25&#xA0;21:13&#xA0;sbtest@sbtest1@0.tsv.idx<br>-rw-r-----&#xA0;1&#xA0;root&#xA0;root&#xA0;63339214&#xA0;May&#xA0;25&#xA0;21:13&#xA0;sbtest@sbtest1@@1.tsv<br>-rw-r-----&#xA0;1&#xA0;root&#xA0;root&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;488&#xA0;May&#xA0;25&#xA0;21:13&#xA0;sbtest@sbtest1@@1.tsv.idx<br>-rw-r-----&#xA0;1&#xA0;root&#xA0;root&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;633&#xA0;May&#xA0;25&#xA0;21:13&#xA0;sbtest@sbtest1.json<br>-rw-r-----&#xA0;1&#xA0;root&#xA0;root&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;759&#xA0;May&#xA0;25&#xA0;21:13&#xA0;sbtest@sbtest1.sql<br>-rw-r-----&#xA0;1&#xA0;root&#xA0;root&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;535&#xA0;May&#xA0;25&#xA0;21:13&#xA0;sbtest.sql<br>-rw-r-----&#xA0;1&#xA0;root&#xA0;root&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;240&#xA0;May&#xA0;25&#xA0;21:13&#xA0;@.sql<br>-rw-r-----&#xA0;1&#xA0;root&#xA0;root&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;6045&#xA0;May&#xA0;25&#xA0;21:13&#xA0;@.users.sql

其中,

  • @.done.json:会记录备份的结束时间,备份集的大小。备份结束时生成。
  • @.json:会记录备份的一些元数据信息,包括备份时的一致性位置点信息:binlogFile,binlogPosition 和 gtidExecuted,这些信息可用来建立复制。
  • @.sql,@.post.sql:这两个文件只有一些注释信息。不过在通过 util.loadDump 导入数据时,我们可以通过这两个文件自定义一些 SQL。其中,@.sql 是数据导入前执行,@.post.sql 是数据导入后执行。
  • sbtest.json:记录 sbtest 中已经备份的表、视图、定时器、函数和存储过程。
  • *.tsv:数据文件。我们看看数据文件的内容。
#&#xA0;head&#xA0;-2&#xA0;sbtest@sbtest1@0.tsv<br>1&#xA0;6461363&#xA0;68487932199-96439406143-93774651418-41631865787-96406072701-20604855487-25459966574-28203206787-41238978918-19503783441&#xA0;22195207048-70116052123-74140395089-76317954521-98694025897<br>2&#xA0;1112248&#xA0;13241531885-45658403807-79170748828-69419634012-13605813761-77983377181-01582588137-21344716829-87370944992-02457486289&#xA0;28733802923-10548894641-11867531929-71265603657-36546888392

TSV 格式,每一行储存一条记录,字段与字段之间用制表符(\t)分隔。
* sbtest@sbtest1.json:记录了表相关的一些元数据信息,如列名,字段之间的分隔符(fieldsTerminatedBy)等。
* sbtest@sbtest1.sql:sbtest.sbtest1 的建表语句。
* sbtest.sql:建库语句。如果这个库中存在存储过程、函数、定时器,也是写到这个文件中。
* @.users.sql:创建账号及授权语句。默认不会备份 mysql.session,mysql.session,mysql.sys 这三个内部账号。

util.dumpSchemas(schemas, outputUrl[, options])

备份指定库的数据。

用法同 util.dumpInstance 类似。其中,第一个参数必须为数组,即使只需备份一个库,如,

util.dumpSchemas(['sbtest'],'/data/backup/schema')

支持的配置大部分与 util.dumpInstance 相同。

从 MySQL Shell 8.0.28 开始,可直接使用 util.dumpInstance 中的 includeSchemas 选项进行指定库的备份。

util.dumpTables(schema, tables, outputUrl[, options])

备份指定表的数据。

用法同 util.dumpInstance 类似。其中,第二个参数必须为数组,如,

util.dumpTables('sbtest',['sbtest1'],'/data/backup/table')

支持的配置大部分与 util.dumpInstance 相同。

从 MySQL Shell 8.0.28 开始,可直接使用 util.dumpInstance 中的 includeTables 选项进行指定表的备份。

util.loadDump(url[, options])

导入通过 dump 命令生成的备份集。如,

#&#xA0;mysqlsh&#xA0;-S&#xA0;/data/mysql/3307/data/mysql.sock<br>mysql-js>&#xA0;util.loadDump("/data/backup/full",{loadUsers:&#xA0;true})<br>Loading&#xA0;DDL,&#xA0;Data&#xA0;and&#xA0;Users&#xA0;from&#xA0;'/data/backup/full'&#xA0;using&#xA0;4&#xA0;threads.<br>Opening&#xA0;dump...<br>Target&#xA0;is&#xA0;MySQL&#xA0;8.0.27.&#xA0;Dump&#xA0;was&#xA0;produced&#xA0;from&#xA0;MySQL&#xA0;8.0.27<br>Scanning&#xA0;metadata&#xA0;-&#xA0;done<br>Checking&#xA0;for&#xA0;pre-existing&#xA0;objects...<br>Executing&#xA0;common&#xA0;preamble&#xA0;SQL<br>Executing&#xA0;DDL&#xA0;-&#xA0;done<br>Executing&#xA0;view&#xA0;DDL&#xA0;-&#xA0;done<br>Starting&#xA0;data&#xA0;load<br>2&#xA0;thds&#xA0;loading&#xA0;-&#xA0;100%&#xA0;(126.57&#xA0;MB&#xA0;/&#xA0;126.57&#xA0;MB),&#xA0;11.43&#xA0;MB/s,&#xA0;0&#xA0;/&#xA0;1&#xA0;tables&#xA0;done<br>Recreating&#xA0;indexes&#xA0;-&#xA0;done<br>Executing&#xA0;user&#xA0;accounts&#xA0;SQL...<br>NOTE:&#xA0;Skipping&#xA0;CREATE/ALTER&#xA0;USER&#xA0;statements&#xA0;for&#xA0;user&#xA0;'root'@'localhost'<br>NOTE:&#xA0;Skipping&#xA0;GRANT&#xA0;statements&#xA0;for&#xA0;user&#xA0;'root'@'localhost'<br>Executing&#xA0;common&#xA0;postamble&#xA0;SQL<br>2&#xA0;chunks&#xA0;(650.00K&#xA0;rows,&#xA0;126.57&#xA0;MB)&#xA0;for&#xA0;1&#xA0;tables&#xA0;in&#xA0;1&#xA0;schemas&#xA0;were&#xA0;loaded&#xA0;in&#xA0;10&#xA0;sec&#xA0;(avg&#xA0;throughput&#xA0;13.96&#xA0;MB/s)<br>0&#xA0;warnings&#xA0;were&#xA0;reported&#xA0;during&#xA0;the&#xA0;load.

命令中的 /data/backup/full 是备份目录,loadUsers: true 是导入账号,默认不会导入。

util.dumpInstance 的关键特性

util.dumpInstance 的关键特性如下:

  1. 多线程备份。并发线程数由 threads 决定,默认是 4。
  2. 支持单表 chunk 级别的并行备份,前提是表上存在主键或唯一索引。
  3. 默认是压缩备份。
  4. 支持备份限速。可通过 maxRate 限制单个线程的数据读取速率。

util.loadDump 的关键特性

util.loadDump 的关键特性如下:

  1. 多线程恢复。并发线程数由 threads 决定,默认是 4。
  2. 支持断点续传功能。 在导入的过程中,会在备份目录生成一个进度文件,用于记录导入过程中的进度信息。 文件名由 progressFile 指定,默认是 load-progress. 导入时,如果备份目录中存在 progressFile,默认会从上次完成的地方继续执行。如果要从头开始执行,需将 resetProgress 设置为 true。
  3. 支持延迟创建二级索引。
  4. 支持边备份,边导入。
  5. 通过 LOAD DATA LOCAL INFILE 命令来导入数据。
  6. 如果单个文件过大,util.loadDump 在导入时会自动进行切割,以避免产生大事务。

util.dumpInstance 的备份流程

util.dumpInstance 的备份流程如下图所示。

MySQL 官方出品,比 mydumper 更快的多线程逻辑备份工具-MySQL Shell Dump & Load

不难看出,util.dumpInstance 的备份流程与 mysqldump 大致相同,不同的地方主要体现在以下两点:

  1. util.dumpInstance 会加备份锁。备份锁可用来阻塞备份过程中的 DDL。
  2. util.dumpInstance 是并行备份,相对于 mysqldump 的单线程备份,备份效率更高。

util.dumpInstance 的参数解析

util.dumpInstance 的参数可分为如下几类:

过滤相关

以下是过滤相关的选项。

  • excludeSchemas:忽略某些库的备份,多个库之间用逗号隔开,如,
excludeSchemas:&#xA0;["db1",&#xA0;"db2"]
  • includeSchemas:指定某些库的备份。
  • excludeTables:忽略某些表的备份,表必须是 schema.table 的格式,多个表之间用逗号隔开,如,
excludeTables:&#xA0;["sbtest.sbtest1",&#xA0;"sbtest.sbtest2"]
  • includeTables:指定某些表的备份。
  • events:是否备份定时器,默认为 true。
  • excludeEvents:忽略某些定时器的备份。
  • includeEvents:指定某些定时器的备份。
  • routines:是否备份函数和存储过程,默认为 true。
  • excludeRoutines:忽略某些函数和存储过程的备份。
  • includeRoutines:指定某些函数和存储过程的备份。
  • users:是否备份账号信息,默认为 true。
  • excludeUsers:忽略某些账号的备份,可指定多个账号。
  • includeUsers:指定某些账号的备份,可指定多个账号。
  • triggers:是否备份触发器,默认为 true。
  • excludeTriggers:忽略某些触发器的备份。
  • includeTriggers:指定某些触发器的备份。
  • ddlOnly:是否只备份表结构,默认为 false。
  • dataOnly:是否只备份数据,默认为 false。

并行备份相关

  • chunking:是否开启 chunk 级别的并行备份功能,默认为 true。
  • bytesPerChunk:每个 chunk 文件的大小,默认 64M。
  • threads:并发线程数,默认为 4。

OCI(甲骨文云)相关

  • ocimds:是否检查备份集与 MySQL Database Service(甲骨文云的 MySQL 云服务,简称 MDS )的兼容性,默认为 false,不检查。如果设置为 true,会输出所有的不兼容项及解决方法。不兼容项可通过下面的 compatibility 来解决。
  • compatibility:如果要将备份数据导入到 MDS 中,为了保证与后者的兼容性,可在导出的过程中进行相应地调整。具体来说:
  • create_invisible_pks:对于没有主键的表,会创建一个隐藏主键:my_row_id BIGINT UNSIGNED AUTO_INCREMENT INVISIBLE PRIMARY KEY。隐藏列是 MySQL 8.0.23 引入的。
  • force_innodb:将表的引擎强制设置为 InnoDB。
  • ignore_missing_pks:忽略主键缺失导致的错误,与 create_invisible_pks 互斥,不能同时指定。
  • skip_invalid_accounts:忽略没有密码,或者使用了 MDS 不支持的认证插件的账号。
  • strip_definers:去掉视图、存储过程、函数、定时器、触发器中的 DEFINER=account 子句。
  • strip_restricted_grants:去掉 MDS 中不允许 GRANT 的权限。
  • strip_tablespaces:去掉建表语句中的 TABLESPACE=xxx 子句。
  • osBucketName,osNamespace,ociConfigFile,ociProfile,ociParManifest,ociParExpireTime:OCI 对象存储相关。

其它选项

  • tzUtc:是否设置 TIME_ZONE = ‘+00:00’,默认为 true。
  • consistent:是否开启一致性备份,默认为 true。若设置为 false,则不会加全局读锁,也不会开启事务的一致性快照。
  • dryRun:试运行。此时只会打印备份信息,不会执行备份操作。
  • maxRate:限制单个线程的数据读取速率,单位 byte,默认为 0,不限制。
  • showProgress:是否打印进度信息,如果是 TTY 设备(命令行终端),则为 true,反之,则为 false。
  • defaultCharacterSet:字符集,默认为 utf8mb4。
  • compression:备份文件的压缩算法,默认为 zstd。也可设置为 gzip 或 none(不压缩)。

util.loadDump 的参数解析

util.loadDump 的参数可分为如下几类:

过滤相关

  • excludeEvents:忽略某些定时器的导入。
  • excludeRoutines:忽略某些函数和存储过程的导入。
  • excludeSchemas:忽略某些库的导入。
  • excludeTables:忽略某些表的导入。
  • excludeTriggers:忽略某些触发器的导入。
  • excludeUsers:忽略某些账号的导入。
  • includeEvents:导入指定定时器。
  • includeRoutines:导入指定函数和存储过程。
  • includeSchemas:导入指定库。
  • includeTables:导入指定表。
  • includeTriggers:导入指定触发器。
  • includeUsers:导入指定账号。
  • loadData:是否导入数据,默认为 true。
  • loadDdl:是否导入 DDL 语句,默认为 true。
  • loadUsers:是否导入账号,默认为 false。注意,即使将 loadUsers 设置为 true,也不会导入当前正在执行导入操作的用户。
  • ignoreExistingObjects:是否忽略已经存在的对象,默认为 off。

并行导入相关

  • backgroundThreads:获取元数据和 DDL 文件内容的线程数。备份集如果存储在本地,backgroundThreads 默认和 threads 一致。
  • threads:并发线程数,默认为 4。
  • maxBytesPerTransaction:指定单个 LOAD DATA 操作可加载的最大字节数。默认与 bytesPerChunk 一致。这个参数可用来规避大事务。

断点续传相关

  • progressFile:在导入的过程中,会在备份目录生成一个 progressFile,用于记录加载过程中的进度信息,这个进度信息可用来实现断点续传功能。默认为 load-progress.

  • resetProgress:如果备份目录中存在 progressFile,默认会从上次完成的地方继续执行。如果要从头开始执行,需将 resetProgress 设置为 true。该参数默认为 off。

OCI 相关

osBucketName,osNamespace,ociConfigFile,ociProfile。

二级索引相关

  • deferTableIndexes:是否延迟(数据加载完毕后)创建二级索引。可设置:off(不延迟),fulltext(只延迟创建全文索引,默认值),all(延迟创建所有索引)。
  • loadIndexes:与 deferTableIndexes 一起使用,用来决定数据加载完毕后,最后的二级索引是否创建,默认为 true。

其它选项

  • analyzeTables:表加载完毕后,是否执行 ANALYZE TABLE 操作。默认是 off(不执行),也可设置为 on 或 histogram(只对有直方图信息的表执行)。
  • characterSet:字符集,无需显式设置,默认会从备份集中获取。
  • createInvisiblePKs:是否创建隐式主键,默认从备份集中获取。这个与备份时是否指定了 create_invisible_pks 有关,若指定了则为 true,反之为 false。
  • dryRun:试运行。
  • ignoreVersion:忽略 MySQL 的版本检测。默认情况下,要求备份实例和导入实例的大版本一致。
  • schema:将表导入到指定 schema 中,适用于通过 util.dumpTables 创建的备份。
  • showMetadata:导入时是否打印一致性备份时的位置点信息。
  • showProgress:是否打印进度信息。
  • skipBinlog:是否设置 sql_log_bin=0 ,默认 false。这一点与 mysqldump、mydumper 不同,后面这两个工具默认会禁用 Binlog。
  • updateGtidSet:更新 GTID_PURGED。可设置:off(不更新,默认值), replace(替代目标实例的 GTID_PURGED), append(追加)。
  • waitDumpTimeout:util.loadDump 可导入当前正在备份的备份集。处理完所有文件后,如果备份还没有结束(具体来说,是备份集中没有生成 @.done.json),util.loadDump 会报错退出,可指定 waitDumpTimeout 等待一段时间,单位秒。

MySQL Shell Dump & Load 的注意事项

  1. 表上存在主键或唯一索引才能进行 chunk 级别的并行备份。字段的数据类型不限。不像 mydumper,分片键只能是整数类型。

  2. 对于不能进行并行备份的表,目前会备份到一个文件中。如果该文件过大,不用担心大事务的问题,util.loadDump 在导入时会自动进行切割。

  3. util.dumpInstance 只能保证 InnoDB 表的备份一致性。

  4. 默认不会备份 information_schema,mysql,ndbinfo,performance_schema,sys。

  5. 备份实例支持 MySQL 5.6 及以上版本,导入实例支持 MySQL 5.7 及以上版本。

  6. 备份的过程中,会将 BLOB 等非文本安全的列转换为 Base64,由此会导致转换后的数据大小超过原数据。导入时,注意 max_allowed_packet 的限制。

  7. 导入之前,需将目标实例的 local_infile 设置为 ON。

参考

[1] Instance Dump Utility, Schema Dump Utility, and Table Dump Utility

[2] MySQL Shell Dump & Load part 1: Demo!

[3] MySQL Shell Dump & Load part 2: Benchmarks

[4] MySQL Shell Dump & Load part 3: Load Dump

[5] MySQL Shell Dump & Load part 4: Dump Instance & Schemas

[6] Backup/Restore Performance Conclusion: mysqldump vs MySQL Shell Utilities vs mydumper vs mysqlpump vs XtraBackup

[7] Optimizing INSERT Statements

Original: https://www.cnblogs.com/ivictor/p/16326495.html
Author: iVictor
Title: MySQL 官方出品,比 mydumper 更快的多线程逻辑备份工具-MySQL Shell Dump & Load

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505336/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java面向对象(下)作业

    首先我把题目先列到这里,可以仔细看一下题。 (1)设计一个名为Geometric的几何图形的抽象类,该类包括: ①两个名为color、filled属性分别表示图形颜色和是否填充。 …

    数据库 2023年6月11日
    0189
  • Nginx 反向代理、Rewrite

    Rewrite功能配置 Rewrite是Nginx服务器提供的一个重要基本功能,是Web服务器产品中几乎必备的功能。主要的作用是用来实现URL的重写。www.jd.com注意:Ng…

    数据库 2023年6月6日
    0163
  • 第十五章 Spring动态代理开发

    创建原始对象 public class UserServiceImpl implements UserService{ @Override public void register…

    数据库 2023年6月14日
    0157
  • Ansible Playbook概览

    Ansible playbook 执行需要三步路执行: 1.编写playbook 2.定义主机清单文件 3.设置运行环境,写入配置文件 1.编写playbook Playbook使…

    数据库 2023年6月14日
    0121
  • Node版本更新及切换

    Node版本升级 &#x6E05;&#x9664;npm&#x7F13;&#x5B58; npm cache clean -f n&#x6A…

    数据库 2023年6月16日
    0204
  • 享受时间 拥抱 Linux

    生活上小闲心 用 游戏 影音 音乐 可以尝试 Window or Macos. 初期代码生涯推荐全面拥抱 Linux , 耐下心少学点, 多享受光 邵雍· 《清夜吟》 月到天心处,…

    数据库 2023年6月9日
    0136
  • QT槽函数获取信号发送对象

    Qt 在槽函数中获取信号发送对象 Qt中提供了一个函数 qobject_cast(QObject *object),可以通过这个函数判断信号发出对象 Qt 帮助文档的解释:Retu…

    数据库 2023年6月16日
    0193
  • Flyweight 享元(结构型)

    一:描述:(该模式实际应用较少) Flyweight 享元模式是对大量细粒度的元素进行共享和重用。减少对象的创建减轻内存; 注和单例模式不同的是:享元模式的各个对象佣有各自的行为并…

    数据库 2023年6月11日
    0165
  • 2022-8-17 mysql 第三天

    子查询 按照结果集的行列数不同,子查询可以分为以下几类: 标量子查询:结果集只有一行一列(单行子查询) 列子查询:结果集有一列多行 行子查询:结果集有一行多列 表子查询:结果集多行…

    数据库 2023年6月14日
    0135
  • 程序设计之设计模式介绍

    一、什么是设计模式? 答:程序都是通过写代码来实现的,老前辈们在开发程序的过程中,为了解决某一类问题,日积月累总结出了一套套的代码编写经验,通过这些经验,按照套路出牌,可以让开发出…

    数据库 2023年6月14日
    0123
  • 16 两个对象值相同(x.equals(y) == true),但却可以有不同的hashCode,这句话对不对?

    不对,如果两个对象x和y满足x.equals(y) == true,那么他们的哈希码应该相同。 根据hashCode方法协定:在每个重写了equals方法的类中,必须重写hashC…

    数据库 2023年6月6日
    0130
  • Dockerfile 构建镜像

    从 Dockerfile 构建镜像涉及三个步骤 创建工作目录 编写 Dockerfile 规格 使用 docker build 命令构建镜像 1. 创建工作目录 这个根据应用实际情…

    数据库 2023年6月14日
    0117
  • Qt 圆角头像的实现

    在QT 中设置圆形头像,本文记录了两个解决思路。 将头像显示在QLabel 此类控件中,设置QLabel 为一个正方形,接着设置QLabel 的圆角属性,可以实现圆形头像的效果。 …

    数据库 2023年6月16日
    0156
  • MySQL max() min() 函数取值错误

    今天日志出现异常,一步一步debug发现SQL语句返回值出错,进一步发现是max()函数返回出错。点击跳转解决办法,赶时间的朋友可以去获得答案。当然我还是希望大伙看看原由。 sel…

    数据库 2023年5月24日
    0124
  • SQL与数据库编程学习笔记-day1

    一:理论知识参考 学习网站参考: 数据库主要分为两类: 1.关系型数据库:关系型数据库采用表格的储存方式,数据以行和列的方式进行存储,要读取和查询都十分方便,例如常见的:Oracl…

    数据库 2023年6月9日
    0137
  • 软件基础的理论(1)

    软件基础的理论 一, 什么是软件产品 它是一个逻辑产品,没有实体,包括程序,文档和数据,需要通过终端设备才能体现出来功能和作用 二, 软件产品的中间过程文档 客户需求 &#…

    数据库 2023年6月16日
    0144
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球