使用亚马逊 S3 作为来源Amazon DMS - Amazon Database Migration Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

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

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

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

源数据文件必须采用逗号分隔值 (.csv) 格式。使用以下命名惯例命名它们。在该约定中,schemaName 是源架构,tableName 是该架构中的表的名称。

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

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

s3://mybucket/hr/employee

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

除了bucketName(这是必填项),您可以选择提供bucketFolder用于指定位置的参数Amazon DMS应该在 Amazon S3 存储桶中查找数据文件。继续前面的示例,如果你设置了bucketFoldersourcedata,那么Amazon DMS读取以下路径的数据文件。

s3://mybucket/sourcedata/hr/employee

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

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

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

将 Amazon S3 的外部表定义为来源Amazon DMS

除了数据文件以外,您还必须提供外部表定义。一个外部表定义是一个 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 S3 存储桶中的路径Amazon DMS可以找到完整的数据加载文件。如果bucketFolder值已指定,其值优先于路径。

  • TableOwner— 此表的架构名称。

  • TableColumns— 由一个或多个地图组成的数组,每个地图都描述了源表中的一列:

    • ColumnName— 源表中列的名称。

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

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

      • BYTE

      • STRING

    • ColumnNullable— 一个布尔值,即true如果此列可以包含空值(默认=false)。

    • ColumnIsPk— 一个布尔值,即true如果此列是主键的一部分(default=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为零并截断小数秒。

使用以 Amazon S3 为来源的 CDCAmazon DMS

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

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

如果你设置cdcPathchangedatabucketFoldermyFolder,那么Amazon DMS在以下路径读取 CDC 文件。

s3://mybucket/myFolder/changedata

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

  • 操作 — 要执行的变更操作:INSERT要么IUPDATE要么U,或DELETE要么D。这些关键字和字符值不区分大小写。

    注意

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

    在之前的版本中Amazon DMS,完整的关键字值是为了记录 CDC 数据而写入的。此外,以前的版本仅使用关键字 initial 将操作值写入到任何 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 存储桶必须位于同一存储桶中Amazon区域作为迁移数据的 DMS 复制实例。此外,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 Identity and Access Management如果在 Amazon S3 存储桶上启用了版本控制,则分配给用于创建迁移任务的用户账户的 (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控制台,或者使用create-endpoint中的命令Amazon CLI,和--s3-settings '{"EndpointSetting": "value", ...}'JSON 语法。

下表显示了您可以将 Amazon S3 用作源的终端节点设置。

选项 描述
BucketFolder

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

'{"BucketFolder": "sourceData"}'

BucketName

S3 桶的名称。

'{"BucketName": "myBucket"}'

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

'{"CdcPath": "changeData"}'

CsvDelimiter

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

'{"CsvDelimiter": ","}'

CsvNullValue

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

CsvRowDelimiter

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

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

IgnoreHeaderRows

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

默认值为 0。

'{"IgnoreHeaderRows": 1}'

Rfc4180

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

默认为 true

有效值:truefalseyn

'{"Rfc4180": false}'

亚马逊 S3 的源数据类型

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

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

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

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