11.5 实例转储实用程序、架构转储实用程序和表转储实用程序
MySQL Shell 的实例转储实用程序 util.dumpInstance()
和架构转储实用程序 util.dumpSchemas()
是在 MySQL Shell 8.0.21 中引入的,支持将所有架构或选定架构从本地 MySQL 实例导出到 Oracle 云基础设施对象存储存储桶或一组本地文件中。 MySQL Shell 8.0.22 中引入的表转储实用程序util.dumpTables()
支持从模式中选择表或视图的相同操作。然后,可以使用该实用程序将导出的项目导入 MySQL HeatWave 服务数据库系统(简称 MySQL 数据库系统)或 MySQL 服务器实例 util.loadDump()
(请参阅 第 11.6 节 “转储加载实用程序”)。为了获得最佳功能,请始终使用 MySQL Shell 转储和转储加载实用程序的最新版本。
- 关于公用事业
- 要求和限制
- 运行实用程序
- 转储控制选项
- 转储输出选项
- 过滤选项
- MySQL HeatWave 服务和 Oracle 云基础设施选项
- S3 兼容服务的选项
- Microsoft Azure Blob 存储选项
- 实用程序错误消息
关于公用事业
MySQL Shell 的实例转储实用程序、模式转储实用程序和表转储实用程序提供 Oracle Cloud Infrastructure 对象存储流、MySQL HeatWave 服务兼容性检查和修改、多线程并行转储以及文件压缩,而mysqldump不提供这些功能。转储期间会显示进度信息。您可以使用所选的转储选项集进行试运行,以显示有关将执行哪些操作、将转储哪些项目以及(对于实例转储实用程序和架构转储实用程序)MySQL HeatWave 服务兼容性问题需要哪些信息当您使用这些选项实际运行该实用程序时,即可修复。
选择转储文件的目标位置时,请注意,要导入到 MySQL 数据库系统,运行转储加载实用程序的 MySQL Shell 实例必须安装在有权访问 MySQL 数据库系统的 Oracle Cloud Infrastructure Compute 实例上。如果将实例、架构或表转储到对象存储桶,您可以从计算实例访问对象存储桶。如果您在本地系统上创建转储文件,则需要使用您选择的复制实用程序将它们传输到 Oracle Cloud Infrastructure 计算实例,具体取决于您为计算实例选择的操作系统。
MySQL Shell 的实例转储实用程序、架构转储实用程序和表转储实用程序创建的转储包含指定架构结构的 DDL 文件和 .tsv
包含数据的制表符分隔文件。如果您希望将导出的模式设置为单独的练习,而不是使用导出的数据填充它,您还可以选择仅生成 DDL 文件或仅生成数据文件。您可以选择在转储期间是否锁定备份实例以保证数据一致性。默认情况下,转储实用程序将块表数据放入多个数据文件中并压缩这些文件。
您可以使用实用程序的选项来包含或排除指定的架构和表、用户及其角色和授权、事件、例程和触发器。如果您指定了冲突的包含和排除选项,或者命名了一个未包含在转储中的对象,则在 MySQL Shell 8.0.28 之前,这种情况将被忽略,转储将在没有该对象的情况下继续进行。从 MySQL Shell 8.0.28 开始,会报告错误并停止转储,以便您可以更正选项。如果您需要转储 MySQL 实例中的大部分架构,作为替代策略,您可以使用实例转储实用程序而不是架构转储实用程序,并指定excludeSchemas
列出那些不转储的架构的选项。同样,如果您需要转储模式中的大部分表,则可以使用带有该选项的模式转储实用程序, excludeTables
而不是表转储实用程序。
mysql.apply_status
、 mysql.general_log
、 mysql.schema
和 的数据mysql.slow_log tables
始终从 MySQL Shell 的架构转储实用程序创建的转储中排除,尽管它们的 DDL 语句也包含在内。information_schema
、mysql
、 ndbinfo
、 performance_schema
和 架构 sys
始终从实例转储中排除。
默认情况下,转储输出中的所有时间戳数据中的时区都标准化为 UTC,这有助于在不同时区的服务器之间移动数据以及处理具有多个时区的数据。如果愿意,您可以使用该tzUtc: false
选项来保留原始时间戳。
MySQL Shell 转储加载实用程序 util.loadDump()
支持使用预先身份验证的请求 (PAR) 从对象存储存储桶加载导出的实例和架构。从 MySQL Shell 8.0.22 到 8.0.26,必须在启用的情况下导出实例和架构, ociParManifest
以允许使用 PAR 从对象存储进行加载操作。有关详细信息,请参阅该选项的说明ociParManifest
。从 MySQL Shell 8.0.27 开始,引入了对存储桶中所有对象或存储桶中具有特定前缀的对象的 PAR 支持,导出ociParManifest
实例和模式时不再严格需要启用该选项。有关使用 PAR 加载转储的信息,请参阅第 11.6 节 “转储加载实用程序”。
从 MySQL Shell 8.0.27 开始,MySQL Shell 的实例转储实用程序、模式转储实用程序和表转储实用程序是分区感知的(请参阅 MySQL 手册中的 分区)。当转储的表被分区时,每个分区被视为一个独立的表;如果表有子分区,则每个子分区都被视为独立表。这也意味着,当启用分块时,分区表或子分区表的每个分区或子分区都会独立分块。为分区表创建的转储文件的基本名称使用格式 ,其中和 分别是父模式和表的名称,并且 是分区或子分区的 URL 编码名称。 *
schema*@*
table*@*
partition*
schema
table
partition
要管理早期版本的 MySQL Shell 实用程序不支持的附加功能,从 MySQL Shell 8.0.27 开始util.dumpInstance()
, util.dumpSchemas()
将 创建转储时使用的功能列表util.dumpTables()
写入 util.loadDump()
转储元数据文件;对于每个这样的功能,都会将一个元素添加到列表中。当转储加载实用程序读取元数据文件并发现列出的不支持的功能时,它会报告错误;错误消息包含支持该功能的 MySQL Shell 版本。 MySQL Shell 8.0.27 中引入的分区感知功能是第一个支持功能管理的功能。
要求和限制
-
实例转储实用程序、架构转储实用程序和表转储实用程序仅支持 MySQL Server 版本的通用 (GA) 版本。
-
将加载转储的目标 MySQL 实例需要 MySQL 5.7 或更高版本。
-
对于源 MySQL 实例,在提供实用程序的所有 MySQL Shell 版本中完全支持从 MySQL 5.7 或更高版本进行转储。从 MySQL Shell 8.0.22 到 MySQL Shell 8.0.25,可以从 MySQL 5.6 实例转储实例、架构或表并将其加载到 MySQL 5.7 或更高版本的目标中,但不能从 MySQL 5.6 转储用户帐户支持的。从 MySQL Shell 8.0.26 开始,支持从 MySQL 5.6 转储用户帐户。
-
util.loadDump()
8.0.27 之前的 MySQL Shell 版本中的 MySQL Shell 转储加载实用程序 无法加载使用 MySQL Shell 8.0.27 或更高版本中的转储实用程序创建的转储。这是因为从 MySQL Shell 8.0.27 开始,转储元数据中包含有关创建转储时使用的功能的信息。此功能列表不向后兼容,但在未来版本中添加新功能时,它支持向后兼容。为了获得最佳功能,请始终使用 MySQL Shell 转储和转储加载实用程序的最新版本。 -
实例或架构中的对象名称必须位于
latin1
或utf8
字符集中。 -
仅对使用存储引擎的表保证数据一致性
InnoDB
。 -
用于运行该实用程序的用户帐户必须对涉及的所有模式具有的最低所需权限集如下:
EVENT
、RELOAD
、SELECT
、SHOW VIEW
和TRIGGER
。- 如果该
consistent
选项设置为true
,这是默认值,则LOCK TABLES
所有转储表上的权限可以替代该RELOAD
权限(如果后者不可用)。 - 在 MySQL Shell 8.0.29 之前,如果该
consistent
选项设置为true
默认值,BACKUP_ADMIN
则也需要该权限。从 MySQL Shell 8.0.29 开始,不再需要它。如果用户帐户没有BACKUP_ADMIN
权限并且LOCK INSTANCE FOR BACKUP
无法执行,实用程序会在转储期间进行额外的一致性检查。如果此检查失败,则实例转储将停止,但模式转储或表转储将继续,并返回错误消息以警告用户一致性检查失败。 - 如果该
consistent
选项设置为false
,则 不需要BACKUP_ADMIN
和 权限。RELOAD
- 如果转储来自 MySQL 5.6 或 MySQL 5.7 实例,
EXECUTE
并且转储中的视图调用函数来获取其数据(直到 MySQL 8.0.27,不再需要),也需要该权限。 - 如果转储来自 MySQL 5.6 实例并包含用户帐户(仅可使用实例转储实用程序实现),
SUPER
则还需要该权限。
- 如果该
-
从 MySQL Shell 8.0.24 开始,用于运行该实用程序的用户帐户需要相应
REPLICATION CLIENT
权限,以便该实用程序能够在转储元数据中包含二进制日志文件名和位置。如果用户 ID 没有该权限,转储将继续,但不包括二进制日志信息。将转储的数据加载到副本服务器后,可以使用二进制日志信息来设置与非 GTID 源服务器的复制,使用ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
语句选项CHANGE REPLICATION SOURCE TO
(从 MySQL Server 8.0.23 开始提供)。 -
用于将文件传输到 Oracle Cloud Infrastructure 对象存储存储桶的上传方法的文件大小限制为 1.2 TiB。在 MySQL Shell 8.0.21 中,多部分大小设置意味着首先应用多个文件部分的数字限制,从而创建大约 640 GB 的限制。从 MySQL Shell 8.0.22 开始,多部分大小设置已更改为允许完整文件大小限制。
-
这些实用程序将以文本形式(例如 )存储的数据类型不安全的列转换
BLOB
为 Base64。因此,这些列的大小不得超过max_allowed_packet
目标 MySQL 实例上配置的系统变量值(以字节为单位)的大约 0.74 倍。 -
对于表转储实用程序,导出的视图和触发器不得使用限定名称来引用其他视图或表。
-
表转储实用程序不会转储例程,因此转储对象(例如,使用函数的视图)引用的任何例程在加载转储时必须已经存在。
-
要导入到 MySQL 数据库系统,请将
ocimds
选项设置为true
,以确保与 MySQL HeatWave 服务的兼容性。 -
为了与 MySQL HeatWave 服务兼容,所有表都必须使用
InnoDB
存储引擎。该ocimds
选项检查转储中发现的任何异常,并且该compatibility
选项更改转储文件以将其他存储引擎替换为InnoDB
. -
对于实例转储实用程序和架构转储实用程序,为了与 MySQL HeatWave 服务兼容,实例或架构中的所有表必须位于 MySQL 数据目录中,并且必须使用默认架构加密。该
ocimds
选项更改转储文件以应用这些要求。 -
MySQL HeatWave 服务使用
partial_revokes=ON
,这意味着对包含通配符(例如_
或%
)的架构的数据库级用户授权将报告为错误。MySQL Shell 8.0.33 中引入了兼容性选项
ignore_wildcard_grants
,以及strip_invalid_grants
有关更多信息, 请参阅MySQL HeatWave 服务和 Oracle 云基础设施的选项。
-
许多其他与安全相关的限制和要求适用于表空间和与 MySQL HeatWave 服务兼容的权限等项目。该
ocimds
选项检查转储期间发现的任何异常,并且该compatibility
选项自动更改转储文件以解决某些兼容性问题。您可能需要(或更愿意)手动进行一些更改。有关更多详细信息,请参阅该选项的说明compatibility
。 -
对于使用组复制的 MySQL HeatWave 服务高可用性,每个表都需要主键。从 MySQL Shell 8.0.24 开始,该
ocimds
选项检查转储中缺少主键的任何表并报告错误。compatibility
如果不需要,可以将该选项设置为忽略丢失的主键,或者通知 MySQL Shell 的转储加载实用程序在不存在主键的不可见列中添加主键。有关详细信息,请参阅该选项的说明compatibility
。如果可能,请考虑在再次转储之前在源服务器上的表中创建主键,而不是在实用程序中进行管理。 -
从 MySQL Shell 8.0.30 开始,如果针对 MySQL 5.7 运行任何转储实用程序,则
"ocimds": true
自动util.checkForServerUpgrade
运行 , 。根据转储中包含的对象类型运行升级前检查。
运行实用程序
实例转储实用程序、架构转储实用程序和表转储实用程序使用 MySQL Shell 全局会话来获取从中执行导出的目标 MySQL 服务器的连接详细信息。在运行其中一个实用程序之前,您必须打开全局会话(可以具有 X 协议连接或经典 MySQL 协议连接)。这些实用程序为每个线程打开自己的会话,从全局会话复制连接压缩和 SSL 选项等选项,并且不再进一步使用全局会话。
在 MySQL Shell API 中,实例转储实用程序、模式转储实用程序和表转储实用程序是 util
全局对象的函数,并具有以下签名:
util.dumpInstance(outputUrl[, options])
util.dumpSchemas(schemas, outputUrl[, options])
util.dumpTables(schema, tables, outputUrl[, options])