将 Amazon S3 作为 Amazon DMS 的源 - Amazon 数据库迁移服务
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

将 Amazon S3 作为 Amazon DMS 的源

您可以使用 Amazon DMS 从 Amazon S3 存储桶中迁移数据。为此,请提供对包含一个或多个数据文件的 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

在加载时,Amazon DMS 假定源架构名称是 hr,源表名称是 employee

除了 bucketName(它是必需的)以外,还可以选择提供 bucketFolder 参数以指定 Amazon DMS 查找 Amazon S3 存储桶中的数据文件的位置。对于前面的示例,如果将 bucketFolder 设置为 sourcedata,则 Amazon DMS 读取以下路径中的数据文件。

s3://mybucket/sourcedata/hr/employee

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

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

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

为作为 Amazon DMS 源的 Amazon S3 定义外部表

除了数据文件以外,您还必须提供外部表定义。外部表定义是一个 JSON 文档,它描述 Amazon DMS 应如何解释 Amazon S3 中的数据。该文档的最大大小为 2 MB。如果使用 Amazon DMS 管理控制台创建源终端节点,则可直接在表映射框中输入 JSON。如果使用 Amazon Command Line Interface (Amazon CLI) 或 Amazon 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 – Amazon DMS 可以在 Amazon S3 存储桶中找到完整数据加载文件的路径。如果指定了 bucketFolder 值,则在路径前面添加其值。

  • TableOwner – 该表的架构名称。

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

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

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

    • ColumnLength – 该列中的字节数。最大列长度限制为 2147483647 字节(2047 兆字节),因为 S3 源不支持完整 LOB 模式。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 数组中的元素数相匹配。

如果未另行指定,Amazon DMS 假定 ColumnLength 为零。

注意

在支持的 Amazon 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" } ...

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

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

在 Amazon DMS 执行完全数据加载后,它可以选择将数据更改复制到目标终端节点中。为此,请将更改数据捕获文件(CDC 文件)上传到 Amazon S3 存储桶中。在上传这些 CDC 文件时,Amazon DMS 会读取这些文件,然后在目标端点中应用这些更改。

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

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

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

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

s3://mybucket/changedata

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

s3://mybucket/myFolder/changedata

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

  • 操作 – 要执行的更改操作:INSERT (I)、UPDATE (U) 或 DELETE (D)。这些关键字和字符值不区分大小写。

    注意

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

    Amazon DMS 以前的版本通过写入完整关键字值来记录 CDC 数据。以前的版本仅使用关键字首字母将操作值写入任何 S3 目标。

    通过识别这两种格式,Amazon 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 作为 Amazon DMS 源时的先决条件

要将 Amazon S3 作为 Amazon DMS 的源,您的源 S3 存储桶必须与迁移您的数据的 DMS 复制实例位于同一 Amazon 区域中。此外,用于迁移的 Amazon 账户必须具有源存储桶的读取访问权限。

向用于创建迁移任务的用户账户分配的 Amazon 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 存储桶上启用了版本控制,为用于创建迁移任务的用户账户分配的 Amazon 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 作为 Amazon DMS 源时的限制

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

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

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

将 Amazon S3 作为 Amazon DMS 源时的端点设置

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

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

选项 描述
BucketFolder

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

'{"BucketFolder": "sourceData"}'

BucketName

S3 桶的名称。

'{"BucketName": "myBucket"}'

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

'{"CdcPath": "changeData"}'

CsvDelimiter

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

'{"CsvDelimiter": ","}'

CsvNullValue

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

CsvRowDelimiter

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

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

IgnoreHeaderRows

如果将此值设置为 1,则 Amazon DMS 将忽略 .csv 文件中的第一行标头。值为 1 可启用该功能,值为 0 将禁用该功能。

默认值是 0。

'{"IgnoreHeaderRows": 1}'

Rfc4180

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

默认值为 true

有效值:truefalseyn

'{"Rfc4180": false}'

Amazon S3 的源数据类型

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

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

有关 Amazon DMS 数据类型的其他信息,请参阅Amazon Database Migration Service 的数据类型

将 Amazon S3 作为源时使用以下 Amazon DMS 数据类型: