MySQL Shell 8.4  /  MySQL Shell 实用程序  /  表导出实用程序

11.3 表导出实用程序

MySQL Shell 的表导出实用程序 util.exportTable() 将 MySQL 关系表导出到数据文件,该文件可以位于本地服务器上,也可以位于 Oracle Cloud Infrastructure 对象存储桶中。然后,可以使用 MySQL Shell 的并行表导入实用程序 util.importTable()(请参阅 第 11.4 节,“并行表导入实用程序”)将数据上传到目标 MySQL 服务器上的表,该实用程序使用并行连接为大型数据文件提供快速数据导入。数据文件还可用于将数据导入到其他应用程序中,或者用作单个数据表的轻量级逻辑备份。

关于实用程序

默认情况下,表导出实用程序以 MySQL Shell 的并行表导入实用程序的默认格式生成数据文件。提供了预设选项来导出适用于 DOS 或 UNIX 系统的 CSV 文件以及 TSV 文件。表导出实用程序无法生成 JSON 数据。您还可以设置字段和行处理选项,如 SELECT...INTO OUTFILE 语句中所述,以创建任意格式的数据文件。

util.exportTable() 可与分区表和子分区表一起使用,但不会对它们进行任何特殊处理。无论发行版版本如何,此实用程序始终为每个表创建一个文件。

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

要求和限制

以下要求适用于使用表导出实用程序进行导出

  • 源 MySQL 实例和目标 MySQL 实例需要 MySQL 5.7 或更高版本。

  • 用于将文件传输到 Oracle Cloud Infrastructure 对象存储桶的上传方法的文件大小限制为 1.2 TiB。

运行实用程序

表导出实用程序使用 MySQL Shell 全局会话从要执行导出的目标 MySQL 服务器获取连接详细信息。您必须打开全局会话(可以具有 X 协议连接或经典 MySQL 协议连接)才能运行实用程序。该实用程序为每个线程打开自己的会话,从全局会话复制连接压缩和 SSL 选项等选项,并且不再使用全局会话。您可以限制数据传输的最大速率,以平衡网络上的负载。

在 MySQL Shell API 中,表导出实用程序是 util 全局对象的函数,并且具有以下签名

util.exportTable(table, outputUrl[, options])

table 是要导出到数据文件的关联数据表的名称。表名可以使用有效的模式名称进行限定,并在需要时用反引号字符括起来。如果省略了模式,则使用 MySQL Shell 全局会话的活动模式。

options 是一个选项字典,如果为空,则可以省略。选项列在本主题的最后一部分中。

如果您要将数据导出到本地文件系统,则 outputUrl 是一个字符串,指定导出数据文件的路径以及文件名本身,并带有适当的扩展名。您可以指定绝对路径或相对于当前工作目录的路径。您可以使用 file:// 模式作为本地目录路径的前缀。在本示例中(在 MySQL Shell 的 JavaScript 模式下),用户使用默认方言从 hr 模式导出 employees 表。该文件写入用户主目录中的 exports 目录,并指定一个 .txt 扩展名,该扩展名适用于此格式的文件

shell-js> util.exportTable("hr.employees", "file:///home/hanna/exports/employees.txt")

在导出之前,目标目录必须存在,但不必为空。如果导出数据文件已存在,则会覆盖它。对于导出到本地目录,数据文件将使用 rw-r----- 访问权限创建(在支持这些权限的操作系统上)。文件的拥有者是运行 MySQL Shell 的用户帐户。

如果您要将数据导出到 Oracle Cloud Infrastructure 对象存储桶或与 S3 兼容的存储,则 outputUrl 是存储桶中数据文件的名称,包括适当的文件扩展名。您可以包含目录分隔符来模拟目录结构。使用 osBucketName 选项提供对象存储桶的名称,并使用 osNamespace 选项标识存储桶的命名空间。在本示例中(在 MySQL Shell 的 Python 模式下),用户将 hr 模式中的 employees 表导出为 TSV 格式的文件,并将其存储在 hanna-bucket 对象存储桶中

shell-py> util.export_table("hr.employees", "dump/employees.tsv", {
        > dialect: "tsv", "osBucketName": "hanna-bucket", "osNamespace": "idx28w1ckztq" })

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

选项

其中:“string

用于过滤要导出的数据的有效 SQL 条件表达式。

注意

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

在以下示例中,where 将仅导出 sakila.actor 表中 actor_id 值大于 150 的那些行,并将它们导出到名为 dump.csv 的文件

              util.exportTable("sakila.actor", "dump.csv", {"where" : "actor_id > 150"})
partitions: ["string","string",..]

有效分区名称的列表,它将导出限制为指定的分区。

以下示例将 schema.table 中的分区 p1 和 p2 导出到名为 dump.csv 的文件

              util.exportTable("schema.table", "dump.csv", {"partitions" : ["p1", "p2"]}
dialect: [default|csv|csv-unix|tsv]

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

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

为每个方言应用的设置如下所示

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

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"

一个或多个字符(或空字符串),用于在导出的数据文件中终止每一行。默认值为指定的方言,如果省略方言选项,则为换行符(\n)。此选项等效于SELECT...INTO OUTFILE语句的LINES TERMINATED BY选项。请注意,该实用程序未提供与SELECT...INTO OUTFILE语句的LINES STARTING BY选项等效的功能,该选项设置为空字符串。

fieldsTerminatedBy: "characters"

一个或多个字符(或空字符串),用于在导出的数据文件中终止每个字段。默认值为指定的方言,如果省略方言选项,则为制表符(\t)。此选项等效于SELECT...INTO OUTFILE语句的FIELDS TERMINATED BY选项。

fieldsEnclosedBy: "character"

单个字符(或空字符串),用于在导出的数据文件中包围每个字段。默认值为指定的方言,如果省略方言选项,则为空字符串。此选项等效于SELECT...INTO OUTFILE语句的FIELDS ENCLOSED BY选项。

fieldsOptionallyEnclosed: [ true | false ]

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

fieldsEscapedBy: "character"

在导出的数据文件中启动转义序列的字符。默认值为指定的方言,如果省略方言选项,则为反斜杠(\)。此选项等效于SELECT...INTO OUTFILE语句的FIELDS ESCAPED BY选项。如果将此选项设置为空字符串,则不会转义任何字符,这是不建议的,因为SELECT...INTO OUTFILE使用的特殊字符必须转义。

maxRate: "string"

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

showProgress: [ true | false ]

显示(true)或隐藏(false)导出的进度信息。默认情况下,如果stdout是终端(tty)(例如,当 MySQL Shell 处于交互模式时),则为true,否则为false。进度信息包括估计的总导出行数、已导出的行数、完成百分比以及每秒的行和字节吞吐量。

compression: "string;level=n"

写入导出的数据文件时要使用的压缩类型和压缩级别。以下压缩选项可用

  • none: 默认值。不应用压缩。

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

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

                      "compression": "zstd;level=15"
defaultCharacterSet: "string"

在 MySQL Shell 打开到服务器的导出会话连接期间使用的字符集。默认值为utf8mb4。系统变量character_set_clientcharacter_set_connectioncharacter_set_results的会话值对于每个连接都设置为此值。字符集必须由character_set_client系统变量允许,并受 MySQL 实例支持。

OCI 云基础设施选项

osBucketName: "string"

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

osNamespace: "string"

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

ociConfigFile: "string"

包含用于连接的配置文件的 Oracle 云基础设施 CLI 配置文件,而不是默认位置~/.oci/config中的配置文件。

ociProfile: "string"

用于连接的 Oracle 云基础设施配置文件的配置文件名称,而不是用于连接的 Oracle 云基础设施 CLI 配置文件中[DEFAULT]配置文件。

与 S3 兼容的服务选项

MySQL Shell 支持将表导出到与 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,而不是默认端点。

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

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

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

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) 令牌,而不是密钥。

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

示例config文件

        [cloud]
         name = AzureCloud

        [storage]
         connection_string=alphanumericConnectionString

示例exportTable命令,该命令将sakila.actor表导出为 TSV 文件,并导出到名为mysqlshellazure的容器

        util.exportTable("sakila.actor", "actor.tsv", {dialect: "tsv", azureContainerName: "mysqlshellazure"})