Amazon Relational Database Service
用户指南 (API Version 2014-10-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

将数据从数据库群集保存到 Amazon S3 存储桶中的文本文件

您可以使用 SELECT INTO OUTFILE S3 语句从 Amazon Aurora 数据库群集查询数据,并将数据直接保存到存储在 Amazon S3 存储桶中的文本文件。使用此功能,您可以跳过将数据首先引入客户端、然后将其从客户端复制到 Amazon S3 的过程。LOAD DATA FROM S3 语句可以使用由此语句创建的文件将数据加载到 Aurora 数据库群集中。有关更多信息,请参阅 将数据从 Amazon S3 存储桶中的文本文件加载到数据库群集

注意

Aurora 1.13 版及后续版本中可将数据从表保存到 Amazon S3 存储桶中的文本文件。有关 Aurora 版本的更多信息,请参阅 Amazon Aurora 数据库引擎更新

向 Aurora 提供访问 Amazon S3 的权限

在将数据保存到 Amazon S3 存储桶中之前,您必须先向 Aurora 数据库群集提供访问 Amazon S3 的权限。要授予权限,请创建具有必需权限的 AWS Identity and Access Management (IAM) 角色,然后将这些角色与数据库群集关联。此外,您必须将 Aurora 数据库群集配置为允许与 Amazon S3 的出站连接。有关如何允许 Aurora 数据库群集代表您与 Amazon S3 进行通信的详细信息和说明,请参阅授权 Amazon Aurora 代表您访问其他 AWS 服务

注意

您必须将 aurora_select_into_s3_roleaws_default_s3_role 数据库群集参数设置为新 IAM 角色的 Amazon 资源名称 (ARN)。如果没有为 aurora_select_into_s3_role 指定 IAM 角色,则使用 aws_default_s3_role 中指定的 IAM 角色。

有关数据库群集参数的更多信息,请参阅数据库群集和数据库实例参数

授予权限以在 Aurora 中保存数据

必须向发出 SELECT INTO OUTFILE S3 语句的数据库用户授予 SELECT INTO S3 权限以便发出该语句。默认情况下,将向数据库群集的主用户名授予 SELECT INTO S3 权限。您可以使用以下语句向另一个用户授予权限。

GRANT SELECT INTO S3 ON *.* TO user@domain-or-ip-address

SELECT INTO S3 权限特定于 Amazon Aurora,并且不适用于 MySQL 数据库或 RDS MySQL 数据库实例。如果您已设置作为复制主体的 Aurora 数据库群集与作为复制客户端的 MySQL 数据库之间的复制,则 GRANT SELECT INTO S3 语句会导致复制停止并出现错误。您可以安全地跳过此错误,继续复制。要跳过 RDS MySQL 数据库实例的错误,请使用 mysql.rds_skip_repl_error 语句。要跳过外部 MySQL 数据库的错误,请使用 SET GLOBAL sql_slave_skip_counter 语句。

指定 Amazon S3 存储桶的路径

用于指定在 Amazon S3 存储桶上存储数据和清单文件的路径的语法,与在 LOAD DATA FROM S3 PREFIX 语句中使用的语法类似,如下所示。

s3-region://bucket-name/file-prefix

路径包括以下值:

  • region (可选) – 包含要将数据保存到的 Amazon S3 存储桶的 AWS 区域。此值为可选项。如果您没有指定 region 值,则 Aurora 将文件保存到与您的数据库群集位于同一区域的 Amazon S3。

  • bucket-name – 要将数据保存到的 Amazon S3 存储桶的名称。支持标识虚拟文件夹路径的对象前缀。

  • file-prefix – 表示要保存到 Amazon S3 中的文件的 Amazon S3 对象前缀。

SELECT INTO OUTFILE S3 语句创建的数据文件使用以下路径,其中 00000 表示从零开始的 5 位整数。

s3-region://bucket-name/file-prefix.part_00000

例如,假设 SELECT INTO OUTFILE S3 语句指定 s3-us-west-2://bucket/prefix 作为存储数据文件的路径并创建三个数据文件。指定的 Amazon S3 存储桶包含以下数据文件。

  • s3-us-west-2://bucket/prefix.part_00000

  • s3-us-west-2://bucket/prefix.part_00001

  • s3-us-west-2://bucket/prefix.part_00002

创建清单以列出数据文件

您可以使用 SELECT INTO OUTFILE S3 语句和 MANIFEST ON 选项,以 JSON 格式创建列出由语句创建的文本文件的清单文件。LOAD DATA FROM S3 语句可以使用清单文件将数据文件加载回 Aurora 数据库群集。有关使用清单将数据文件从 Amazon S3 加载到数据库群集的更多信息,请参阅 使用清单指定要加载的数据文件

清单中包含的由 SELECT INTO OUTFILE S3 语句创建的数据文件按照它们由语句创建的顺序列出。例如,假设 SELECT INTO OUTFILE S3 语句指定 s3-us-west-2://bucket/prefix 作为存储数据文件的路径并创建三个数据文件和一个清单文件。指定的 Amazon S3 存储桶包含名为 s3-us-west-2://bucket/prefix.manifest 的清单文件,其中包含以下信息。

{ "entries": [ { "url":"s3-us-west-2://bucket/prefix.part_00000" }, { "url":"s3-us-west-2://bucket/prefix.part_00001" }, { "url":"s3-us-west-2://bucket/prefix.part_00002" } ] }

SELECT INTO OUTFILE S3

您可以使用 SELECT INTO OUTFILE S3 语句从数据库群集查询数据,并将数据直接保存到存储在 Amazon S3 存储桶中带分隔符的文本文件。不支持压缩文件或加密文件。

语法

SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr [, select_expr ...] [FROM table_references [PARTITION partition_list] [WHERE where_condition] [GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]] [HAVING where_condition] [ORDER BY {col_name | expr | position} [ASC | DESC], ...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] [PROCEDURE procedure_name(argument_list)] INTO OUTFILE S3 's3_uri' [CHARACTER SET charset_name] [export_options] [MANIFEST {ON | OFF}] [OVERWRITE {ON | OFF}] export_options: [{FIELDS | COLUMNS} [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char'] ] [LINES [STARTING BY 'string'] [TERMINATED BY 'string'] ]

参数

接下来,您可以使用特定于 Aurora 的 SELECT INTO OUTFILE S3 语句查找必需和可选参数列表。

  • s3-uri – 为要使用的 Amazon S3 前缀指定 URI。使用指定 Amazon S3 存储桶的路径中描述的语法指定 URI。

  • MANIFEST {ON | OFF} – 指示是否在 Amazon S3 中创建清单文件。清单文件是 JavaScript 对象表示法 (JSON) 文件,可通过 LOAD DATA FROM S3 MANIFEST 语句用来将数据加载到 Aurora 数据库群集中。有关 LOAD DATA FROM S3 MANIFEST 的更多信息,请参阅 将数据从 Amazon S3 存储桶中的文本文件加载到数据库群集

    如果在查询中指定了 MANIFEST ON,则在创建和上传了所有数据文件之后在 Amazon S3 中创建清单文件。使用以下路径创建清单文件:

    s3-region://bucket-name/file-prefix.manifest

    有关清单文件的内容格式的更多信息,请参阅 创建清单以列出数据文件

  • OVERWRITE {ON | OFF} – 指示是否覆盖指定 Amazon S3 存储桶中的现有文件。如果指定 OVERWRITE ON,则覆盖与在 s3-uri 中指定的 URI 内的文件前缀匹配的现有文件。否则将出错。

在 MySQL 文档的 SELECT 语法LOAD DATA INFILE 语法中可以找到有关这些参数的详细信息。

注意事项

写入到 Amazon S3 存储桶的文件数取决于 SELECT INTO OUTFILE S3 语句选择的数据数量以及 Aurora 的文件大小阈值。默认文件大小阈值为 6GB。如果语句选择的数据小于文件大小阈值,则将创建单个文件;否则将创建多个文件。此语句所创建文件的其他注意事项包括下列内容:

  • Aurora 确保数据文件中的行不会跨文件边界拆分。对于多个文件,除了最后一个文件之外,每个数据文件的大小通常接近文件大小阈值。但是,有时保持在文件大小阈值之下会导致在两个数据文件之间拆分某一行。这种情况下,Aurora 创建一个保留该行而不拆分的数据文件,但可能会大于文件大小阈值。

  • 由于 Aurora 中的各 SELECT 语句作为原子事务运行,选择大数据集的 SELECT INTO OUTFILE S3 语句可能需要一段时间来运行。如果语句由于任何原因失败,您可能需要重新启动和执行该语句。不过,如果语句失败,已上传到 Amazon S3 的文件保留在指定 Amazon S3 存储桶中。您可以使用其他语句来上传剩余的数据而不用重新启动。

  • 如果要选择的数据量很大 (超过 25 GB),则建议您使用多个 SELECT INTO OUTFILE S3 语句来将数据保存到 Amazon S3。每个语句应选择不同部分的数据来保存,并且在保存数据文件时指定使用 s3-uri 参数中的不同 file_prefix。对将由多个语句选择的数据进行分区,可以更容易地从执行错误中恢复,因为如果在特定语句的执行期间出错,只需要重新选择和上传一部分数据到 Amazon S3。使用多个语句还有助于避免单个长时间运行的事务,这可改进性能。

  • 如果多个 SELECT INTO OUTFILE S3 语句使用 s3-uri 参数中的相同 file_prefix,并且这些语句并行将数据选择到 Amazon S3 中,则行为不确定。

  • Aurora 不将元数据 (例如表架构或文件元数据) 上传到 Amazon S3。

  • 有时,您可以重新运行 SELECT INTO OUTFILE S3 查询,以便从故障中恢复。在这些情况下,您必须在 Amazon S3 存储桶中删除具有 s3-uri 所指定的文件前缀的所有现有数据文件,或者在 SELECT INTO OUTFILE S3 查询中包括 OVERWRITE ON

SELECT INTO OUTFILE S3 语句返回一个典型的 MySQL 错误编号以及有关成功或失败的响应。如果您无权访问 MySQL 错误编号和响应,则确定何时才完成的最简单方法是在语句中指定 MANIFEST ON。清单文件是该语句写入的最后一个文件。换而言之,如果您具有清单文件,则语句已完成执行。

目前,没有其他方法可以在执行期间直接监视 SELECT INTO OUTFILE S3 语句的进度。但是,假设您使用此语句从 Aurora 向 Amazon S3 写入大量数据,并且您知道语句选择的数据大小。在这种情况下,您可以通过监视 Amazon S3 中数据文件的创建操作来估算进度。

为此,您可以利用这样一个常识,也就是每次当语句选择大约 6GB 数据时,将在指定 Amazon S3 存储桶中创建一个数据文件。将选定数据的大小除以 6GB 可以估计要创建的数据文件数。您可以通过监视在执行期间上传到 Amazon S3 的文件数来估算语句的进度。

示例

以下语句选择 employees 表中的所有数据并将数据保存到与 Aurora 数据库群集位于不同区域的 Amazon S3 存储桶。该语句创建数据文件,其中每个字段以逗号 (,) 字符终止,每行以换行 (\n) 字符终止。如果指定的 Amazon S3 存储桶中存在与 sample_employee_data 文件前缀匹配的文件,该语句返回错误。

SELECT * FROM employees INTO OUTFILE S3 's3-us-west-2://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';

以下语句选择 employees 表中的所有数据,并将数据保存到与 Aurora 数据库群集位于同一区域的 Amazon S3 存储桶。该语句创建数据文件,其中每个字段以逗号 (,) 字符终止,每行以换行 (\n) 字符终止,还创建一个清单文件。如果指定的 Amazon S3 存储桶中存在与 sample_employee_data 文件前缀匹配的文件,该语句返回错误。

SELECT * FROM employees INTO OUTFILE S3 's3://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' MANIFEST ON;

以下语句选择 employees 表中的所有数据,并将数据保存到与 Aurora 数据库群集位于不同区域的 Amazon S3 存储桶。该语句创建数据文件,其中每个字段以逗号 (,) 字符终止,每行以换行 (\n) 字符终止。该语句在指定 Amazon S3 存储桶中覆盖与 sample_employee_data 文件前缀匹配的所有现有文件。

SELECT * FROM employees INTO OUTFILE S3 's3-us-west-2://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' OVERWRITE ON;

以下语句选择 employees 表中的所有数据,并将数据保存到与 Aurora 数据库群集位于同一区域的 Amazon S3 存储桶。该语句创建数据文件,其中每个字段以逗号 (,) 字符终止,每行以换行 (\n) 字符终止,还创建一个清单文件。该语句在指定 Amazon S3 存储桶中覆盖与 sample_employee_data 文件前缀匹配的所有现有文件。

SELECT * FROM employees INTO OUTFILE S3 's3://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' MANIFEST ON OVERWRITE ON;

相关主题