MySQL Shell 9.0  /  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 System,运行并行表导入实用程序的 MySQL Shell 实例必须安装在具有对 HeatWave Service DB System 的访问权限的 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 模式中),用户以 TSV 格式将 hr 架构中的 employees 表导出到对象存储桶 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

\

[LF]

[CR][LF]

[TAB]

''

true

\


注意
  1. tsv

  2. [TAB]

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

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

用于工具在导出的数据文件中终止每一行的一个或多个字符(或空字符串)。默认值为指定方言的默认值,如果省略方言选项,则为换行符(\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"

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

ociConfigFile: "string"

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

ociProfile: "string"

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

ociAuth: "string"

连接到 Oracle 云基础设施时使用的身份验证方法。此选项要求 osBucketName 使用有效值进行配置。

可以使用以下选项

  • api_key: OCI 连接使用 OCI 配置文件。请参阅 第 4.7.1 节“Oracle 云基础设施对象存储”

    如果 osBucketName 使用有效值定义,但未定义 ociAuth,则 api_key 是使用的默认值。

  • instance_principal: OCI 连接使用实例主体身份验证。请参阅 实例主体身份验证

    如果定义了 ociConfigFileociProfile,则不能使用此选项。

  • resource_principal: OCI 连接使用资源主体身份验证。请参阅 资源主体身份验证

    如果定义了 ociConfigFileociProfile,则不能使用此选项。

  • security_token: OCI 连接使用临时生成的会话令牌。请参阅 基于会话令牌的身份验证

与 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"})