MySQL 外壳 8.0  / 第 11 章 MySQL Shell 实用程序  /  11.5 实例转储实用程序、模式转储实用程序和表转储实用程序

11.5 实例转储实用程序、模式转储实用程序和表转储实用程序

MySQL Shell 的实例转储实用程序 util.dumpInstance()和模式转储实用程序 util.dumpSchemas()在 MySQL Shell 8.0.21 中引入,支持将所有模式或选定模式从本地 MySQL 实例导出到 Oracle Cloud Infrastructure 对象存储桶或一组本地文件中。MySQL Shell 8.0.22 中引入的表转储实用程序util.dumpTables()支持从模式中选择表或视图的相同操作。util.loadDump()然后可以使用该实用程序 将导出的项目导入 MySQL 数据库服务数据库系统(简称 MySQL 数据库系统)或 MySQL 服务器实例(请参阅第 11.6 节,“转储加载实用程序”). 要获得最佳功能,请始终使用最新版本的 MySQL Shell 的转储和转储加载实用程序。

关于实用程序

MySQL Shell 的实例转储实用程序、模式转储实用程序和表转储实用程序提供 Oracle Cloud Infrastructure 对象存储流、MySQL 数据库服务兼容性检查和修改、多线程并行转储和文件压缩,这些是 mysqldump不提供的。转储过程中会显示进度信息。您可以使用您选择的一组转储选项进行试运行,以显示有关将执行哪些操作、将转储哪些项目以及(对于实例转储实用程序和模式转储实用程序)需要哪些 MySQL 数据库服务兼容性问题的信息待修复,当您使用这些选项实际运行该实用程序时。

在为转储文件选择目标时,请注意,要导入到 MySQL 数据库系统,运行转储加载实用程序的 MySQL Shell 实例必须安装在有权访问 MySQL 数据库系统的 Oracle Cloud Infrastructure Compute 实例上。如果将实例、模式或表转储到对象存储桶,则可以从计算实例访问对象存储桶。如果您在本地系统上创建转储文件,则需要使用您选择的复制实用程序将它们传输到 Oracle Cloud Infrastructure Compute 实例,具体取决于您为 Compute 实例选择的操作系统。

由 MySQL Shell 的实例转储实用程序、模式转储实用程序和表转储实用程序创建的转储包括指定模式结构的 DDL 文件和 .tsv包含数据的制表符分隔文件。如果您想将导出的模式设置为单独的练习,而不是用导出的数据填充它,您还可以选择仅生成 DDL 文件或仅生成数据文件。您可以选择是否在转储期间锁定实例以进行备份以确保数据一致性。默认情况下,转储实用程序将表数据分块到多个数据文件中并压缩这些文件。

您可以使用实用程序的选项来包括或排除指定的模式和表、用户及其角色和授权、事件、例程和触发器。如果您指定冲突的包含和排除选项或命名一个无论如何不包含在转储中的对象,在 MySQL Shell 8.0.28 之前,这种情况将被忽略并且转储在没有对象的情况下继续进行。从 MySQL Shell 8.0.28 开始报告错误并且转储停止,因此您可以更正选项。如果您需要转储 MySQL 实例中的大部分模式,作为替代策略,您可以使用实例转储实用程序而不是模式转储实用程序,并指定excludeSchemas 列出那些不被转储的模式的选项。同样,如果您需要转储模式中的大部分表,您可以使用带有 excludeTables选项的模式转储实用程序而不是表转储实用程序。

mysql.apply_statusmysql.general_logmysql.schema和 的数据mysql.slow_log tables总是从 MySQL Shell 的模式转储实用程序创建的转储中排除,尽管包含它们的 DDL 语句。、 information_schemamysql、 和 架构始终从实例转储ndbinfo中 排除。 performance_schemasys

默认情况下,dump输出的所有timestamp数据的时区都标准化为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 手册中的 分区)。当被转储的表被分区时,每个分区被视为一个独立的表;如果表有子分区,每个子分区都被视为一个独立的表。这也意味着,当启用分块时,分区表或子分区表的每个分区或子分区都是独立分块的。为分区表创建的转储文件的基本名称使用格式 ,其中和 schema@table@partitionschematable分别是父模式和表 partition的名称,是分区或子分区的 URL 编码名称。

要管理早期版本的 MySQL Shell 实用程序不支持的功能添加,从 MySQL Shell 8.0.27 开始,将 util.dumpInstance()用于 创建转储的 功能列表写入转储元数据文件;对于每个这样的特征,列表中都会添加一个元素。当转储加载实用程序读取元数据文件并发现列出了不受支持的功能时,它会报告错误;错误消息包括支持该功能的 MySQL Shell 版本。MySQL Shell 8.0.27 中引入的分区感知特性是第一个支持特性管理的特性。 util.dumpSchemas()util.dumpTables()util.loadDump()

要求和限制

  • 实例转储实用程序、模式转储实用程序和表转储实用程序仅支持 MySQL 服务器版本的一般可用性 (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 转储用户帐户。

  • MySQL Shell 8.0.27 之前版本的 MySQL Shell 的转储加载实用程序 util.loadDump()无法加载使用 MySQL Shell 8.0.27 或更高版本中的转储实用程序创建的转储。这是因为从 MySQL Shell 8.0.27 开始,转储元数据中包含有关创建转储时使用的功能的信息。此功能列表不向后兼容,但在未来版本添加新功能时支持向后兼容。要获得最佳功能,请始终使用最新版本的 MySQL Shell 的转储和转储加载实用程序。

  • 实例或模式中的对象名称必须在 latin1utf8 字符集中。

  • InnoDB只有使用存储引擎 的表才能保证数据的一致性 。

  • 用于运行该实用程序的用户帐户必须对所有涉及的 模式具有的最低要求权限集如下 : EVENT、、、、 和 。 RELOADSELECTSHOW VIEWTRIGGER

    • 如果该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 数据库服务兼容。

  • 为了与 MySQL 数据库服务兼容,所有表都必须使用InnoDB存储引擎。该ocimds选项检查转储中发现的任何异常,并且该 compatibility选项更改转储文件以将其他存储引擎替换为 InnoDB.

  • 对于实例转储实用程序和模式转储实用程序,为了与 MySQL 数据库服务兼容,实例或模式中的所有表必须位于 MySQL 数据目录中,并且必须使用默认模式加密。该 ocimds选项更改转储文件以应用这些要求。

  • 许多其他与安全相关的限制和要求适用于与 MySQL 数据库服务兼容的表空间和特权等项目。该ocimds选项检查在转储期间发现的任何异常,并且该 compatibility选项自动更改转储文件以解决一些兼容性问题。您可能需要(或更喜欢)手动进行一些更改。有关详细信息,请参阅该 compatibility选项的说明。

  • 对于使用组复制的 MySQL 数据库服务高可用性,每个表都需要主键。从 MySQL Shell 8.0.24 开始,该ocimds 选项检查并报告转储中缺少主键的任何表的错误。该 compatibility选项可以设置为在不需要时忽略丢失的主键,或者通知 MySQL Shell 的转储加载实用程序在主键不存在的不可见列中添加主键。有关详细信息,请参阅compatibility 选项的说明。如果可能,不要在实用程序中管理它,而是考虑在再次转储它们之前在源服务器上的表中创建主键。

  • 从 MySQL Shell 8.0.30 开始,如果任何转储实用程序针对 MySQL 5.7运行"ocimds": trueutil.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])

options是一个选项字典,如果它为空则可以省略。实例转储实用程序、架构转储实用程序和表转储实用程序的可用选项在本主题的其余部分中列出。

对于模式转储实用程序,schemas 指定要从 MySQL 实例转储的一个或多个模式的列表。

对于表转储实用程序,schema指定包含要转储的项目的模式,并且 tables是一个字符串数组,指定要转储的表或视图。从 MySQL Shell 8.0.23 开始,表转储包括在目标 MySQL 实例中设置指定模式所需的信息,尽管可以使用转储加载实用程序的schema选项将其加载到备用目标模式中。在 MySQL Shell 8.0.22 中,不包含架构信息,因此必须将此实用程序生成的转储文件加载到现有目标架构中。

表转储实用程序可用于从模式中选择单个表,例如,如果您想要在模式之间传输表。在 MySQL Shell 的 JavaScript 模式下的这个示例中,表employees和 模式被salaries导出hr 到本地目录 emp,实用程序在当前工作目录中创建该目录:

shell-js> util.dumpTables("hr", [ "employees", "salaries" ], "emp")

要转储指定模式中的所有视图和表,请使用该all选项并将 tables参数设置为空数组,如本例所示:

shell-js> util.dumpTables("hr", [], "emp", { "all": true })

如果要转储到本地文件系统, outputUrl则为一个字符串,指定要放置转储文件的本地目录的路径。您可以指定绝对路径或相对于当前工作目录的路径。您可以为本地目录路径加上file://架构前缀。在此示例中,连接的 MySQL 实例被转储到本地目录,并在转储文件中进行了一些修改以与 MySQL 数据库服务兼容。用户首先执行试运行以检查模式并查看兼容性问题,然后运行转储并应用适当的兼容性选项来消除问题:

shell-js> util.dumpInstance("C:/Users/hanna/worlddump", {dryRun: true, ocimds: true})
Checking for compatibility with MySQL Database Service 8.0.21
...
Compatibility issues with MySQL Database Service 8.0.21 were found. Please use the 
'compatibility' option to apply compatibility adaptations to the dumped DDL.
Util.dumpInstance: Compatibility issues were found (RuntimeError)
shell-js> util.dumpInstance("C:/Users/hanna/worlddump", {
        > ocimds: true, compatibility: ["strip_definers", "strip_restricted_grants"]})

在导出发生之前,目标目录必须为空。如果该目录在其父目录中尚不存在,则该实用程序会创建它。对于导出到本地目录,在转储期间创建的目录是使用访问权限创建的rwxr-x---,并且文件是使用访问权限创建的 rw-r-----(在支持这些权限的操作系统上)。文件和目录的所有者是运行 MySQL Shell 的用户帐户。

如果您要转储到 Oracle Cloud Infrastructure 对象存储桶,outputUrl是一个路径,将用于为桶中的转储文件添加前缀,以模拟目录结构。使用该osBucketName 选项提供对象存储桶的名称,并使用该 osNamespace选项标识该桶的命名空间。在 MySQL Shell 的 Python 模式下的这个示例中,用户将world模式从连接的 MySQL 实例转储到对象存储桶,具有与上一个示例相同的兼容性修改:

shell-py> util.dumpSchemas(["world"], "worlddump", {
        > "osBucketName": "hanna-bucket", "osNamespace": "idx28w1ckztq", 
        > "ocimds": "true", "compatibility": ["strip_definers", "strip_restricted_grants"]})

在对象存储桶中,转储文件都以前缀 出现worlddump,例如:

worlddump/@.done.json	
worlddump/@.json	
worlddump/@.post.sql
worlddump/@.sql
worlddump/world.json	
worlddump/world.sql	
worlddump/world@city.json	
worlddump/world@city.sql	
worlddump/world@city@@0.tsv.zst
worlddump/world@city@@0.tsv.zst.idx
...

对象存储桶的命名空间显示在 Oracle Cloud Infrastructure 控制台中桶详细信息页面的 Bucket Information选项卡中,或者可以使用 Oracle Cloud Infrastructure 命令行界面获取。使用默认 Oracle Cloud Infrastructure CLI 配置文件中的默认配置文件或您使用ociConfigFileociProfile选项指定的替代详细信息与对象存储桶建立连接。有关设置 CLI 配置文件的说明,请参阅 SDK 和 CLI 配置文件

转储控制选项

dryRun: [ true | false ]

显示有关将使用指定选项集转储的内容的信息,以及有关 MySQL 数据库服务兼容性检查结果的信息(如果 ocimds指定了该选项),但不继续转储。设置此选项使您能够在开始转储之前列出所有兼容性问题。默认值为false

showProgress: [ true | false ]

显示 ( true) 或隐藏 ( false) 转储的进度信息。默认是trueif stdout是一个终端 ( tty),例如当 MySQL Shell 处于交互模式时,false否则。进度信息包括要转储的估计总行数、到目前为止转储的行数、完成百分比以及每秒行数和字节数的吞吐量。

threads: int

用于从 MySQL 实例转储数据块的并行线程数。每个线程都有自己的 MySQL 实例连接。默认值为 4。

maxRate: "string"

转储期间数据读取吞吐量的每个线程每秒的最大字节数。k可以使用千字节、M 兆字节和千兆字节的单位后缀 G(例如,将100M 吞吐量设置为每线程每秒 100 兆字节)。设置0(这是默认值)或将选项设置为空字符串,意味着没有设置限制。

defaultCharacterSet: "string"

在 MySQL Shell 打开到服务器以进行转储的会话连接期间使用的字符集。默认值为utf8mb4。系统变量的会话值 character_set_clientcharacter_set_connectioncharacter_set_results 为每个连接设置为此值。字符集必须是 character_set_client 系统变量允许的,并且是MySQL实例支持的。

consistent: [ true | false ]

通过在转储期间锁定备份实例来启用 ( true) 或禁用 ( false) 一致数据转储。默认值为true

设置时true,实用程序使用语句设置全局读锁FLUSH TABLES WITH READ LOCK(如果用于运行该实用程序的用户 ID 具有RELOAD 特权),或使用语句设置一系列表锁LOCK TABLES(如果用户 ID 没有RELOAD特权但有LOCK TABLES). 每个线程的事务都是使用语句SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ和开始的START TRANSACTION WITH CONSISTENT SNAPSHOT。当所有线程都开始它们的事务时,实例被锁定以进行备份(如 LOCK INSTANCE FOR BACKUP 和 UNLOCK INSTANCE Statements中所述)并释放全局读锁。

从 MySQL Shell 8.0.29 开始,如果用户帐户没有BACKUP_ADMIN 权限且LOCK INSTANCE FOR BACKUP 无法执行,实用程序会在转储期间进行额外的一致性检查。如果此检查失败,实例转储将停止,但模式转储或表转储将继续并返回一条错误消息以提醒用户一致性检查失败。

转储输出选项

tzUtc: [ true | false ]

在转储开始时包含一条语句,将时区设置为 UTC。转储输出中的所有时间戳数据都转换为该时区。默认为 true,因此默认转换时间戳数据。将时区设置为 UTC 有助于在具有不同时区的服务器之间移动数据,或者处理具有多个时区的一组数据。如果愿意,将此选项设置false为保留原始时间戳。

compression: "string"

为转储写入数据文件时使用的压缩类型。默认是使用 zstd 压缩 ( zstd)。备选方案是使用 gzip 压缩 ( gzip) 或不压缩 ( none)。

chunking: [ true | false ]

为表数据启用 ( true) 或禁用 ( false) 分块,将每个表的数据拆分为多个文件。默认值为true,因此默认启用分块。用于bytesPerChunk指定块大小。为了将表数据分块到单独的文件中,必须为表定义主键或唯一索引,实用程序使用它来选择索引列以对数据进行排序和分块。如果表不包含其中任何一个,则会显示警告并将表数据写入单个文件。如果将分块选项设置为false, 分块不会发生,实用程序会为每个表创建一个数据文件。

bytesPerChunk: "string"

设置启用分块时要写入每个数据文件的近似字节数。k可以使用千字节、M 兆字节和G千兆字节的单位后缀 。MySQL Shell 8.0.22 中的默认值为 64 MB ( 64M)(MySQL Shell 8.0.21 中为 32 MB),最小值为 128 KB ( 128k)。指定此选项设置chunkingtrue隐式。该实用程序旨在在应用压缩之前将每个表的数据分块到文件中,每个文件都包含此数据量。块大小是一个平均值,是根据表统计信息和解释计划估计计算得出的。

MySQL 数据库服务和 Oracle 云基础设施的选项

osBucketName: "string"

要写入转储的 Oracle Cloud Infrastructure 对象存储桶的名称。默认情况下, [DEFAULT]位于 的 Oracle Cloud Infrastructure CLI 配置文件中的配置文件 ~/.oci/config用于建立与存储桶的连接。ociConfigFile您可以使用和 ociProfile选项替换要用于连接的替代配置文件 。有关设置 CLI 配置文件的说明,请参阅 SDK 和 CLI 配置文件

osNamespace: "string"

by 命名的对象存储桶所在的 Oracle Cloud Infrastructure 命名空间osBucketName。对象存储桶的命名空间显示在 Oracle Cloud Infrastructure 控制台中桶详细信息页面的 Bucket Information 选项卡中,或者可以使用 Oracle Cloud Infrastructure 命令行界面获取。

ociConfigFile: "string"

一个 Oracle Cloud Infrastructure CLI 配置文件,其中包含用于连接的配置文件,而不是默认位置中的配置文件 ~/.oci/config

ociProfile: "string"

用于连接的 Oracle Cloud Infrastructure 配置文件的配置文件名称,而不是用于连接 [DEFAULT]的 Oracle Cloud Infrastructure CLI 配置文件中的配置文件。

ocimds: [ true | false ]

设置此选项以true启用检查和修改与 MySQL 数据库服务的兼容性。默认值为false。从 MySQL Shell 8.0.23 开始,此选项可用于所有实用程序,在该版本之前,它仅可用于实例转储实用程序和模式转储实用程序。

当该选项设置为true, DATA DIRECTORY, INDEX DIRECTORY,语句中的ENCRYPTION 选项在CREATE TABLE DDL文件中被注释掉,确保所有表都位于MySQL数据目录下,并使用默认的schema加密。CREATE TABLE对除 之外的语句 中的任何存储引擎、 InnoDB向用户或角色授予不合适的权限以及其他兼容性问题进行检查。如果发现任何不符合要求的 SQL 语句,则会引发异常并停止转储。使用dryRun在开始转储过程之前列出转储中项目的所有问题的选项。使用该 compatibility选项自动修复转储输出中的问题。

从 MySQL Shell 8.0.22 到 MySQL Shell 8.0.26,当此选项设置为true并使用该 osBucketName选项提供对象存储桶名称时,该 ociParManifest选项也默认为 true,这意味着生成的清单文件包含预验证请求( PAR) 用于转储中的所有文件,转储文件只能使用这些 PAR 访问。从 MySQL Shell 8.0.27 开始,引入了对存储桶中所有对象或具有特定前缀的存储桶中对象的 PAR 支持,该ociParManifest选项 false默认设置为,并且仅在设置为时启用true明确地。

笔记

从 MySQL Shell 8.0.30 开始,如果任何转储实用程序针对 MySQL 5.7运行"ocimds": trueutil.checkForServerUpgrade则会自动运行。根据转储中包含的对象类型运行升级前检查。

compatibility: array of strings

对转储输出中的所有表应用与 MySQL 数据库服务兼容的指定要求,并根据需要更改转储文件。从 MySQL Shell 8.0.23 开始,此选项可用于所有实用程序,在该版本之前,它仅可用于实例转储实用程序和模式转储实用程序。

可以将以下修改指定为字符串数组:

force_innodb

更改CREATE TABLE 语句以将 InnoDB存储引擎用于任何尚未使用它的表。

skip_invalid_accounts

删除使用 MySQL 数据库服务不支持的外部身份验证插件创建的用户帐户。从 MySQL Shell 8.0.26 开始,此选项还会删除没有设置密码的用户帐户,除非没有密码的帐户被标识为角色,在这种情况下,它会使用CREATE ROLE语句转储。

strip_definers

从视图、例程、事件和触发器中删除DEFINER子句,以便使用默认定义器(用户调用模式)创建这些对象,并将 SQL SECURITY视图和例程的子句更改为指定INVOKER 而不是DEFINER. MySQL 数据库服务需要特殊权限才能使用加载模式的用户以外的定义器创建这些对象。如果您的安全模型要求视图和例程具有比查询或调用它们的帐户更多的权限,则您必须在加载它之前手动修改架构。

strip_restricted_grants

从语句中删除受 MySQL 数据库服务限制的特定权限 GRANT,因此不能为用户及其角色授予这些权限(这会导致用户创建失败)。从 MySQL Shell 8.0.22 开始,如果 Oracle Cloud Infrastructure Compute 实例上的管理用户帐户本身没有相关权限,则 此选项还会删除REVOKE 系统模式 (mysql和 ) 的语句,因此无法删除它们。sys

strip_tablespaces

从语句中删除该TABLESPACE子句 CREATE TABLE ,因此所有表都在其默认表空间中创建。MySQL 数据库服务对表空间有一些限制。

ignore_missing_pks

使实例、模式或表转储实用程序在执行转储时忽略任何缺少的主键,以便ocimds 在转储不会因该检查而停止的情况下仍然可以使用该选项。使用此修改创建的转储无法加载到 MySQL 数据库服务高可用性实例中,因为使用组复制的 MySQL 数据库服务高可用性需要主键。要改为添加缺少的主键,请使用 create_invisible_pks 修改,或考虑在源服务器上的表中创建主键。

create_invisible_pks

在转储元数据中添加一个标志,以通知 MySQL Shell 的转储加载实用程序为每个不包含主键的表在不可见列中添加主键。此修改使某些表缺少主键的转储能够加载到 MySQL 数据库服务高可用性实例中。MySQL 数据库服务高可用性需要主键,它使用组复制。

此修改未更改转储数据,因为在转储加载实用程序处理这些表之前,这些表不包含不可见的列。不可见的列(名为“ my_row_id”)对使用上传表的应用程序没有影响。

以这种方式添加主键还不能将修改后的表入站复制到高可用性实例,因为该功能目前要求主键同时存在于源服务器和副本服务器中。如果可能,请考虑在源服务器上的表中创建主键,而不是使用此修改,然后再次转储它们。从 MySQL 8.0.23 开始,您可以通过使用不可见的列来保存主键来执行此操作,而不会影响应用程序。这是性能和可用性的最佳实践,

笔记

由于 MySQL 8.0.23 中隐藏列的限制, MySQL Shell 的转储加载实用程序只能用于将通过 create_invisible_pks 修改创建的转储加载到 MySQL Server 8.0.24 或更高版本的目标 MySQL 实例上。MySQL Shell 8.0.24 之前的 MySQL Shell 版本中的转储加载实用程序会自动忽略转储元数据标志并且不会添加主键,因此请确保使用最新版本的实用程序。

ociParManifest: [ true | false ]

设置此选项可true为转储中的每个项目生成用于读取访问的 PAR(对象读取 PAR),以及列出所有 PAR URL 的清单文件。默认情况下,PAR 会在一周后过期,您可以使用该ociParExpireTime 选项进行更改。

此选项可从 MySQL Shell 8.0.22 用于实例转储实用程序和模式转储实用程序,并且只能在导出到对象存储桶时使用(因此需要osBucketName设置选项)。从 MySQL Shell 8.0.23 开始,此选项可用于所有转储实用程序。

From MySQL Shell 8.0.22 to MySQL Shell 8.0.26, when the ocimdsoption is set to trueand an Object Storage bucket name is supplied using the osBucketName option, ociParManifestis set to trueby default, otherwise it is set to falseby default. 从 MySQL Shell 8.0.27 开始,引入了对存储桶中所有对象或存储桶中具有特定前缀的对象的 PAR 支持,默认ociParManifest设置为 ,只有在明确 false设置时才启用。true

在用于连接到对象存储桶的 Oracle 云基础设施配置文件中指定的用户(该DEFAULT用户或ociProfile选项指定的其他用户)是 PAR 的创建者。该用户必须具有 PAR_MANAGE与存储桶中的对象进行交互的权限和适当的权限,如 使用预验证请求中所述。如果为任何对象创建 PAR 时出现问题,则会删除相关文件并停止转储。

要启用加载使用启用选项创建的转储文件 ,请按照使用预验证请求中的说明为清单文件 () ociParManifest创建一个只读 PAR 。如果您想在转储完成之前开始加载转储,则可以在转储仍在进行时执行此操作。您可以使用具有所需权限的任何用户帐户创建此 PAR。然后转储加载实用程序必须使用 PAR URL 通过清单文件访问转储文件。该 URL 仅在创建时显示,因此请将其复制到持久存储中。 @.manifest.json

重要的

在使用此访问方法之前,请评估对存储桶或对象进行预身份验证访问的业务要求和安全后果。PAR 使任何拥有 PAR 访问权限的人都可以访问请求中标识的目标。仔细管理 PAR 的分配。

ociParExpireTime: "string"

ociParManifest选项设置为 true 时生成的 PAR 的到期时间 。默认值为当前时间加一周,采用 UTC 格式。

此选项可从 MySQL Shell 8.0.22 获得,用于实例转储实用程序和模式转储实用程序。从 MySQL Shell 8.0.23 开始,此选项可用于所有转储实用程序。

根据创建 PAR 时 Oracle Cloud Infrastructure 的要求,到期时间必须格式化为 RFC 3339 时间戳。格式 YYYY-MM-DDTHH-MM-SS后紧跟字母 Z(UTC 时间)或本地时间的 UTC 偏移量 [+|-]hh:mm,例如 2020-10-01T00:09:51.000+02:00。MySQL Shell 不验证到期时间,但任何格式错误都会导致转储中第一个文件的 PAR 创建失败,从而停止转储。

S3 兼容服务的选项

MySQL Shell 支持将 MySQL 数据转储到与 S3 兼容的存储桶,例如 Amazon Web Services (AWS) S3。

有关支持的服务及其配置要求的信息,请参阅 第 4.7 节“云服务配置”

s3BucketName: "string"

要写入转储的 S3 存储桶的名称。默认情况下,位于的文件的配置 default 文件用于 建立与 S3 存储桶的连接。您可以使用和 选项替换连接的替代配置和凭据。有关安装和配置 AWS CLI 的说明,请参阅 AWS CLI 入门configcredentials~/.aws/s3ConfigFiles3CredentialsFile

s3CredentialsFile:"string"

包含用于连接的用户凭据的凭据文件,而不是默认位置中的凭据,~/.aws/credentials. 通常,凭据文件包含 用于连接 的aws_access_key_id和 。aws_secret_access_key

s3ConfigFile: "string"

一个配置文件,其中包含用于连接的配置文件,而不是默认位置的配置文件,例如~/.aws/config. 通常,配置文件包含用于连接的区域和输出类型。

s3Profile: "string"

用于连接的 s3 CLI 配置文件的配置文件名称,而不是default 配置文件。

s3EndpointOverride: "string"

要使用的端点的 URL 而不是默认值。

连接到 Oracle Cloud Infrastructure S3 兼容性 API 时,端点采用以下格式: . 替换为对象存储命名空间和 您的区域标识符。例如,美国东部(阿什本)区域的区域标识符是。 https://namespace.compat.objectstorage.region.oraclecloud.comnamespaceregionus-ashburn-1

对于美国东部(阿什本)区域中名为 axaxnpcrorw5 的命名空间:

https://axaxnpcrorw5.compat.objectstorage.us-ashburn-1.oraclecloud.com.

以下示例显示了将 MySQL 实例转储到testS3 存储桶中 的文件夹,Bucket001并具有一些兼容性选项:

        util.dumpInstance("test",{s3bucketName: "Bucket001", threads: 4, 
        compatibility: ["strip_restricted_grants", "strip_definers", "ignore_missing_pks"]})

以下示例显示了将 MySQL 实例转储到test对象存储桶中 的前缀,,Bucket001使用配置文件, ocis3EndpointOverride连接定向到所需租赁和区域的 OCI 端点,以及一些兼容性选项:

        util.dumpInstance("test",{s3BucketName: "Bucket001", 
        s3EndpointOverride: "https://axaxnpcrorw5.compat.objectstorage.us-ashburn-1.oraclecloud.com", 
        s3Profile: "oci", threads: 4, 
        compatibility: ["strip_restricted_grants", "strip_definers", "ignore_missing_pks"]})

过滤选项

ddlOnly: [ true | false ]

将此选项设置为true仅包括转储中转储项的 DDL 文件,而不转储数据。默认值为 false

dataOnly: [ true | false ]

将此选项设置为true仅包括转储中转储项的数据文件,而不包括 DDL 文件。默认值为 false

users: [ true | false ]

(仅限实例转储实用程序)在转储中包括 (true) 或排除 (false) 用户及其角色和授权。默认值为 true,因此默认包含用户。模式转储实用程序和表转储实用程序不包括转储中的用户、角色和授权。

从 MySQL Shell 8.0.22 开始,您可以使用 excludeUsersincludeUsers选项指定要排除或包含在转储文件中的单个用户帐户。这些选项还可以与 MySQL Shell 的转储加载实用程序 一起使用util.loadDump(),以根据目标 MySQL 实例的要求在导入时排除或包含单个用户帐户。

笔记
  1. 不支持从 MySQL 5.6 实例中转储用户帐户。如果您从此版本转储,请设置users: false.

  2. root在 MySQL Shell 8.0.21 中,如果转储文件中存在用户帐户或其他受限用户帐户名称,则 尝试将用户导入 MySQL 数据库系统会导致导入失败,因此无法将用户导入 MySQL 数据库系统在该版本中受支持。

excludeUsers: array of strings

(仅限实例转储实用程序)从转储文件中排除指定的用户帐户。此选项可从 MySQL Shell 8.0.22 获得,您可以使用它来排除不接受导入 MySQL 数据库系统、目标 MySQL 实例上已经存在或不需要的用户帐户。 为用用户名和主机名定义的帐户或 为仅用用户名定义的指定格式的每个用户帐户字符串 如果您不提供主机名,则将排除具有该用户名的所有帐户。 "'user_name'@'host_name'""'user_name'"

includeUsers: array of strings

(仅限实例转储实用程序)在转储文件中仅包括指定的用户帐户。为excludeUsers选项指定每个用户帐户字符串。excludeUsers此选项可从 MySQL Shell 8.0.22 获得,如果转储中只需要几个用户帐户,您可以将其用作替代方法您还可以同时指定这两个选项以包含一些帐户并排除其他帐户。

excludeSchemas: array of strings

(仅限实例转储实用程序)从转储中排除命名模式。请注意,information_schemamysqlndbinfoperformance_schemasys架构始终从实例转储中排除。

includeSchemas: array of strings

(仅限实例转储实用程序)在转储中仅包含命名模式。此选项可从 MySQL Shell 8.0.28 获得。您不能通过在此选项上命名来包含 information_schemamysqlndbinfoperformance_schemasys架构。如果要转储这些模式中的一个或多个,可以使用模式转储实用程序来完成此操作 util.dumpSchemas()

excludeTables: array of strings

(仅限实例转储实用程序和模式转储实用程序)从转储中排除指定的表。表名必须用有效的模式名限定,并在需要时用反引号引用。由该选项命名的表 excludeTables在转储中没有 DDL 文件或数据文件。请注意,尽管包括了它们的 DDL 语句,但 、 、 和 的数据mysql.apply_status始终 mysql.general_logmysql.schema排除 mysql.slow_log tables在模式转储之外,并且您不能通过在另一个选项或实用程序中命名该表来包括该数据。

includeTables: array of strings

(仅限实例转储实用程序和模式转储实用程序)仅在转储中包含指定的表。此选项可从 MySQL Shell 8.0.28 获得。表名必须用有效的模式名限定,并在需要时用反引号引用。

events: [ true | false ]

(仅限实例转储实用程序和模式转储实用程序)在转储中为每个模式包含 (true) 或排除 (false默认值为true

excludeEvents: array of strings

(仅限实例转储实用程序和模式转储实用程序)从转储中排除指定的事件。此选项可从 MySQL Shell 8.0.28 获得。事件名称必须使用有效的模式名称进行限定,并在需要时用反引号字符引用。

includeEvents: array of strings

(仅限实例转储实用程序和模式转储实用程序)仅在转储中包含指定的事件。此选项可从 MySQL Shell 8.0.28 获得。事件名称必须用有效的模式名称限定,并在需要时用反引号字符引用。

routines: [ true | false ]

(仅限实例转储实用程序和模式转储实用程序)包括 (true) 或排除 (false) 转储中每个模式的函数和存储过程。默认值为 true。请注意,不包括用户定义的函数,即使routines设置为true

excludeRoutines: array of strings

(仅限实例转储实用程序和架构转储实用程序)从转储中排除指定的函数和存储过程。此选项可从 MySQL Shell 8.0.28 获得。例程的名称必须用有效的模式名称限定,并在需要时用反引号字符引用。

includeRoutines: array of strings

(仅限实例转储实用程序和架构转储实用程序)在转储中仅包含指定的函数和存储过程。此选项可从 MySQL Shell 8.0.28 获得。例程的名称必须用有效的模式名称限定,并在需要时用反引号字符引用。

all: [ true | false ]

(仅限表转储实用程序)设置此选项以 true在转储中包括来自指定模式的所有视图和表。默认值为 false。使用此选项时,请将tables参数设置为空数组,例如:

shell-js> util.dumpTables("hr", [], "emp", { "all": true })
triggers: [ true | false ]

(所有转储实用程序)转储中每个表的 包含 (true) 或排除 (false) 触发器。默认值为true

excludeTriggers: array of strings

(所有转储实用程序) 从转储中排除指定的触发器。此选项可从 MySQL Shell 8.0.28 获得。触发器的名称必须使用有效的架构名称和表名称 (schema.table.trigger) 进行限定,并在需要时用反引号字符引用。schema.table您可以通过使用此选项 ( ) 指定架构名称和表名称来排除特定表的所有触发器

includeTriggers: array of strings

(所有转储实用程序) 仅在转储中包含命名的触发器。此选项可从 MySQL Shell 8.0.28 获得。触发器的名称必须使用有效的架构名称和表名称 (schema.table.trigger) 进行限定,并在需要时用反引号字符引用。schema.table您可以通过使用此选项 ( ) 指定架构名称和表名称来包括特定表的所有触发器

实用程序错误消息

52000-52999 范围内的错误编号特定于 MySQL Shell 的实例转储实用程序 util.dumpInstance()、模式转储实用程序 util.dumpSchemas()和表转储实用程序 util.dumpTables()。可能会返回以下错误:

  • 错误编号:52000; 象征: SHERR_DUMP_LOCK_TABLES_MISSING_PRIVILEGES

    消息:用户 %s 缺少 %s 的以下权限:%s。

  • 错误编号:52001; 象征: SHERR_DUMP_GLOBAL_READ_LOCK_FAILED

    消息:无法获取全局读锁

  • 错误编号:52002; 象征: SHERR_DUMP_LOCK_TABLES_FAILED

    消息:无法锁定表:%s。

  • 错误编号:52003; 象征: SHERR_DUMP_CONSISTENCY_CHECK_FAILED

    消息:一致性检查失败。

  • 错误编号:52004; 象征: SHERR_DUMP_COMPATIBILITY_ISSUES_FOUND

    消息:发现兼容性问题

  • 错误编号:52005; 象征: SHERR_DUMP_COMPATIBILITY_OPTIONS_FAILED

    消息:无法应用某些兼容性选项

  • 错误编号:52006; 象征: SHERR_DUMP_WORKER_THREAD_FATAL_ERROR

    消息:转储期间发生致命错误

  • 错误编号:52007; 象征: SHERR_DUMP_MISSING_GLOBAL_PRIVILEGES

    消息:用户 %s 缺少以下全局权限:%s。

  • 错误编号:52008; 象征: SHERR_DUMP_MISSING_SCHEMA_PRIVILEGES

    消息:用户 %s 缺少架构 %s 的以下权限:%s。

  • 错误编号:52009; 象征: SHERR_DUMP_MISSING_TABLE_PRIVILEGES

    消息:用户 %s 缺少表 %s 的以下权限:%s。

  • 错误编号:52010; 象征: SHERR_DUMP_NO_SCHEMAS_SELECTED

    消息:架构过滤器导致空集。

  • 错误编号:52011; 象征: SHERR_DUMP_MANIFEST_PAR_CREATION_FAILED

    消息:为对象 '%s' 创建 PAR 失败:%s

  • 错误编号:52012; 象征: SHERR_DUMP_DW_WRITE_FAILED

    消息:无法将 %s 写入文件 %s

  • 错误编号:52013; 象征: SHERR_DUMP_IC_FAILED_TO_FETCH_VERSION

    消息:无法获取服务器版本。

  • 错误编号:52014; 象征: SHERR_DUMP_SD_CHARSET_NOT_FOUND

    消息:无法找到字符集:%s

  • 错误编号:52015; 象征: SHERR_DUMP_SD_WRITE_FAILED

    消息:写时有 errno %d

  • 错误编号:52016; 符号:SHERR_DUMP_SD_QUERY_FAILED

    消息:无法执行“%s”:%s

  • 错误编号:52017; 象征: SHERR_DUMP_SD_COLLATION_DATABASE_ERROR

    消息:处理选择@@collat​​ion_database 时出错;结果

  • 错误编号:52018; 象征: SHERR_DUMP_SD_CHARACTER_SET_RESULTS_ERROR

    消息:无法将 character_set_results 设置为:%s

  • 错误编号:52019; 象征: SHERR_DUMP_SD_CANNOT_CREATE_DELIMITER

    消息:无法为事件创建定界符:%s

  • 错误编号:52020; 象征: SHERR_DUMP_SD_INSUFFICIENT_PRIVILEGE

    消息:%s 对 %s 的权限不足!

  • 错误编号:52021; 象征: SHERR_DUMP_SD_MISSING_TABLE

    消息:%s 不存在于 information_schema 中

  • 错误编号:52022; 象征: SHERR_DUMP_SD_SHOW_CREATE_TABLE_FAILED

    消息:运行失败:show create table %s with error: %s

  • 错误编号:52023; 象征: SHERR_DUMP_SD_SHOW_CREATE_TABLE_EMPTY

    消息:为表清空创建表:%s

  • 错误编号:52024; 象征: SHERR_DUMP_SD_SHOW_FIELDS_FAILED

    消息:SHOW FIELDS FROM 在视图上失败:%s

  • 错误编号:52025; 象征: SHERR_DUMP_SD_SHOW_KEYS_FAILED

    消息:无法获取表 %s 的键:%s

  • 错误编号:52026; 象征: SHERR_DUMP_SD_SHOW_CREATE_VIEW_FAILED

    消息:失败:显示创建表 %s

  • 错误编号:52027; 象征: SHERR_DUMP_SD_SHOW_CREATE_VIEW_EMPTY

    消息:没有关于视图的信息:%s

  • 错误编号:52028; 象征: SHERR_DUMP_SD_SCHEMA_DDL_ERROR

    消息:为模式 '%s' 转储 DDL 时出错:%s

  • 错误编号:52029; 象征: SHERR_DUMP_SD_TABLE_DDL_ERROR

    消息:为表“%s”转储 DDL 时出错。“%s”:%s

  • 错误编号:52030; 象征: SHERR_DUMP_SD_VIEW_TEMPORARY_DDL_ERROR

    消息:为视图“%s”转储临时 DDL 时出错。“%s”:%s

  • 错误编号:52031; 象征: SHERR_DUMP_SD_VIEW_DDL_ERROR

    消息:为视图“%s”转储 DDL 时出错。“%s”:%s

  • 错误编号:52032; 象征: SHERR_DUMP_SD_TRIGGER_COUNT_ERROR

    消息:无法检查表的触发器计数:“%s”。“%s”

  • 错误编号:52033; 象征: SHERR_DUMP_SD_TRIGGER_DDL_ERROR

    消息:为表“%s”转储触发器时出错。“%s”:%s

  • 错误编号:52034; 象征: SHERR_DUMP_SD_EVENT_DDL_ERROR

    消息:为模式 '%s' 转储事件时出错:%s

  • 错误编号:52035; 象征: SHERR_DUMP_SD_ROUTINE_DDL_ERROR

    消息:为模式 '%s' 转储例程时出错:%s

  • 错误编号:52036; 象征: SHERR_DUMP_ACCOUNT_WITH_APOSTROPHE

    消息:帐户 %s 包含不支持的 ' 字符

54000-54999 范围内的错误号表示 MySQL Shell 的转储加载实用程序util.loadDump()或 MySQL Shell 的实例转储实用程序util.dumpInstance()、模式转储实用程序util.dumpSchemas()和表转储实用程序遇到的连接和网络错误util.dumpTables()。在大多数情况下,错误代码与所涉及的 HTTP 错误相匹配——例如,错误 54404 发生在未找到 URL 的目标时(HTTP 404 Not Found)。可能会返回以下错误:

  • 错误编号:54000; 象征: SHERR_DL_COMMON_CONNECTION_ERROR

    消息:%s连接错误:%s。

  • 错误编号:5410054511;象征: SHERR_NETWORK_[HTTP error name]

    消息:特定于上下文的消息