MySQL Shell 8.4  /  MySQL Shell 实用程序  /  实例转储实用程序、架构转储实用程序和表转储实用程序

11.5 实例转储实用程序、架构转储实用程序和表转储实用程序

MySQL Shell 的实例转储实用程序 util.dumpInstance() 和架构转储实用程序 util.dumpSchemas() 支持将所有架构或选定架构从本地 MySQL 实例导出到 Oracle Cloud Infrastructure 对象存储桶或一组本地文件。表转储实用程序 util.dumpTables() 支持对架构中的选定表或视图执行相同的操作。然后可以使用 util.loadDump() 实用程序将导出的项目导入 HeatWave 服务 DB 系统或 MySQL Server 实例(请参见 第 11.6 节,“转储加载实用程序”)。为了获得最佳功能,始终使用最新的 MySQL Shell 转储和转储加载实用程序版本。

关于实用程序

MySQL Shell 的实例转储实用程序、架构转储实用程序和表转储实用程序提供 Oracle Cloud Infrastructure 对象存储流、HeatWave 服务兼容性检查和修改、使用多个线程的并行转储以及文件压缩,而 mysqldump 不提供这些功能。转储过程中会显示进度信息。您可以在选定的转储选项集上执行干运行,以显示将执行的操作、将转储的项目以及(对于实例转储实用程序和架构转储实用程序)运行实用程序以实际执行这些选项时需要修复的 HeatWave 服务兼容性问题的信息。

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

由 MySQL Shell 的实例转储实用程序、架构转储实用程序和表转储实用程序创建的转储包含指定架构结构的 DDL 文件以及包含数据的制表符分隔 .tsv 文件。您也可以选择仅生成 DDL 文件或仅生成数据文件,如果您希望分别设置导出的架构,然后再使用导出的数据填充它。您可以选择是否在转储期间锁定实例以进行备份,以确保数据一致性。默认情况下,转储实用程序会将表数据分成多个数据文件,并压缩这些文件。

您可以使用实用程序的选项来包含或排除指定的架构和表、用户及其角色和权限、事件、例程和触发器。如果您指定了冲突的包含和排除选项,或者指定了转储中未包含的对象,则会报告错误,并且转储将停止,以便您可以更正选项。如果您需要转储 MySQL 实例中的大部分架构,您可以使用实例转储实用程序作为替代策略,而不是使用架构转储实用程序,并指定 excludeSchemas 选项来列出不应转储的架构。类似地,如果您需要转储架构中的大部分表,可以使用 excludeTables 选项的架构转储实用程序,而不是使用表转储实用程序。

对于 mysql.apply_statusmysql.general_logmysql.schemamysql.slow_log 表 的数据始终从 MySQL Shell 的架构转储实用程序创建的转储中排除,尽管其 DDL 语句已包含在内。information_schemamysqlndbinfoperformance_schemasys 架构始终从实例转储中排除。

默认情况下,时区在转储输出中的所有时间戳数据中标准化为 UTC,这有助于在具有不同时区或处理具有多个时区的服务器之间移动数据。您可以使用 tzUtc: false 选项保留原始时间戳(如果需要)。

MySQL Shell 转储加载实用程序 util.loadDump() 支持使用预先验证请求 (PAR) 从对象存储桶加载导出的实例和架构。有关使用 PAR 加载转储的信息,请参见 第 11.6 节,“转储加载实用程序”

MySQL Shell 的实例转储实用程序、架构转储实用程序和表转储实用程序是分区感知的(请参见 分区,在 MySQL 手册 中)。当转储的表被分区时,每个分区都被视为一个独立的表;如果表具有子分区,则每个子分区都被视为一个独立的表。这也意味着,当启用分块时,每个分区或子分区表的分区或子分区将被独立分块。为分区表创建的转储文件的基名称使用格式 schema@table@partition,其中 schematable 分别是父架构和表的名称,partition 是分区或子分区的 URL 编码名称。

为了管理对早期版本的 MySQL Shell 实用程序不支持的功能的添加,util.dumpInstance()util.dumpSchemas()util.dumpTables()util.loadDump() 会将用于创建转储的功能列表写入转储元数据文件;对于每个这样的功能,列表中都会添加一个元素。当转储加载实用程序读取元数据文件并发现列出的不支持的功能时,它会报告错误;错误消息包含支持该功能的 MySQL Shell 版本。

要求和限制

  • 实例转储实用程序、架构转储实用程序和表转储实用程序仅支持 MySQL Server 版本的通用可用 (GA) 版本。

  • 转储将要加载到的目标 MySQL 实例需要 MySQL 5.7 或更高版本。

  • 对于源 MySQL 实例,从 MySQL 5.7 或更高版本转储在所有提供实用程序的 MySQL Shell 版本中均得到完全支持。

  • 实例或架构中的对象名称必须使用 latin1utf8 字符集。

  • 仅对于使用 InnoDB 存储引擎的表,才能保证数据一致性。

  • 用于运行实用程序的用户帐户对所有相关架构必须具有以下最小权限集:EVENTRELOADSELECTSHOW VIEWTRIGGER.

    • 如果 consistent 选项设置为 true(这是默认值),则所有转储表的 LOCK TABLES 权限可以代替 RELOAD 权限(如果后者不可用)。

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

    • 如果 consistent 选项设置为 false,则不需要 BACKUP_ADMINRELOAD 权限。

    • 如果转储来自 MySQL 5.6 实例,并且包含用户帐户(这仅可能使用实例转储实用程序),则还需要 SUPER 权限。

  • 用于运行实用程序的用户帐户需要 REPLICATION CLIENT 权限,以便实用程序能够将二进制日志文件名和位置包含在转储元数据中。如果用户 ID 没有该权限,则转储将继续,但不会包含二进制日志信息。在将转储数据加载到副本服务器后,可以使用 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS 选项的 CHANGE REPLICATION SOURCE TO 语句,将二进制日志信息用于使用非 GTID 源服务器设置复制。

  • 用于将文件传输到 Oracle 云基础设施对象存储桶的上传方法的文件大小限制为 1.2 TiB。

  • 实用程序将数据类型不适合以文本形式存储的列(例如 BLOB)转换为 Base64。因此,这些列的大小不得超过目标 MySQL 实例上配置的 max_allowed_packet 系统变量(以字节为单位)值的约 0.74 倍。

  • 对于表转储实用程序,导出的视图和触发器不得使用限定名来引用其他视图或表。

  • 表转储实用程序不转储例程,因此转储对象(例如,使用函数的视图)引用的任何例程在加载转储时必须已存在。

  • 要导入到 HeatWave Service DB 系统,请将 ocimds 选项设置为 true,以确保与 HeatWave Service 兼容。

    重要

    迁移到 HeatWave Service 时,建议始终使用最新版本的 MySQL Shell。

  • 为了与 HeatWave Service 兼容,所有表都必须使用 InnoDB 存储引擎。 ocimds 选项检查转储中发现的任何异常,而 compatibility 选项将更改转储文件以将其他存储引擎替换为 InnoDB

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

  • HeatWave Service 使用 partial_revokes=ON,这意味着包含通配符(例如 _%)的架构上的数据库级用户授权将被报告为错误。

    您还可以使用兼容性选项 ignore_wildcard_grantsstrip_invalid_grants

    有关更多信息,请参见 HeatWave Service 和 Oracle 云基础设施的选项

  • 为了与 HeatWave Service 兼容,表空间和权限等项目还适用许多其他与安全性相关的限制和要求。 ocimds 选项检查转储过程中发现的任何异常,而 compatibility 选项会自动更改转储文件以解决一些兼容性问题。您可能需要(或更愿意)手动进行一些更改。有关更多详细信息,请参见 compatibility 选项的描述。

  • 对于使用组复制的 HeatWave Service 高可用性,每个表都需要主键。 ocimds 选项检查并报告转储中任何缺少主键的表的错误。如果不需要主键,则可以将 compatibility 选项设置为忽略缺少的主键,或者通知 MySQL Shell 的转储加载实用程序在没有主键的列中添加不可见的主键。有关详细信息,请参见 compatibility 选项的描述。如果可能,请考虑在再次转储之前在源服务器上的表中创建主键,而不是在实用程序中管理主键。

  • 如果对 MySQL 5.7 运行任何转储实用程序,且 "ocimds": true,则除非 skipUpgradeChecks 禁用这些检查,否则将自动运行 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])

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

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

对于表转储实用程序,schema 指定包含要转储项目的架构,而 tables 是一个字符串数组,指定要转储的表或视图。表转储包括在目标 MySQL 实例中设置指定架构所需的信息,尽管可以通过使用转储加载实用程序的 schema 选项将其加载到备用目标架构中。

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

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

要转储指定架构中的所有视图和表,请使用 all 选项并将 tables 参数设置为一个空数组,如以下示例所示

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

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

shell-js> util.dumpInstance("C:/Users/hanna/worlddump", {dryRun: true, ocimds: true})
Checking for compatibility with HeatWave Service 8.0.33
...
Compatibility issues with HeatWave Service 8.0.33 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 云基础设施对象存储桶,outputUrl 是一个路径,该路径将用于在存储桶中对转储文件进行前缀,以模拟目录结构。使用 osBucketName 选项提供对象存储桶的名称,并使用 osNamespace 选项标识存储桶的命名空间。在本例中,用户将已连接的 MySQL 实例中的 world 架构转储到对象存储桶,与上一个示例中的兼容性修改相同

shell-js> 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/[email protected]	
worlddump/[email protected]	
worlddump/world@city@@0.tsv.zst
worlddump/world@city@@0.tsv.zst.idx
...

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

转储控制选项

dryRun: [ true | false ]

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

showProgress: [ true | false ]

显示 (true) 或隐藏 (false) 转储的进度信息。默认值为 true(如果 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 READSTART TRANSACTION WITH CONSISTENT SNAPSHOT 语句启动。当所有线程都启动了交易后,实例将被锁定以进行备份(如 锁定实例以进行备份和解锁实例语句 中所述),并且全局读锁将被释放。

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

skipConsistencyChecks: [ true | false ]

启用 (true) 或禁用 (false) 在 consistent: true 时执行的额外一致性检查。默认值为 false

如果 consistent: false,则忽略此选项。

skipUpgradeChecks: [true | false]

默认值为 false。启用此选项可禁用在 ocimds: true 时默认运行的升级检查。不会检查与 MySQL 版本升级相关的兼容性问题。仅在单独执行升级检查器时使用此选项。

转储输出选项

tzUtc: [ true | false ]

在转储的开头包含一个语句以将时区设置为 UTC。转储输出中的所有时间戳数据都将转换为此时区。默认值为 true,因此时间戳数据默认情况下会转换。将时区设置为 UTC 方便在时区不同的服务器之间移动数据或处理具有多个时区的数据集。如果需要,将此选项设置为 false 以保留原始时间戳。

compression: "string;level=n"

创建转储文件时使用的压缩类型和压缩级别。以下压缩选项可用

  • none:不应用压缩。

  • gzip:使用 gzip 压缩库。压缩级别可以设置为 0 到 9。默认压缩级别为 1。例如

                      "compression": "gzip;level=4"
  • zstd:默认。使用 zstd 压缩库。压缩级别可以设置为 1 到 22。默认压缩级别为 1。例如

                      "compression": "zstd;level=15"
checksum: [ true | false ]

如果启用,则会使用转储生成一个元数据文件 @.checksums.json。此文件包含转储的校验和数据,允许在加载转储时进行数据验证。请参阅 加载控制选项

如果 checksum: true,则适用以下条件

  • 如果 ddlOnly:falsechunking:true,则会为每个转储的表和分区块生成校验和。

  • 如果 ddlOnly:falsechunking:false,则会为每个转储的表和表分区生成校验和。

  • 如果 ddlOnly:true,则会为每个转储的表和表分区生成校验和。

chunking: [ true | false ]

启用 (true) 或禁用 (false) 表数据的块化,这将把每个表的 data 分割成多个文件。默认值为 true,因此默认情况下启用块化。使用 bytesPerChunk 指定块大小。如果将块化选项设置为 false,则不会进行块化,并且实用程序将为每个表创建一个 data 文件。

如果表没有主键或唯一索引,则块化将根据表中的行数、平均行长和 bytesPerChunk 值进行。

bytesPerChunk: "string"

设置在启用块化时写入每个 data 文件的大致字节数。可以使用 k(千字节)、M(兆字节)和 G(千兆字节)作为单位后缀。默认值为 64 MB。指定此选项会隐式将 chunking 设置为 true。实用程序旨在将每个表的 data 块化成文件,每个文件在应用压缩之前都包含此数量的数据。块大小是平均值,它是根据表统计信息和 explain 计划估算值计算的。

dialect: [default|csv|csv-unix|tsv]

为导出 data 文件的格式指定一组字段和行处理选项。您可以使用选定的方言作为进一步自定义的基础,也可以通过指定一个或多个 linesTerminatedByfieldsTerminatedByfieldsEnclosedByfieldsOptionallyEnclosedfieldsEscapedBy 选项来更改设置。

默认方言生成的 data 文件与使用 SELECT...INTO OUTFILE 语句并使用该语句的默认设置创建的文件相匹配。.txt 是为这些输出文件分配的适当文件扩展名。其他方言可用于导出适用于 DOS 或 UNIX 系统的 CSV 文件 (.csv) 以及 TSV 文件 (.tsv)。

对每种方言应用的设置如下

表 11.3 表导出实用程序的方言设置

dialect

linesTerminatedBy

fieldsTerminatedBy

fieldsEnclosedBy

fieldsOptionallyEnclosed

fieldsEscapedBy

default

[LF]

[TAB]

[empty]

false

\

csv

[CR][LF]

,

''

true

\

csv-unix

[LF]

,

''

false

\

tsv

[CR][LF]

[TAB]

''

true

\


注意
  1. 方言的回车符和换行符值与操作系统无关。

  2. 如果您使用 linesTerminatedByfieldsTerminatedByfieldsEnclosedByfieldsOptionallyEnclosedfieldsEscapedBy 选项,则根据命令解释器的转义约定,如果您在选项值中使用反斜杠字符 (\\),则可能需要将反斜杠字符 (\\) 加倍。

  3. 与使用 SELECT...INTO OUTFILE 语句的 MySQL 服务器一样,MySQL Shell 不会验证您指定的字段和行处理选项。对这些选项进行不正确的选择会导致数据被部分或错误地导出。在开始导出之前始终验证您的设置,并在之后验证结果。

linesTerminatedBy: "characters"

一个或多个字符(或空字符串),实用程序使用它们来终止导出 data 文件中的每一行。默认值与指定的方言相同,或者如果省略了方言选项,则为换行符 (\n)。此选项等效于 SELECT...INTO OUTFILE 语句的 LINES TERMINATED BY 选项。请注意,实用程序没有提供 SELECT...INTO OUTFILE 语句的 LINES STARTING BY 选项的等效项,该选项设置为空字符串。

fieldsTerminatedBy: "characters"

一个或多个字符(或空字符串),实用程序使用它们来终止导出 data 文件中的每个字段。默认值与指定的方言相同,或者如果省略了方言选项,则为制表符 (\t)。此选项等效于 SELECT...INTO OUTFILE 语句的 FIELDS TERMINATED BY 选项。

fieldsEnclosedBy: "character"

单个字符(或空字符串),实用程序使用它们来包围导出 data 文件中的每个字段。默认值与指定的方言相同,或者如果省略了方言选项,则为空字符串。此选项等效于 SELECT...INTO OUTFILE 语句的 FIELDS ENCLOSED BY 选项。

fieldsOptionallyEnclosed: [ true | false ]

是否为 fieldsEnclosedBy 给出的字符包围导出 data 文件中的所有字段 (false),还是仅在字段具有字符串数据类型(例如 CHARBINARYTEXTENUM)时包围字段 (true)。默认值与指定的方言相同,或者如果省略了方言选项,则为 false。此选项使 fieldsEnclosedBy 选项等效于 SELECT...INTO OUTFILE 语句的 FIELDS OPTIONALLY ENCLOSED BY 选项。

fieldsEscapedBy: "character"

用于在导出 data 文件中开始转义序列的字符。默认值与指定的方言相同,或者如果省略了方言选项,则为反斜杠 (\\)。此选项等效于 SELECT...INTO OUTFILE 语句的 FIELDS ESCAPED BY 选项。如果将此选项设置为空字符串,则不会转义任何字符,这是不推荐的,因为 SELECT...INTO OUTFILE 使用的特殊字符必须转义。

过滤选项

where

一个键值对,包含一个有效的表标识符(格式为 schemaName.tableName)和一个有效的 SQL 条件表达式,用于筛选要导出的数据。

注意

仅在执行 SQL 时才会进行验证。如果要导出多个表,则任何与 SQL 语法相关的错误都将在过程的后期出现。因此,建议您在将 SQL 条件用于长时间运行的导出过程之前对其进行测试。

在以下示例中,where 仅导出表 sakila.actorsakila.actor_infoactor_id 值大于 150 的行,并将这些行导出到名为 out 的本地文件夹中

 util.dumpTables("sakila", ["actor","actor_info"], "out", {"where" : 
   {"sakila.actor": "actor_id > 150", "sakila.actor_info": "actor_id > 150"}})
partitions: {schemaName.tableName: ["string","string",..]}

一个有效的 partition 名称列表,它将导出限制为指定的 partition。

例如,要仅导出表 schema.table 中名为 p1p2 的 partition:partitions: {schema.table:["p1", "p2"]}

以下示例导出 table1 中的 partition p1 和 p2 以及 table2 中的 partition p2

              util.dumpTables("schema", ["table","table2"], "out", {"partitions" : 
              { "schema.table1":  ["p1", "p2"],"schema.table2":  ["p1"]}})
ddlOnly: [ true | false ]

将此选项设置为 true 将仅包含转储项目 DDL 文件,而不是转储 data。默认值为 false

dataOnly: [ true | false ]

将此选项设置为 true 将仅包含转储项目 data 文件,而不是包含 DDL 文件。默认值为 false

users: [ true | false ]

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

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

注意

如果要从 MySQL 5.6 实例中转储用户,则执行复制操作的用户必须拥有 SUPER 权限。

excludeUsers: array of strings

(仅限实例转储实用程序) 从转储文件中排除命名的用户帐户。您可以使用它来排除无法导入 HeatWave Service DB 系统的用户帐户,或者已经存在或不需要在目标 MySQL 实例上的用户帐户。对于使用用户名和主机名定义的帐户,请使用格式 "'user_name'@'host_name'" 指定每个用户帐户字符串;对于仅使用用户名定义的帐户,请使用格式 "'user_name'" 指定每个用户帐户字符串。如果您没有提供主机名,则将排除所有具有该用户名名的帐户。

includeUsers: array of strings

(仅限实例转储实用程序) 仅在转储文件中包含命名的用户帐户。指定每个用户帐户字符串,就像 excludeUsers 选项一样。如果转储中只需要几个用户帐户,此选项是 excludeUsers 的替代方案。您也可以同时指定这两个选项,以包含某些帐户并排除其他帐户。

excludeSchemas: 字符串数组

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

includeSchemas: 字符串数组

(仅限实例转储实用程序) 仅在转储中包含命名的模式。您不能通过在此选项中命名来包含 information_schemamysqlndbinfoperformance_schemasys 模式。如果要转储其中一个或多个模式,可以使用模式转储实用程序 util.dumpSchemas() 执行此操作。

excludeTables: 字符串数组

(仅限实例转储实用程序和模式转储实用程序) 从转储中排除命名的表。表名必须使用有效的模式名限定,并在需要时用反引号引起来。由 excludeTables 选项命名的表在转储中没有 DDL 文件或数据文件。请注意,mysql.apply_statusmysql.general_logmysql.schemamysql.slow_log 表 的数据始终从模式转储中排除,尽管它们的 DDL 语句已包含在内,您也不能通过在另一个选项或实用程序中命名表来包含该数据。

注意

包含多字节字符的模式和表名必须用反引号括起来。

includeTables: 字符串数组

(仅限实例转储实用程序和模式转储实用程序) 仅在转储中包含命名的表。表名必须使用有效的模式名限定,并在需要时用反引号引起来。

注意

包含多字节字符的模式和表名必须用反引号括起来。

events: [ true | false ]

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

excludeEvents: 字符串数组

(仅限实例转储实用程序和模式转储实用程序) 从转储中排除命名的事件。事件的名称必须使用有效的模式名限定,并在需要时用反引号引起来。

includeEvents: 字符串数组

(仅限实例转储实用程序和模式转储实用程序) 仅在转储中包含命名的事件。事件的名称必须使用有效的模式名限定,并在需要时用反引号引起来。

routines: [ true | false ]

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

excludeRoutines: 字符串数组

(仅限实例转储实用程序和模式转储实用程序) 从转储中排除命名的函数和存储过程。例程的名称必须使用有效的模式名限定,并在需要时用反引号引起来。

includeRoutines: 字符串数组

(仅限实例转储实用程序和模式转储实用程序) 仅在转储中包含命名的函数和存储过程。例程的名称必须使用有效的模式名限定,并在需要时用反引号引起来。

all: [ true | false ]

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

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

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

excludeTriggers: 字符串数组

(所有转储实用程序) 从转储中排除命名的触发器。触发器的名称必须使用有效的模式名和表名限定 (schema.table.trigger),并在需要时用反引号引起来。您可以通过使用此选项指定模式名和表名来排除特定表的全部触发器 (schema.table)。

includeTriggers: 字符串数组

(所有转储实用程序) 仅在转储中包含命名的触发器。触发器的名称必须使用有效的模式名和表名限定 (schema.table.trigger),并在需要时用反引号引起来。您可以通过使用此选项指定模式名和表名来包含特定表的全部触发器 (schema.table)。

HeatWave 服务和 Oracle Cloud Infrastructure 的选项

osBucketName: "string"

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

osNamespace: "string"

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

ociConfigFile: "string"

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

ociProfile: "string"

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

ocimds: [ true | false ]

将此选项设置为 true 将启用与 HeatWave 服务兼容性的检查和修改。默认值为 false

重要

迁移到 HeatWave Service 时,建议始终使用最新版本的 MySQL Shell。

将此选项设置为 true 时,DATA DIRECTORYINDEX DIRECTORYENCRYPTION 选项在 CREATE TABLE 语句中被注释掉,以确保所有表都位于 MySQL 数据目录中并使用默认模式加密。对 CREATE TABLE 语句中的任何存储引擎(除 InnoDB 之外)执行检查,以查看是否将不合适的权限授予用户或角色,以及其他兼容性问题。如果发现任何不符合的 SQL 语句,则会引发异常并停止转储。使用 dryRun 选项列出转储中所有项目的全部问题,然后再启动转储过程。使用 compatibility 选项自动修复转储输出中的问题。

此选项默认设置为 false,并且仅在显式设置为 true 时才会启用。

注意

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

targetVersion: n.n.n

以 n.n.n 格式定义目标 MySQL 实例的版本。例如,8.1.0。如果未设置值,则使用 MySQL Shell 版本。

根据 targetVersion 的值调整兼容性检查。

compatibility: 字符串数组

对转储输出中的所有表应用与 HeatWave 服务兼容性的指定要求,根据需要更改转储文件。

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

force_innodb

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

skip_invalid_accounts

删除使用 HeatWave 服务不支持的外部身份验证插件创建的用户帐户。此选项还会删除未设置密码的用户帐户,但如果将没有密码的帐户标识为角色,则会使用 CREATE ROLE 语句转储它。

strip_definers
注意

如果目标 HeatWave 服务实例的版本为 8.2.0 或更高版本,则不需要此选项。

从 MySQL Server 8.2.0 开始,SET_USER_ID 已弃用,并且将在未来版本中删除。SET_USER_IDSET_ANY_DEFINERALLOW_NONEXISTENT_DEFINER 替代。此更改影响 MySQL Shell 如何处理用于 HeatWave 服务 (ocimds: true) 的转储,因为管理员用户具有 SET_ANY_DEFINER 权限,并且能够使用 DEFINER 子句执行语句。在以前版本中,这不可能。

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

strip_restricted_grants

GRANT 语句中删除 HeatWave 服务限制的特定权限,以便用户及其角色无法获得这些权限(这会导致用户创建失败)。如果 Oracle Cloud Infrastructure 计算实例上的管理员用户帐户本身没有相关权限,此选项还会删除系统模式 (mysqlsys) 的 REVOKE 语句,因此无法删除它们。

strip_tablespaces

CREATE TABLE语句中删除TABLESPACE子句,以便所有表都在其默认表空间中创建。HeatWave 服务对表空间有一些限制。

ignore_missing_pks

使实例、模式或表转储实用程序在执行转储时忽略任何丢失的主键,以便即使没有主键,ocimds选项仍然可以使用,而不会因为此检查而导致转储停止。使用此修改创建的转储不能加载到 HeatWave 服务高可用性实例中,因为 HeatWave 服务高可用性使用组复制,需要主键。要添加丢失的主键,请使用create_invisible_pks修改,或考虑在源服务器上的表中创建主键。

ignore_wildcard_grants

如果启用,则会忽略对包含通配符的模式的授权错误,这些通配符在启用了partial_revokes系统变量的系统中会以不同的方式解释。

strip_invalid_grants

如果启用,则会删除在加载用户时会失败的授权语句。例如,引用不存在的特定例程的授权。

create_invisible_pks

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

此修改不会改变转储数据,因为表在被转储加载实用程序处理之前不包含不可见列。不可见列(名为 "my_row_id")不会影响使用上传表的应用程序。

以这种方式添加主键目前还不能启用将修改后的表入站复制到高可用性实例,因为该功能当前要求主键同时存在于源服务器和副本服务器中。如果可能,请考虑在转储表之前在源服务器上的表中创建主键,而不是使用此修改。您可以使用不可见列来保存主键,对应用程序没有任何影响。这是性能和可用性的最佳实践,有助于转储的数据库与 HeatWave 服务无缝协作。

注意

由于 MySQL 8.0.23 对隐藏列的限制,MySQL Shell 的转储加载实用程序只能用于将使用create_invisible_pks选项创建的转储加载到目标 MySQL 实例版本 8.0.24 或更高版本上。

与 S3 兼容服务的选项

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

注意

MySQL Shell 支持在命令行选项、环境变量和配置文件中配置 AWS S3。命令行选项会覆盖环境变量、配置文件和默认选项。

有关配置要求的信息,请参见第 4.7 节“云服务配置”

s3BucketName: "string"

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

s3CredentialsFile:"string"

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

s3ConfigFile: "string"

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

s3Profile: "string"

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

s3Region: "string"

用于连接的区域的名称。

s3EndpointOverride: "string"

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

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

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

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

以下示例显示了将 MySQL 实例转储到 S3 存储桶 Bucket001 中的文件夹 test 中,并使用了一些兼容性选项

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

以下示例显示了将 MySQL 实例转储到对象存储存储桶 Bucket001 中的前缀 test 中,使用配置文件 oci,将 s3EndpointOverride 用于将连接定向到所需租户和区域的 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"]})

Microsoft Azure Blob 存储的选项

MySQL Shell 支持转储到 Microsoft Azure Blob 存储。

注意

MySQL Shell 支持在命令行选项、环境变量和配置文件中配置 Microsoft Azure Blob 存储。命令行选项会覆盖环境变量和配置文件。

有关配置要求以及配置类型优先级的顺序的信息,请参见第 4.7 节“云服务配置”

azureContainerName: "string"

必需。要写入转储的 Azure 容器的名称。该容器必须存在。

azureConfigFile: "string"

可选。包含存储连接参数的配置文件,而不是默认位置的配置文件,例如 ~/.azure/config。如果未定义,则使用默认配置文件。

azureContainerName 必须定义,并且不能为空。

azureStorageAccount: "string"

可选。用于操作的 Azure 存储帐户的名称。

azureStorageSasToken: "string"

可选。Azure 共享访问签名 (SAS) 令牌,用于操作的身份验证,而不是密钥。

在以下示例中,配置使用配置字符串来指定连接参数,这意味着转储命令只需要 azureContainerName

示例 config 文件

        [cloud]
         name = AzureCloud

        [storage]
         connection_string=alphanumericConnectionString

示例 dumpInstance 命令,将实例的内容导出到名为 prefix1 的文件夹中,位于名为 mysqlshellazure 的容器中

        util.dumpInstance("prefix1", {azureContainerName: "mysqlshellazure", threads: 4})

使用 PAR 转储到对象存储存储桶

outputURL 也可以是存储桶或前缀预先授权请求 (PAR)。这使您可以将数据直接转储到 OCI 对象存储存储桶中。

必须定义 PAR,并启用以下权限

  • 允许对象读取和写入

  • 启用对象列表

如果将 PAR 定义为 outputURL,则不支持以下选项,如果使用这些选项,则会导致错误

  • osBucketName

  • s3BucketName

  • azureContainerName

注意

仅支持存储桶和前缀 PAR 作为 outputURL。无法使用对象 PAR。

如果 PAR 不受支持,或者未定义正确的权限,则会返回 OCI 错误。

如果目标存储桶不为空,则操作将失败并返回错误。如果存在具有定义前缀的对象,则操作将失败并返回错误。

注意

定义前缀 par 时,生成的 PAR URL 不包含定义的前缀。您必须手动将其添加到 URL 中。

存储桶 PAR 示例

以下示例将实例转储到定义的存储桶 PAR

      util.dumpInstance("https://objectstorage.region.oraclecloud.com/p/secret/n/myTenancy/b/myBucket/o/")

以下示例将模式 sakila 转储到定义的存储桶 PAR

      util.dumpSchemas(["sakila"], "https://objectstorage.region.oraclecloud.com/p/secret/n/myTenancy/b/myBucket/o/")

以下示例将表 sakila.actor 转储到定义的存储桶 PAR

      util.dumpTables("sakila", ["actor"], "https://objectstorage.region.oraclecloud.com/p/secret/n/myTenancy/b/myBucket/o/")

前缀 PAR 示例

定义前缀 par 时,生成的 PAR URL 不包含定义的前缀。您必须手动将其添加到 URL 中。

以下示例将实例转储到定义的存储桶 PAR 中的前缀 MyPrefix

      util.dumpInstance("https://objectstorage.region.oraclecloud.com/p/secret/n/myTenancy/b/myBucket/o/MyPrefix/")

以下示例将模式 sakila 转储到定义的存储桶 PAR 中的前缀 MyPrefix

      util.dumpSchemas(["sakila"], "https://objectstorage.region.oraclecloud.com/p/secret/n/myTenancy/b/myBucket/o/MyPrefix/")

以下示例将表 sakila.actor 转储到定义的存储桶 PAR 中的前缀 MyPrefix

      util.dumpTables("sakila", ["actor"], "https://objectstorage.region.oraclecloud.com/p/secret/n/myTenancy/b/myBucket/o/MyPrefix/")

实用程序错误消息

范围在 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

    消息:写入时出现错误代码 %d

  • 错误号:52016;符号:SHERR_DUMP_SD_QUERY_FAILED

    消息:无法执行 '%s':%s

  • 错误号:52017;符号:SHERR_DUMP_SD_COLLATION_DATABASE_ERROR

    消息:处理选择 @@collation_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 失败,错误:%s

  • 错误号:52023;符号:SHERR_DUMP_SD_SHOW_CREATE_TABLE_EMPTY

    消息:表 %s 的 create table 语句为空

  • 错误号: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

    消息:运行 SHOW CREATE TABLE %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'.'%s' 的 DDL 时出错:%s

  • 错误号:52030;符号:SHERR_DUMP_SD_VIEW_TEMPORARY_DDL_ERROR

    消息:转储视图 '%s'.'%s' 的临时 DDL 时出错:%s

  • 错误号:52031;符号:SHERR_DUMP_SD_VIEW_DDL_ERROR

    消息:转储视图 '%s'.'%s' 的 DDL 时出错:%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()、实例转储工具 util.dumpInstance()、模式转储工具 util.dumpSchemas() 和表转储工具 util.dumpTables() 遇到的连接和网络错误。在大多数情况下,错误代码与所涉及的 HTTP 错误匹配 - 例如,当 URL 目标未找到时 (HTTP 404 未找到) 就会出现错误 54404。可能会返回以下错误

  • 错误号:54000;符号:SHERR_DL_COMMON_CONNECTION_ERROR

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

  • 错误号:5410054511;符号:SHERR_NETWORK_[HTTP 错误名称]

    消息:上下文特定消息