MySQL Shell 的表导出实用程序 util.exportTable()
在 MySQL Shell 8.0.22 中引入,可将 MySQL 关系表导出到本地服务器上或 Oracle Cloud Infrastructure 对象存储存储桶中的数据文件中。然后可以使用 MySQL Shell 的并行表导入实用程序util.importTable()
(请参阅 第 11.4 节“并行表导入实用程序” )将数据上传到目标 MySQL 服务器上的表中,该实用程序使用并行连接为大型数据文件提供快速数据导入。数据文件还可用于将数据导入到不同的应用程序,或作为单个数据表的轻量级逻辑备份。
- 关于实用程序
- 要求和限制
- 运行实用程序
- 选项
- OCI 云基础设施选项
- S3 兼容服务的选项
- Microsoft Azure Blob 存储选项
关于实用程序
默认情况下,表导出实用程序会为 MySQL Shell 并行表导入实用程序生成默认格式的数据文件。预设选项可用于导出 DOS 或 UNIX 系统的 CSV 文件以及 TSV 文件。表导出实用程序无法生成 JSON 数据。您还可以为语句设置字段和行处理选项, SELECT...INTO OUTFILE
以创建任意格式的数据文件。
util.exportTable()
可以与分区表和子分区表一起使用,但不对这些表执行任何特殊处理。无论发行版本如何,此实用程序始终为每个表创建一个文件。
选择表导出文件的目标时,请注意,要导入到 MySQL 数据库系统,运行并行表导入实用程序的 MySQL Shell 实例必须安装在有权访问 MySQL 数据库系统的 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 模式下,用户使用默认方言employees
从架构中导出表 。hr
该文件被写入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 模式下,用户将表employees
作为 hr
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 配置文件中的默认配置文件或您使用ociConfigFile
和 选项指定的替代详细信息建立与对象存储存储桶的连接ociProfile
。有关设置 CLI 配置文件的说明,请参阅 SDK 和 CLI 配置文件。
选项
-
where: "\*
string\*"
用于过滤导出数据的有效 SQL 条件表达式。笔记SQL 仅在执行时才有效。如果您要导出许多表,则任何与 SQL 语法相关的问题只会在过程后期才会出现。因此,建议您在长时间运行的导出过程中使用 SQL 条件之前对其进行测试。在以下示例中,仅将表中的值 大于 150 的
where
行导出 到名为 的文件中:sakila.actor``actor_id``dump.csv`` util.exportTable("sakila.actor", "dump.csv", {"where" : "actor_id > 150"})
-
partitions: ["\*
string\*","\*
string\*",..]
将导出限制为指定分区的有效分区名称列表。以下示例将分区 p1 和 p2 导出
schema.table
到名为 的文件dump.csv
:util.exportTable("schema.table", "dump.csv", {"partitions" : ["p1", "p2"]}
-
dialect: [default|csv|csv-unix|tsv]
为导出的数据文件的格式指定一组字段和行处理选项。您可以使用选定的方言作为进一步自定义的基础,还可以指定
linesTerminatedBy
、fieldsTerminatedBy
、fieldsEnclosedBy
、fieldsOptionallyEnclosed
和fieldsEscapedBy
选项中的一个或多个来更改设置。默认方言生成的数据文件SELECT...INTO OUTFILE
与使用具有该语句的默认设置的语句创建的内容相匹配。.txt
是分配给这些输出文件的适当文件扩展名。其他方言可用于导出 DOS 或 UNIX 系统的 CSV 文件 (.csv
) 和 TSV 文件 (.tsv
)。适用于每种方言的设置如下:表 11.1 表导出实用程序的方言设置dialect``linesTerminatedBy``fieldsTerminatedBy``fieldsEnclosedBy``fieldsOptionallyEnclosed``fieldsEscapedBy``default
[如果][标签][空的]false
`csv[CR][LF],”
true\
csv-unix[如果],”
false\
tsv[CR][LF][标签]”
true\ 笔记方言的回车和换行值与操作系统无关。如果您使用
linesTerminatedBy、
fieldsTerminatedBy、
fieldsEnclosedBy、
fieldsOptionallyEnclosed和
fieldsEscapedBy选项,根据命令解释器的转义约定,如果您在选项值中使用反斜杠字符 (\),则可能需要加倍反斜杠字符 (\)。与使用该语句的 MySQL 服务器一样 [
SELECT…INTO OUTFILE`](https://dev.mysql.com/doc/refman/8.0/en/select-into.html),MySQL Shell 不会验证您指定的字段和行处理选项。这些选项选择不准确可能会导致数据导出部分或不正确。请务必在开始导出之前验证您的设置,并在之后验证结果。 -
linesTerminatedBy: "\*
characters\*"
实用程序用一个或多个字符(或空字符串)来终止导出的数据文件中的每一行。默认值与指定的方言相同,
\n
如果省略方言选项,则默认为换行符 ( )。该选项相当于 语句LINES TERMINATED BY
的选项SELECT...INTO OUTFILE
。请注意,该实用程序不提供LINES STARTING BY
该SELECT...INTO OUTFILE
语句的等效选项,该选项设置为空字符串。 -
fieldsTerminatedBy: "\*
characters\*"
实用程序用一个或多个字符(或空字符串)来终止导出的数据文件中的每个字段。默认值与指定的方言相同,
\t
如果省略方言选项,则默认为制表符 ( )。该选项相当于 语句FIELDS TERMINATED BY
的选项SELECT...INTO OUTFILE
。 -
fieldsEnclosedBy: "\*
character\*"
实用程序用单个字符(或空字符串)将导出的数据文件中的每个字段括起来。默认值与指定的方言相同,如果省略方言选项,则默认值为空字符串。该选项相当于语句
FIELDS ENCLOSED BY
的选项SELECT...INTO OUTFILE
。 -
fieldsOptionallyEnclosed: [ true | false ]
给定的字符
fieldsEnclosedBy
是包围导出数据文件中的所有字段 (false
),还是仅包围具有字符串数据类型(如CHAR
、BINARY
、TEXT
或ENUM
(true
))的字段。默认值是指定的方言,或者false
省略方言选项。该选项使该fieldsEnclosedBy
选项等同于FIELDS OPTIONALLY ENCLOSED BY
该SELECT...INTO OUTFILE
语句的选项。 -
fieldsEscapedBy: "\*
character\*"
在导出的数据文件中开始转义序列的字符。默认值与指定的方言相同,如果省略方言选项,则默认值为反斜杠 ()。该选项相当于语句
FIELDS ESCAPED BY
的选项SELECT...INTO OUTFILE
。如果将此选项设置为空字符串,则不会转义任何字符,但不建议这样做,因为SELECT...INTO OUTFILE
必须转义使用的特殊字符。 -
maxRate: "\*
string\*"
导出期间每个线程数据读取吞吐量每秒的最大字节数。可以使用
k
千字节、M
兆字节和千兆字节的单位后缀G
(例如,将100M
吞吐量设置为每个线程每秒 100 兆字节)。设置0
(这是默认值),或将选项设置为空字符串,意味着不设置限制。 -
showProgress: [ true | false ]
显示 (
true
) 或隐藏 (false
) 导出进度信息。默认为true
ifstdout
是终端 (tty
),例如当 MySQL Shell 处于交互模式时,false
否则。进度信息包括估计要导出的总行数、到目前为止导出的行数、完成百分比以及每秒行数和字节数的吞吐量。 -
compression: "\*
string\*"
写入导出的数据文件时使用的压缩类型。默认情况下不使用压缩 (
none
)。替代方案是使用 gzip 压缩 (gzip
) 或 zstd 压缩 (zstd
)。 -
defaultCharacterSet: "\*
string\*"
MySQL Shell 为导出而打开到服务器的会话连接期间要使用的字符集。默认为
utf8mb4
.对于每个连接,系统变量character_set_client
、character_set_connection
和 的会话值character_set_results
都设置为此值。该字符集必须是系统变量允许character_set_client
且MySQL实例支持的。
OCI 云基础设施选项
-
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 控制台存储桶详细信息页面的存储桶信息选项卡中,或者可以使用 Oracle Cloud Infrastructure 命令行界面获取。 -
ociConfigFile: "\*
string\*"
一个 Oracle Cloud Infrastructure CLI 配置文件,其中包含用于连接的配置文件,而不是默认位置中的配置文件
~/.oci/config
。 -
ociProfile: "\*
string\*"
用于连接的 Oracle Cloud Infrastructure 配置文件的配置文件名称,而不是
[DEFAULT]
用于连接的 Oracle Cloud Infrastructure CLI 配置文件中的配置文件。
S3 兼容服务的选项
MySQL Shell 支持将表导出到 S3 兼容的存储桶,例如 Amazon Web Services (AWS) S3。
笔记
MySQL Shell 支持命令行选项、环境变量和配置文件中的 AWS S3 配置。命令行选项覆盖环境变量、配置文件和默认选项。
有关配置要求的信息,请参阅 第 4.7 节 “云服务配置”。
-
s3BucketName: "\*
string\*"
要写入导出的 S3 存储桶的名称。默认情况下,位于 的
default
配置文件config
和 文件用于建立与 S3 存储桶的连接。您可以使用和 选项替换连接的替代配置和凭据。有关安装和配置 AWS CLI 的说明,请参阅 AWS CLI 入门。credentials``~/.aws/``s3ConfigFile``s3CredentialsFile
-
s3CredentialsFile:"\*
string\*"
一种凭据文件,其中包含用于连接的用户凭据,而不是默认位置中的凭据
~/.aws/credentials
。通常,凭据文件包含 用于连接的aws_access_key_id
和 。aws_secret_access_key
-
s3ConfigFile: "\*
string\*"
包含用于连接的配置文件的配置文件,而不是默认位置中的配置文件,例如
~/.aws/config
.通常,配置文件包含用于连接的区域和输出类型。 -
s3Profile: "\*
string\*"
用于连接的 s3 CLI 配置文件的配置文件名称,而不是配置文件
default
。 -
s3Region: "\*
string\*"
用于连接的区域的名称。
-
s3EndpointOverride: "\*
string\*"
要使用的端点 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
。
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"})