本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用亚马逊 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 存储桶中查找数据文件。继续前面的示例,如果你设置了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 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 类型的列,指定精度和小数位数。精度 是数字中的总位数,而小数位数 是小数点右边的位数。为此,您可以使用 ColumnPrecision
和 ColumnScale
元素,如下所示。
... { "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
设置为
,则 Amazon DMS 读取以下路径中的 CDC 文件。changedata
s3://
mybucket
/changedata
如果你设置cdcPath
到
和changedata
bucketFolder
到
,那么Amazon DMS在以下路径读取 CDC 文件。myFolder
s3://
mybucket
/myFolder
/changedata
CDC 文件中的记录格式如下所示:
-
操作 — 要执行的变更操作:
INSERT
要么I
,UPDATE
要么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 '{"
JSON 语法。EndpointSetting"
:
"value"
, ...
}'
下表显示了您可以将 Amazon S3 用作源的终端节点设置。
选项 | 描述 |
---|---|
BucketFolder |
(可选) S3 存储桶中的文件夹名称。如果提供此属性,则从路径读取源数据文件和 CDC 文件
|
BucketName |
S3 桶的名称。
|
CdcPath |
CDC 文件的位置。如果任务捕获更改数据,则该属性是必需的,否则,该属性是可选的。如果 CdcPath 存在,则 Amazon DMS 将通过该路径读取 CDC 文件,然后将数据更改复制到目标终端节点。有关更多信息,请参阅使用以 Amazon S3 为来源的 CDCAmazon DMS:
|
CsvDelimiter |
源文件中用于分隔列的分隔符。默认值为逗号。下面是一个示例。
|
CsvNullValue |
一个用户定义的字符串Amazon DMS从源代码读取时视为空值。默认值是空字符串。如果您未设置此参数,Amazon DMS将空字符串视为空值。如果您将此参数设置为诸如 “\ N” 之类的字符串,Amazon DMS将此字符串视为空值,并将空字符串视为空字符串值。 |
CsvRowDelimiter |
源文件中用于分隔行的分隔符。默认值为换行符 (
|
IgnoreHeaderRows |
如果将此值设置为 1,则 Amazon DMS 将忽略 .csv 文件中的第一行标头。值为 1 可启用该功能,值为 0 将禁用该功能。 默认值为 0。
|
Rfc4180 |
当此值设置为 默认为 有效值:
|
亚马逊 S3 的源数据类型
使用 Amazon S3 作为数据源的数据迁移Amazon DMS需要将数据从 Amazon S3 映射到Amazon DMS数据类型。有关更多信息,请参阅将 Amazon S3 的外部表定义为来源Amazon DMS:
有关如何查看目标中映射的数据类型的信息,请参阅有关所使用的目标终端节点的部分。
有关 Amazon DMS 数据类型的其他信息,请参阅Database MigratiAmazon on Service 数据类型。
以下Amazon DMS数据类型与 Amazon S3 一起用作来源:
-
字节 — 需要
ColumnLength
。有关更多信息,请参阅将 Amazon S3 的外部表定义为来源Amazon DMS: -
DATE
-
TIME
-
DATETIME — 有关更多信息和示例,请参阅中的 DATETIME 类型示例将 Amazon S3 的外部表定义为来源Amazon DMS。
-
INT1
-
INT2
-
INT4
-
INT8
-
数字-必须
ColumnPrecision
和ColumnScale
。Amazon DMS支持以下最大值:ColumnPrecision: 38
ColumnScale: 31
有关更多信息和示例,请参阅中的 NUMERIC 类型示例将 Amazon S3 的外部表定义为来源Amazon DMS。
-
REAL4
-
REAL8
-
字符串-必须
ColumnLength
。有关更多信息,请参阅将 Amazon S3 的外部表定义为来源Amazon DMS: -
UINT1
-
UINT2
-
UINT4
-
UINT8
-
BLOB
-
CLOB
-
BOOLEAN