AWS Database Migration Service
用户指南 (版本 API Version 2016-01-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

将 Amazon S3 作为 AWS DMS 源

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

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

源数据文件必须采用逗号分隔值 (CSV) 格式。请使用该命名约定命名这些文件,如下所示。在该约定中,schemaName 是源架构,tableName 是该架构中的表的名称。

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

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

s3://mybucket/hr/employee

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

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

s3://mybucket/sourcedata/hr/employee

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

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

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

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

101,Smith,Bob,4-Jun-14,New York 102,Smith,Bob,8-Oct-15,Los Angeles 103,Smith,Bob,13-Mar-17,Dallas 104,Smith,Bob,13-Mar-17,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 可以在 S3 存储桶中找到完全数据加载文件的路径。如果指定了 bucketFolder 值,则在路径前面添加该值。

  • TableOwner — 该表的架构名称。

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

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

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

    • ColumnLength — 该列中的字节数。

    • ColumnNullable —(可选)一个布尔值;如果该列可以包含 NULL 值,则为 true

    • ColumnIsPk —(可选)一个布尔值;如果该列是主键的一部分,则为 true

  • TableColumnsTotal — 总列数。该数字必须与 TableColumns 数组中的元素数相匹配。

在前面的示例中,某些列具有 STRING 类型。在这种情况下,请使用 ColumnLength 元素指定最大字符数。

ColumnLength 适用于以下数据类型:

  • BYTE

  • STRING

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

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

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

使用 CDC 并将 S3 作为 AWS DMS 源

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

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

CDC00001.csv CDC00002.csv CDC00003.csv ...

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

s3://mybucket/changedata

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

  • 操作 — 要执行的更改操作:INSERTUPDATEDELETE。这些关键字不区分大小写。

  • 表名称 — 源表的名称。

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

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

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

INSERT,employee,hr,101,Smith,Bob,4-Jun-14,New York UPDATE,employee,hr,101,Smith,Bob,8-Oct-15,Los Angeles UPDATE,employee,hr,101,Smith,Bob,13-Mar-17,Dallas DELETE,employee,hr,101,Smith,Bob,13-Mar-17,Dallas

将 S3 作为 AWS DMS 源时的先决条件

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

向用于创建迁移任务的用户账户分配的 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*" ] } ] }

将 S3 作为 AWS DMS 源的额外连接属性

您可以指定以下选项作为额外的连接属性。

选项 描述
bucketFolder

(可选) S3 存储桶中的文件夹名称。如果提供该属性,则从 bucketFolder/schemaName/tableName/ 路径中读取源数据文件和 CDC 文件。如果未指定该属性,则使用的路径为 schemaName/tableName/。下面是一个示例。

bucketFolder=testFolder;

bucketName

S3 存储桶的名称。下面是一个示例。

bucketName=buckettest;

cdcPath 更改数据捕获 (CDC) 文件的位置。如果任务捕获更改数据,则该属性是必需的,否则,该属性是可选的。如果 cdcPath 存在,则 AWS DMS 从该路径中读取 CDC 文件,然后将数据更改复制到目标终端节点中。有关更多信息,请参阅使用 CDC 并将 S3 作为 AWS DMS 源。下面是一个示例。

cdcPath=dataChanges;

csvRowDelimiter

源文件中用于分隔行的分隔符。默认值为回车符 (\n)。下面是一个示例。

csvRowDelimiter=\n;

csvDelimiter

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

csvDelimiter=,;

externalTableDefinition

一个 JSON 对象,它描述 AWS DMS 应如何在迁移期间解释 S3 存储桶中的数据。有关更多信息,请参阅为作为 AWS DMS 源的 S3 定义外部表。下面是一个示例。

externalTableDefinition=<json_object>

ignoreHeaderRows

如果设置为 1,AWS DMS 会忽略 CSV 文件中的第一个行标题。值为 1 可启用该功能,值为 0 将禁用该功能。默认值为 0。

ignoreHeaderRows=1

Amazon S3 的源数据类型

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

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

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

AWS DMS 数据类型 — 使用 Amazon S3 作为源

BYTE

需要 ColumnLength。有关更多信息,请参阅为作为 AWS DMS 源的 S3 定义外部表

DATE

TIME

DATETIME

TIMESTAMP

INT1

INT2

INT4

INT8

NUMERIC

需要使用 ColumnPrecisionColumnScale。有关更多信息,请参阅 为作为 AWS DMS 源的 S3 定义外部表

REAL4

REAL8

STRING

需要使用 ColumnLength。有关更多信息,请参阅为作为 AWS DMS 源的 S3 定义外部表

UINT1

UINT2

UINT4

UINT8

BLOB

CLOB

BOOLEAN