使用亚马逊 S3 作为来源 AWS DMS - AWS 数据库迁移服务

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用亚马逊 S3 作为来源 AWS DMS

您可以使用从 Amazon S3 存储桶迁移数据 AWS DMS。为此,请提供对包含一个或多个数据文件的 Amazon S3 存储桶的访问。在该 S3 存储桶中,请包含一个 JSON 文件以描述该数据与这些文件中的数据的数据库表之间的映射。

在开始完全加载之前,必须在 Amazon S3 存储桶中包含源数据文件。您可以使用 bucketName 参数指定存储桶名称。

源数据文件可以采用以下格式:

对于逗号分隔值 (.csv) 格式的源数据文件,请使用以下命名约定对其进行命名。在该约定中,schemaName 是源架构,tableName 是该架构中的表的名称。

/schemaName/tableName/LOAD001.csv /schemaName/tableName/LOAD002.csv /schemaName/tableName/LOAD003.csv ...

例如,假定数据文件位于以下 Amazon S3 路径的 mybucket 中。

s3://mybucket/hr/employee

加载时, AWS DMS 假设源架构名称为hr,源表名为employee

除了bucketName(必填项)之外,您还可以选择提供一个bucketFolder参数来指定 AWS DMS 应在 Amazon S3 存储桶中查找数据文件的位置。继续前面的示例,如果设置bucketFoldersourcedata,则 AWS DMS 读取以下路径中的数据文件。

s3://mybucket/sourcedata/hr/employee

您可以使用额外连接属性指定列分隔符、行分隔符、null 值指示符以及其他参数。有关更多信息,请参阅 Amazon S3 的终端节点设置作为来源 AWS DMS

您可以使用 ExpectedBucketOwner Amazon S3 端点设置指定存储桶拥有者并防止狙击,如下所示。然后,当您发出测试连接或执行迁移的请求时,S3 会根据指定参数检查存储桶拥有者的账户 ID。

--s3-settings='{"ExpectedBucketOwner": "AWS_Account_ID"}'

将 Amazon S3 的外部表定义为数据源 AWS DMS

除了数据文件以外,您还必须提供外部表定义。外部表定义是一个 JSON 文档,它描述了 AWS DMS 应如何解释 Amazon S3 中的数据。该文档的最大大小为 2 MB。如果您使用 AWS DMS 管理控制台创建源端点,则可以直接在表映射框中输入 JSON。如果您使用 AWS Command Line Interface (AWS CLI) 或 AWS DMS API 执行迁移,则可以创建一个 JSON 文件来指定外部表的定义。

假定您具有包含以下内容的数据文件。

101,Smith,Bob,2014-06-04,New York 102,Smith,Bob,2015-10-08,Los Angeles 103,Smith,Bob,2017-03-13,Dallas 104,Smith,Bob,2017-03-13,Dallas

以下是该数据的示例外部表定义。

{ "TableCount": "1", "Tables": [ { "TableName": "employee", "TablePath": "hr/employee/", "TableOwner": "hr", "TableColumns": [ { "ColumnName": "Id", "ColumnType": "INT8", "ColumnNullable": "false", "ColumnIsPk": "true" }, { "ColumnName": "LastName", "ColumnType": "STRING", "ColumnLength": "20" }, { "ColumnName": "FirstName", "ColumnType": "STRING", "ColumnLength": "30" }, { "ColumnName": "HireDate", "ColumnType": "DATETIME" }, { "ColumnName": "OfficeLocation", "ColumnType": "STRING", "ColumnLength": "20" } ], "TableColumnsTotal": "5" } ] }

该 JSON 文档中的元素如下所示:

TableCount – 源表数。在该示例中,只有一个表。

Tables – 一个数组,对于每个源表,它包含一个 JSON 映射。在该示例中,只有一个映射。每个映射包含以下元素:

  • TableName – 源表的名称。

  • TablePath – AWS DMS 可以在 Amazon S3 存储桶中找到完整数据加载文件的路径。如果指定了 bucketFolder 值,则在路径前面添加其值。

  • TableOwner – 该表的架构名称。

  • TableColumns – 包含一个或多个映射的数组,每个映射描述源表中的一个列:

    • ColumnName – 源表中的列的名称。

    • ColumnType – 列的数据类型。有关有效的数据类型,请参阅Amazon S3 的源数据类型

    • ColumnLength – 该列中的字节数。由于 S3 源不支持完整 LOB 模式,因此最大列长度限制为 2147483647 字节 (2,047 MegaBytes)。 ColumnLength对以下数据类型有效:

      • BYTE

      • string

    • ColumnNullable – 一个布尔值;如果该列可以包含 NULL 值,则此值为 true(默认值为 false)。

    • ColumnIsPk – 一个布尔值;如果该列是主键的一部分,则此值为 true(默认值为 false)。

    • ColumnDateFormat – 具有 DATE、TIME 和 DATETIME 类型的列的输入日期格式,用于将数据字符串解析为日期对象。可能的值包括:

      - YYYY-MM-dd HH:mm:ss - YYYY-MM-dd HH:mm:ss.F - YYYY/MM/dd HH:mm:ss - YYYY/MM/dd HH:mm:ss.F - MM/dd/YYYY HH:mm:ss - MM/dd/YYYY HH:mm:ss.F - YYYYMMdd HH:mm:ss - YYYYMMdd HH:mm:ss.F
  • TableColumnsTotal – 总列数。该数字必须与 TableColumns 数组中的元素数相匹配。

如果您未另行指定,则 AWS DMS 假定ColumnLength为零。

注意

在支持的版本中 AWS DMS,S3 源数据还可以包含一个可选的操作列,作为列值之前的第一TableName列。此操作列标识在完全加载期间用于将数据迁移到 S3 目标终端节点的操作 (INSERT)。

如果存在,则此列的值是 INSERT 操作关键字的第一个字符 (I)。如果指定,则此列通常指示在之前的迁移中 DMS 创建的 S3 源作为 S3 目标。

在 3.4.2 之前的 DMS 版本中,通过以前的 DMS 完全加载创建的 S3 源数据中没有此列。将此列添加到 S3 目标数据可以使得写入 S3 目标的所有行的格式保持一致,不论它们是在完全加载还是 CDC 加载期间写入。有关格式化 S3 目标数据的选项的更多信息,请参阅指示迁移的 S3 数据中的源数据库操作

对于 NUMERIC 类型的列,指定精度和小数位数。精度 是数字中的总位数,而小数位数 是小数点右边的位数。为此,您可以使用 ColumnPrecisionColumnScale 元素,如下所示。

... { "ColumnName": "HourlyRate", "ColumnType": "NUMERIC", "ColumnPrecision": "5" "ColumnScale": "2" } ...

对于数据包含小数秒的 DATETIME 类型的列,请指定小数位数。小数位数是小数秒的位数,范围可以从 0 到 9。为此,您可以使用 ColumnScale 元素,如下所示。

... { "ColumnName": "HireDate", "ColumnType": "DATETIME", "ColumnScale": "3" } ...

如果未另行指定,则 AWS DMS 假定ColumnScale为零并截断小数秒。

使用 CDC 并将 Amazon S3 作为 AWS DMS的源

AWS DMS 执行完整数据加载后,它可以选择将数据更改复制到目标端点。为此,您需要将变更数据捕获文件(CDC 文件)上传到您的 Amazon S3 存储桶。 AWS DMS 在上传这些 CDC 文件时读取它们,然后将更改应用到目标端点。

CDC 文件是按如下方式命名的:

CDC00001.csv CDC00002.csv CDC00003.csv ...
注意

要在更改数据文件夹中成功地复制 CDC 文件,请按词汇(序列)顺序上传它们。例如,在文件 CDC00003.csv 之前上传文件 CDC00002.csv。否则,如果在 CDC00003.csv 之后加载 CDC00002.csv,则会跳过后者而不会复制。但是,如果在 CDC00003.csv 之后加载文件 CDC00004.csv,则该文件复制成功。

要指明在哪里 AWS DMS 可以找到文件,请指定cdcPath参数。对于前面的示例,如果将 cdcPath 设置为 changedata,则 AWS DMS 读取以下路径中的 CDC 文件。

s3://mybucket/changedata

如果将 cdcPath 设置为 changedata,并将 bucketFolder 设置为 myFolder, AWS DMS 会读取以下路径中的 CDC 文件。

s3://mybucket/myFolder/changedata

CDC 文件中的记录格式如下所示:

  • 操作 – 要执行的更改操作:INSERTI)、UPDATEU)或 DELETED)。这些关键字和字符值不区分大小写。

    注意

    在支持的 AWS DMS 版本中, AWS DMS 可以通过两种方式识别每个加载记录要执行的操作。 AWS DMS 可以根据记录的关键字值(例如INSERT)或其关键字的初始字符(例如I)执行此操作。在之前的版本中,只能从完整的关键字值中 AWS DMS 识别加载操作。

    在的早期版本中 AWS DMS,写入了完整的关键字值来记录 CDC 数据。以前的版本仅使用关键字首字母将操作值写入任何 S3 目标。

    无论如何写入操作列 AWS DMS 来创建 S3 源数据,都可以识别这两种格式来处理操作。此方法支持使用 S3 目标数据作为源用于以后的迁移。借助这种方法,您无需更改以后 S3 源的操作列中显示的任意关键字首字母值的格式。

  • 表名称 – 源表的名称。

  • 架构名称 – 源架构的名称。

  • 数据 – 表示要更改的数据的一个或多个列。

以下是名为 employee 的表的示例 CDC 文件。

INSERT,employee,hr,101,Smith,Bob,2014-06-04,New York UPDATE,employee,hr,101,Smith,Bob,2015-10-08,Los Angeles UPDATE,employee,hr,101,Smith,Bob,2017-03-13,Dallas DELETE,employee,hr,101,Smith,Bob,2017-03-13,Dallas

使用 Amazon S3 作为来源的先决条件 AWS DMS

要使用 Amazon S3 作为来源 AWS DMS,您的源 S3 存储桶必须与迁移数据的 DMS 复制实例位于同一 AWS 区域。此外,用于迁移的 AWS 账户必须具有源存储桶的读取访问权限。对于 AWS DMS 版本 3.4.7 及更高版本,DMS 必须通过 VPC 终端节点或公共路由访问源存储桶。有关 VPC 终端节点的信息,请参阅将 VPC 端点配置为 AWS DMS 源端点和目标端点

分配给用于创建迁移任务的用户账户的 AWS Identity and Access Management (IAM) 角色必须具有以下权限集。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::mybucket*/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::mybucket*" ] } ] }

如果在 Amazon S3 存储桶上启用了版本控制,则分配给用于创建迁移任务的用户账户的 AWS Identity and Access Management (IAM) 角色必须具有以下权限集。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "S3:GetObjectVersion" ], "Resource": [ "arn:aws:s3:::mybucket*/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::mybucket*" ] } ] }

使用 Amazon S3 作为来源时的限制 AWS DMS

将 Amazon S3 作为源时存在以下限制:

  • 不要为 S3 启用版本控制。如果您需要 S3 版本控制,请使用生命周期策略主动删除旧版本。否则,您可能会遇到由于 S3 list-object 调用超时而导致端点测试连接失败的情况。要为 S3 存储桶创建生命周期策略,请参阅管理存储生命周期。要删除 S3 对象的某个版本,请参阅从启用版本控制的存储桶中删除对象版本

  • 3.4.7 及更高版本支持启用了 VPC(网关 VPC)的 S3 存储桶。

  • MySQL 将time数据类型转换为。string要在 MySQL 中查看time数据类型值,请将目标表中的列定义为string,然后将任务的目标表准备模式设置设置为 Trunc ate。

  • AWS DMS 在内部对两种BYTE数据类型BYTE和数据类型都使用该BYTES数据类型。

  • S3 源端点不支持 DMS 表重新加载功能。

  • AWS DMS 不支持以 Amazon S3 作为源的完整 LOB 模式。

在 Amazon S3 中使用 Parquet 格式的文件作为源文件时,存在以下限制:

  • S3 Parque DDMMYYYY t Source 日期分区功能不支持或不支持日期。MMYYYYDD

Amazon S3 的终端节点设置作为来源 AWS DMS

您可以使用端点设置来配置 Amazon S3 源数据库,这与使用额外连接属性类似。您可以在使用 AWS DMS 控制台创建源端点时指定设置,或者使用中带有 --s3-settings '{"EndpointSetting": "value", ...}' JSON 语法的create-endpointAWS CLI命令来指定设置。

下表显示了将 Amazon S3 作为源时可以使用的端点设置。

选项 描述
BucketFolder

(可选) S3 存储桶中的文件夹名称。如果提供该属性,则分别从 s3://myBucket/bucketFolder/schemaName/tableName/s3://myBucket/bucketFolder/ 路径中读取源数据文件和 CDC 文件。如果未指定此属性,则使用的路径为 schemaName/tableName/

'{"BucketFolder": "sourceData"}'

BucketName

S3 桶的名称。

'{"BucketName": "myBucket"}'

CdcPath CDC 文件的位置。如果任务捕获更改数据,则该属性是必需的,否则,该属性是可选的。如果CdcPath存在,则从此路径 AWS DMS 读取 CDC 文件并将数据更改复制到目标端点。有关更多信息,请参阅 使用 CDC 并将 Amazon S3 作为 AWS DMS的源

'{"CdcPath": "changeData"}'

CsvDelimiter

源文件中用于分隔列的分隔符。默认值为逗号。下面是一个示例。

'{"CsvDelimiter": ","}'

CsvNullValue

用户定义的字符串, AWS DMS 从源读取时将其视为 null。默认值是空字符串。如果未设置此参数,则 AWS DMS 将空字符串视为空值。如果将此参数设置为诸如 “\ N” 之类的字符串,则 AWS DMS 会将此字符串视为空值,并将空字符串视为空字符串值。

CsvRowDelimiter

源文件中用于分隔行的分隔符。默认值为换行符 (\n)。

'{"CsvRowDelimiter": "\n"}'

DataFormat

将此值设置Parquet为可读取 Parquet 格式的数据。

'{"DataFormat": "Parquet"}'

IgnoreHeaderRows

当此值设置为 1 时,将 AWS DMS 忽略.csv 文件中的第一行标题。值为 1 可启用该功能,值为 0 将禁用该功能。

默认值是 0。

'{"IgnoreHeaderRows": 1}'

Rfc4180

当此值设置为 truey 时,每个前导双引号必须后跟一个结束双引号。此格式符合 RFC 4180。当此值设置为 falsen时,字符串文字将按原样复制到目标。在这种情况下,分隔符(行或列)表示字段的末尾。因此,您不能使用分隔符作为字符串的一部分,因为它表示值的末尾。

默认值为 true

有效值:truefalseyn

'{"Rfc4180": false}'

Amazon S3 的源数据类型

使用 Amazon S3 作为数据源的数据迁移 AWS DMS 需要将数据从 Amazon S3 映射到 AWS DMS 数据类型。有关更多信息,请参阅 将 Amazon S3 的外部表定义为数据源 AWS DMS

有关如何查看目标中映射的数据类型的信息,请参阅有关所使用的目标终端节点的部分。

有关 AWS DMS 数据类型的更多信息,请参见AWS Database Migration Service 的数据类型

以下 AWS DMS 数据类型用于 Amazon S3 作为数据源:

使用 Amazon S3 中的拼木地板格式文件作为来源 AWS DMS

在 3.5.3 及更高 AWS DMS 版本中,您可以使用 S3 存储桶中的 Parquet 格式文件作为满载或 CDC 复制的来源。

DMS 仅支持 Parquet 格式的文件作为 DMS 通过将数据迁移到 S3 目标端点而生成的源。文件名必须采用支持的格式,否则 DMS 不会将其包含在迁移中。

对于 Parquet 格式的源数据文件,它们必须位于以下文件夹和命名约定中。

schema/table1/LOAD00001.parquet schema/table2/LOAD00002.parquet schema/table2/LOAD00003.parquet

对于 Parquet 格式的 CDC 数据的源数据文件,请使用以下文件夹和命名约定对其进行命名和存储。

schema/table/20230405-094615814.parquet schema/table/20230405-094615853.parquet schema/table/20230405-094615922.parquet

要访问 Parquet 格式的文件,请设置以下端点设置:

  • DataFormat 设置为 Parquet

  • 请勿设置该cdcPath设置。确保在指定的 schema/ 表文件夹中创建 Parquet 格式的文件。

有关 S3 终端节点设置的更多信息,请参阅 AWS Database Migration Service API 参考中的 S3S ettings。

Parquet 格式文件支持的数据类型

AWS DMS 从 Parquet 格式文件迁移数据时,支持以下源和目标数据类型。迁移之前,请确保目标表中包含正确数据类型的列。

源数据类型 目标数据类型
BYTE BINARY
DATE DATE32
TIME TIME32
DATETIME TIMESTAMP
INT1 INT8
INT2 INT16
INT4 INT32
INT8 INT64
NUMERIC DECIMAL
REAL4 FLOAT
REAL8 DOUBLE
STRING STRING
UINT1 UINT8
UINT2 UINT16
UINT4 UINT32
UINT8 UINT
WSTRING STRING
BLOB BINARY
NCLOB STRING
CLOB STRING
BOOLEAN BOOL