AWS Database Migration Service
用户指南 (版本 API Version 2016-01-01)

将 Amazon S3 作为 AWS DMS 源

您可以使用 AWS 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

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

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

s3://mybucket/sourcedata/hr/employee

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

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

除了数据文件以外,您还必须提供外部表定义。外部表定义 是一个 JSON 文档,它描述 AWS DMS 应如何解释 Amazon 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 可以在 Amazon S3 存储桶中找到完整数据加载文件的路径。如果指定了 bucketFolder 值,则在路径前面添加该值。

  • TableOwner – 该表的架构名称。

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

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

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

    • ColumnLength – 该列中的字节数。

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

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

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

注意

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

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

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

ColumnLength 适用于以下数据类型:

  • BYTE

  • STRING

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

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

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

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

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

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

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

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

s3://mybucket/changedata

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

  • 操作 – 要执行的更改操作:INSERTIUPDATEUDELETED。这些关键字和字符值不区分大小写。

    注意

    在 AWS DMS 版本 3.1.4 及更高版本中,DMS 可以通过两种方式标识为每个加载记录执行的操作。DMS 可以从记录的关键字值(例如 INSERT)或从其关键字首字母(例如 I)执行此操作。在以前的版本中,DMS 仅从完整关键字值识别加载操作。

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

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

  • 表名称 – 源表的名称。

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

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

以下是名为 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

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

要将 Amazon S3 用作 AWS DMS 的源,您的源 S3 存储桶必须与迁移您的数据的 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*" ] } ] }

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

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

选项 描述
bucketFolder

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

bucketFolder=testFolder;

bucketName

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

bucketName=buckettest;

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

cdcPath=dataChanges;

csvDelimiter

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

csvDelimiter=,;

csvRowDelimiter

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

csvRowDelimiter=\n;

externalTableDefinition

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

externalTableDefinition=<json_object>;

ignoreHeaderRows

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

ignoreHeaderRows=1;

rfc4180

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

默认值为 true

有效值:truefalseyn

示例:

rfc4180=false;

Amazon S3 的源数据类型

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

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

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

以下 AWS DMS 数据类型作为源与 Amazon S3 一起使用: