本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用亚马逊 DynamoDB 数据库作为目标Amazon Database Migration Service
你可以使用Amazon DMS将数据迁移到亚马逊 DynamoDB 表。Amazon DynamoDB 是一项完全托管的 NoSQL 数据库服务,可提供快速且可预测的性能以及无缝的可扩展性。Amazon DMS支持使用关系数据库或 MongoDB 作为源。
在 DynamoDB 中,表、项目和属性是您使用的核心组件。一个桌子是物品的集合,每个项目是属性的集合。DynamoDB 使用称为分区键的主键来唯一标识表中的各个项目。您还可以使用键和辅助索引来提供更具灵活性的查询。
您将使用对象映射将数据从源数据库迁移到目标 DynamoDB 表。使用对象映射可以确定源数据是否位于目标中。
什么时候Amazon DMS在 DynamoDB 目标端点上创建表,它创建的表与源数据库端点中的表一样多。Amazon DMS还设置了多个 DynamoDB 参数值。创建表的成本取决于要迁移的数据量和表数。
注意
这个SSL 模式上的选项Amazon DMS控制台或 API 不适用于某些数据流和 NoSQL 服务,例如 Kinesis 和 DynamoDB。默认情况下,它们是安全的,所以Amazon DMS显示 SSL 模式设置等于无 (SSL 模式=无)。您无需为终端节点提供任何其他配置即可使用 SSL。例如,当使用 DynamoDB 作为目标端点时,它在默认情况下是安全的。对 DynamoDB 的所有 API 调用都使用 SSL,因此无需在中添加额外的 SSL 选项Amazon DMS端点。您可以使用 HTTPS 协议通过 SSL 端点安全地放置数据和检索数据Amazon DMS连接到 DynamoDB 数据库时默认使用。
为了帮助提高传输速度,Amazon DMS支持对 DynamoDB 目标实例进行多线程满负载。对于包含下列内容的任务设置,DMS 支持此多线程处理:
-
MaxFullLoadSubTasks
— 使用此选项指明要并行加载的源表的最大数量。DMS 使用专用子任务将每个表加载到其相应的 DynamoDB 目标表中。默认值为 8。最大值为 49。 -
ParallelLoadThreads
— 使用此选项指定线程数Amazon DMS用于将每个表加载到其 DynamoDB 目标表中。默认值为 0(单线程)。最大值为 200。您可以请求提高此最大值限制。注意
DMS 将表的各个段分配到其自己的线程进行加载。因此,将
ParallelLoadThreads
设置您为源中表指定的最大段数量。 -
ParallelLoadBufferSize
— 使用此选项指定缓冲区中存储的最大记录数,并行加载线程用于将数据加载到 DynamoDB 目标。默认值为 50。最大值为 1,000。将此设置与ParallelLoadThreads
一起使用;仅在有多个线程时ParallelLoadBufferSize
才有效。 -
单个表的表格映射设置-使用
table-settings
用于识别源中要并行加载的单个表的规则。另外可使用这些规则来指定如何为多线程加载的每个表的行分段。有关更多信息,请参阅表格和集合设置规则和操作:
注意
什么时候Amazon DMS为迁移任务设置 DynamoDB 参数值,默认读取容量单位 (RCU) 参数值设置为 200。
还会设置写入容量单位 (WCU) 参数值,但该参数值取决于几个其他设置:
-
WCU 参数的默认值为 200。
-
如果设置
ParallelLoadThreads
任务设置为大于 1(默认值为 0),则 WCU 参数设置为ParallelLoadThreads
值的 200 倍。 标准Amazon DMS使用费适用于您使用的资源。
从关系数据库迁移到 DynamoDB 表
Amazon DMS支持将数据迁移到 DynamoDB 标量数据类型。从 Oracle 或 MySQL 等关系数据库迁移到 DynamoDB 时,您可能希望重构存储此数据的方式。
目前,Amazon DMS 支持单个表到单个表重构到 DynamoDB 标量类型属性。如果您从关系数据库表迁移数据到 DynamoDB 中,您将从表中获取数据并将其重新格式化为 DynamoDB 标量数据类型属性。这些属性可以接受多个列中的数据,并且您可以直接将列映射到属性。
Amazon DMS 支持以下 DynamoDB 标量数据类型:
-
字符串
-
数字
-
布尔值
注意
源中的 NULL 数据在目标上会被忽略。
使用 DynamoDB 作为目标的先决条件Amazon Database Migration Service
在开始使用 DynamoDB 数据库作为目标之前Amazon DMS,请确保您创建 IAM 角色。这个 IAM 角色应该允许Amazon DMS假定并授予对正在迁移到的 DynamoDB 表的访问权限。以下 IAM 策略中显示了所需的最小访问权限集合。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "dms.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
您用于迁移到 DynamoDB 的角色必须具有以下权限。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:PutItem", "dynamodb:CreateTable", "dynamodb:DescribeTable", "dynamodb:DeleteTable", "dynamodb:DeleteItem", "dynamodb:UpdateItem" ], "Resource": [ "arn:aws:dynamodb:us-west-2:account-id:table/name1", "arn:aws:dynamodb:us-west-2:account-id:table/OtherName*", "arn:aws:dynamodb:us-west-2:account-id:table/awsdms_apply_exceptions", "arn:aws:dynamodb:us-west-2:account-id:table/awsdms_full_load_exceptions" ] }, { "Effect": "Allow", "Action": [ "dynamodb:ListTables" ], "Resource": "*" } ] }
使用 DynamoDB 作为目标时的限制Amazon Database Migration Service
使用 DynamoDB 作为目标时,以下限制适用:
-
DynamoDB 将数字数据类型的精度限制为 38 位。所有具有更高精度的数据类型应作为字符串存储。您需要使用对象映射功能明确指定这一点。
-
由于 DynamoDB 没有日期数据类型,因此使用日期数据类型的数据会转换为字符串。
-
DynamoDB 不允许更新主键属性。在将持续复制与更改数据捕获 (CDC) 一起使用时,该限制是非常重要的,因为这可能会导致在目标中包含不需要的数据。根据对象映射方式,更新主键的 CDC 操作可执行下列两项操作之一。它可能会失败,或插入具有更新后的主键和不完整数据的新项。
-
Amazon DMS 仅支持复制包含非复合主键的表。当您为具有自定义分区键和/或排序键的目标表指定对象映射时除外。
-
Amazon DMS除非是 CLOB,否则不支持 LOB 数据。Amazon DMS迁移数据时将 CLOB 数据转换为 DynamoDB 字符串。
-
使用 DynamoDB 作为目标时,仅 Apply Exceptions 控制表 (
dmslogs.awsdms_apply_exceptions
) 受支持。有关控制表的更多信息,请参阅控制表任务设置。 Amazon DMS不支持任务设置
TargetTablePrepMode=TRUNCATE_BEFORE_LOAD
将 DynamoDB 作为目标。Amazon DMS不支持任务设置
TaskRecoveryTableEnabled
将 DynamoDB 作为目标。
使用对象映射将数据迁移到 DynamoDB
Amazon DMS 使用表映射规则将数据从源映射到目标 DynamoDB 表。要将数据映射到 DynamoDB 目标,您必须使用称为 object-mapping 的表映射规则类型。利用对象映射可以定义属性名称以及要迁移到其中的数据。您在使用对象映射时必须具有选择规则。
除了分区键和可选的排序键外,DynamoDB 没有其他预设结构。如果有非复合主键,Amazon DMS 将使用该主键。如果您有复合主键或者希望使用排序键,请在目标 DynamoDB 表中定义这些键以及其他属性。
要创建对象映射规则,您应将 rule-type
指定为 object-mapping。此规则指定您要使用的对象映射的类型。
规则的结构如下所示:
{ "rules": [ { "rule-type": "object-mapping", "rule-id": "<id>", "rule-name": "<name>", "rule-action": "<valid object-mapping rule action>", "object-locator": { "schema-name": "<case-sensitive schema name>", "table-name": "" }, "target-table-name": "<table_name>" } ] }
Amazon DMS 目前支持 map-record-to-record
和 map-record-to-document
作为 rule-action
参数的唯一有效值。这些值指定 Amazon DMS 默认情况下对未作为 exclude-columns
属性列表的一部分排除的记录执行的操作。这些值不会以任何方式影响属性映射。
-
你可以使用
map-record-to-record
从关系数据库迁移到 DynamoDB 时。它使用关系数据库的主键作为 DynamoDB 中的分区键,并为源数据库中的每列创建一个属性。使用时map-record-to-record
,适用于源表中未列出的任何列exclude-columns
属性列表,Amazon DMS在目标 DynamoDB 实例上创建相应的属性。不论是否在属性映射中使用源列,都会执行此操作。 -
你用
map-record-to-document
使用属性名称 “_doc” 将源列放入目标上单个平面的 DynamoDB 映射中。使用时map-record-to-document
,Amazon DMS将数据放入源上的单个、平面的 DynamoDB 地图属性中。此属性称为“_doc”。此放置应用于源表中的未在exclude-columns
属性列表中列出的任何列。
了解 rule-action
参数 map-record-to-record
和 map-record-to-document
之间的差异的一种方法是,查看两个参数的实际使用情况。对于本示例,假定您使用关系数据库表行开始处理,该行具有以下结构和数据:

要将此信息迁移到 DynamoDB,您将创建规则来将数据映射到 DynamoDB 表项目中。请注意为 exclude-columns
参数列出的列。这些列不直接映射到目标上;取而代之的是,使用属性映射将数据合并为新项目,例如FirstName和LastName组合在一起成为CustomerName在 DynamoDB 目标上。NickName和收入不排除。
{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "object-mapping", "rule-id": "2", "rule-name": "TransformToDDB", "rule-action": "map-record-to-record", "object-locator": { "schema-name": "test", "table-name": "customer" }, "target-table-name": "customer_t", "mapping-parameters": { "partition-key-name": "CustomerName", "exclude-columns": [ "FirstName", "LastName", "HomeAddress", "HomePhone", "WorkAddress", "WorkPhone" ], "attribute-mappings": [ { "target-attribute-name": "CustomerName", "attribute-type": "scalar", "attribute-sub-type": "string", "value": "${FirstName},${LastName}" }, { "target-attribute-name": "ContactDetails", "attribute-type": "document", "attribute-sub-type": "dynamodb-map", "value": { "M": { "Home": { "M": { "Address": { "S": "${HomeAddress}" }, "Phone": { "S": "${HomePhone}" } } }, "Work": { "M": { "Address": { "S": "${WorkAddress}" }, "Phone": { "S": "${WorkPhone}" } } } } } } ] } } ] }
通过使用rule-action
参数map-record-to-record,数据为NickName和收入映射到 DynamoDB 目标中同名的项目。

但是,假设您使用相同的规则,但更改了rule-action
参数为map-record-to-document。在这种情况下,列中未列出exclude-columns
参数,NickName和收入,被映射到_doc项目。

使用自定义条件表达式和对象映射
您可以使用 DynamoDB 的一项名为条件表达式的功能来操作写入 DynamoDB 表的数据。有关 DynamoDB 中条件表达式的更多信息,请参见条件表达式。
条件表达式成员包括:
-
一个表达式 (必需)
-
表达式属性值 (可选)。指定属性值的 DynamoDB json 结构
-
表达式属性名 (可选)
-
确定何时使用条件表达式的选项 (可选)。默认为apply-during-cdc= 假和apply-during-full-load= 真的
规则的结构如下所示:
"target-table-name": "customer_t", "mapping-parameters": { "partition-key-name": "CustomerName", "condition-expression": { "expression":"<conditional expression>", "expression-attribute-values": [ { "name":"<attribute name>", "value":<attribute value> } ], "apply-during-cdc":<optional Boolean value>, "apply-during-full-load": <optional Boolean value> }
下面的示例强调了用于条件表达式的部分。

使用属性映射和对象映射
利用属性映射可以使用源列名来指定模板字符串,以便重建目标上数据的结构。除了用户在模板中指定的内容以外,不进行任何其他格式设置。
以下示例显示了源数据库的结构和所需的 DynamoDB 目标结构。首先显示的是源结构,在本例中为 Oracle 数据库,然后显示 DynamoDB 中所需的数据结构。该示例在结尾处提供了用于创建所需目标结构的 JSON。
Oracle 数据的结构如下所示:
FirstName | LastName | StoreId | HomeAddress | HomePhone | WorkAddress | WorkPhone | DateOfBirth |
---|---|---|---|---|---|---|---|
主键 | 不适用 | ||||||
Randy | Marsh | 5 | 221B Baker Street | 1234567890 | 31 Spooner Street, Quahog | 9876543210 | 02/29/1988 |
DynamoDB 数据的结构如下所示:
CustomerName | StoreId | ContactDetails | DateOfBirth |
---|---|---|---|
分区键 | 排序键 | 不适用 | |
|
|
|
|
下面的 JSON 显示用于实现 DynamoDB 结构的对象映射和列映射:
{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "object-mapping", "rule-id": "2", "rule-name": "TransformToDDB", "rule-action": "map-record-to-record", "object-locator": { "schema-name": "test", "table-name": "customer" }, "target-table-name": "customer_t", "mapping-parameters": { "partition-key-name": "CustomerName", "sort-key-name": "StoreId", "exclude-columns": [ "FirstName", "LastName", "HomeAddress", "HomePhone", "WorkAddress", "WorkPhone" ], "attribute-mappings": [ { "target-attribute-name": "CustomerName", "attribute-type": "scalar", "attribute-sub-type": "string", "value": "${FirstName},${LastName}" }, { "target-attribute-name": "StoreId", "attribute-type": "scalar", "attribute-sub-type": "string", "value": "${StoreId}" }, { "target-attribute-name": "ContactDetails", "attribute-type": "scalar", "attribute-sub-type": "string", "value": "{\"Name\":\"${FirstName}\",\"Home\":{\"Address\":\"${HomeAddress}\",\"Phone\":\"${HomePhone}\"}, \"Work\":{\"Address\":\"${WorkAddress}\",\"Phone\":\"${WorkPhone}\"}}" } ] } } ] }
使用列映射的另一种方法是使用 DynamoDB 格式作为您的文档类型。以下代码示例将 dynamodb-map 作为属性映射的 attribute-sub-type
。
{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "object-mapping", "rule-id": "2", "rule-name": "TransformToDDB", "rule-action": "map-record-to-record", "object-locator": { "schema-name": "test", "table-name": "customer" }, "target-table-name": "customer_t", "mapping-parameters": { "partition-key-name": "CustomerName", "sort-key-name": "StoreId", "exclude-columns": [ "FirstName", "LastName", "HomeAddress", "HomePhone", "WorkAddress", "WorkPhone" ], "attribute-mappings": [ { "target-attribute-name": "CustomerName", "attribute-type": "scalar", "attribute-sub-type": "string", "value": "${FirstName},${LastName}" }, { "target-attribute-name": "StoreId", "attribute-type": "scalar", "attribute-sub-type": "string", "value": "${StoreId}" }, { "target-attribute-name": "ContactDetails", "attribute-type": "document", "attribute-sub-type": "dynamodb-map", "value": { "M": { "Name": { "S": "${FirstName}" }, "Home": { "M": { "Address": { "S": "${HomeAddress}" }, "Phone": { "S": "${HomePhone}" } } }, "Work": { "M": { "Address": { "S": "${WorkAddress}" }, "Phone": { "S": "${WorkPhone}" } } } } } } ] } } ] }
作为替代方案dynamodb-map
,你可以使用dynamodb-list
作为attribute-sub-type用于属性映射,如以下示例所示。
{ "target-attribute-name": "ContactDetailsList", "attribute-type": "document", "attribute-sub-type": "dynamodb-list", "value": { "L": [ { "N": "${FirstName}" }, { "N": "${HomeAddress}" }, { "N": "${HomePhone}" }, { "N": "${WorkAddress}" }, { "N": "${WorkPhone}" } ] } }
示例 1:使用属性映射和对象映射
以下示例迁移来自两个 MySQL 数据库表的数据,nfl_data和sport_tea,到两个名为 DynamoDB 的表NFLTeams和SportTeams。表的结构以及用于将数据从 MySQL 数据库表映射到 DynamoDB 表的 JSON 如下所示。
MySQL 数据库表 nfl_data 的结构如下所示:
mysql> desc nfl_data; +---------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+---------+-------+ | Position | varchar(5) | YES | | NULL | | | player_number | smallint(6) | YES | | NULL | | | Name | varchar(40) | YES | | NULL | | | status | varchar(10) | YES | | NULL | | | stat1 | varchar(10) | YES | | NULL | | | stat1_val | varchar(10) | YES | | NULL | | | stat2 | varchar(10) | YES | | NULL | | | stat2_val | varchar(10) | YES | | NULL | | | stat3 | varchar(10) | YES | | NULL | | | stat3_val | varchar(10) | YES | | NULL | | | stat4 | varchar(10) | YES | | NULL | | | stat4_val | varchar(10) | YES | | NULL | | | team | varchar(10) | YES | | NULL | | +---------------+-------------+------+-----+---------+-------+
MySQL 数据库表 sport_team 的结构如下所示:
mysql> desc sport_team; +---------------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------------------+--------------+------+-----+---------+----------------+ | id | mediumint(9) | NO | PRI | NULL | auto_increment | | name | varchar(30) | NO | | NULL | | | abbreviated_name | varchar(10) | YES | | NULL | | | home_field_id | smallint(6) | YES | MUL | NULL | | | sport_type_name | varchar(15) | NO | MUL | NULL | | | sport_league_short_name | varchar(10) | NO | | NULL | | | sport_division_short_name | varchar(10) | YES | | NULL | |
将这两个表映射到两个 DynamoDB 表时使用的表映射规则如下所示:
{ "rules":[ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "dms_sample", "table-name": "nfl_data" }, "rule-action": "include" }, { "rule-type": "selection", "rule-id": "2", "rule-name": "2", "object-locator": { "schema-name": "dms_sample", "table-name": "sport_team" }, "rule-action": "include" }, { "rule-type":"object-mapping", "rule-id":"3", "rule-name":"MapNFLData", "rule-action":"map-record-to-record", "object-locator":{ "schema-name":"dms_sample", "table-name":"nfl_data" }, "target-table-name":"NFLTeams", "mapping-parameters":{ "partition-key-name":"Team", "sort-key-name":"PlayerName", "exclude-columns": [ "player_number", "team", "Name" ], "attribute-mappings":[ { "target-attribute-name":"Team", "attribute-type":"scalar", "attribute-sub-type":"string", "value":"${team}" }, { "target-attribute-name":"PlayerName", "attribute-type":"scalar", "attribute-sub-type":"string", "value":"${Name}" }, { "target-attribute-name":"PlayerInfo", "attribute-type":"scalar", "attribute-sub-type":"string", "value":"{\"Number\": \"${player_number}\",\"Position\": \"${Position}\",\"Status\": \"${status}\",\"Stats\": {\"Stat1\": \"${stat1}:${stat1_val}\",\"Stat2\": \"${stat2}:${stat2_val}\",\"Stat3\": \"${stat3}:${ stat3_val}\",\"Stat4\": \"${stat4}:${stat4_val}\"}" } ] } }, { "rule-type":"object-mapping", "rule-id":"4", "rule-name":"MapSportTeam", "rule-action":"map-record-to-record", "object-locator":{ "schema-name":"dms_sample", "table-name":"sport_team" }, "target-table-name":"SportTeams", "mapping-parameters":{ "partition-key-name":"TeamName", "exclude-columns": [ "name", "id" ], "attribute-mappings":[ { "target-attribute-name":"TeamName", "attribute-type":"scalar", "attribute-sub-type":"string", "value":"${name}" }, { "target-attribute-name":"TeamInfo", "attribute-type":"scalar", "attribute-sub-type":"string", "value":"{\"League\": \"${sport_league_short_name}\",\"Division\": \"${sport_division_short_name}\"}" } ] } } ] }
NFLTeams DynamoDB 表的示例输出如下所示:
"PlayerInfo": "{\"Number\": \"6\",\"Position\": \"P\",\"Status\": \"ACT\",\"Stats\": {\"Stat1\": \"PUNTS:73\",\"Stat2\": \"AVG:46\",\"Stat3\": \"LNG:67\",\"Stat4\": \"IN 20:31\"}", "PlayerName": "Allen, Ryan", "Position": "P", "stat1": "PUNTS", "stat1_val": "73", "stat2": "AVG", "stat2_val": "46", "stat3": "LNG", "stat3_val": "67", "stat4": "IN 20", "stat4_val": "31", "status": "ACT", "Team": "NE" }
的输出示例SportsTeams dynamoDB表格如下所示:
{ "abbreviated_name": "IND", "home_field_id": 53, "sport_division_short_name": "AFC South", "sport_league_short_name": "NFL", "sport_type_name": "football", "TeamInfo": "{\"League\": \"NFL\",\"Division\": \"AFC South\"}", "TeamName": "Indianapolis Colts" }
DynamoDB 的目标数据类型
用于 DynamoDB 终端节点Amazon DMS支持大多数 DynamoDB 数据类型。下表显示了使用 Amazon DMS 时支持的 Amazon Amazon DMS 目标数据类型以及来自 Amazon DMS 数据类型的默认映射。
有关 Amazon DMS 数据类型的其他信息,请参阅Database MigratiAmazon on Service 数据类型。
Amazon DMS 从异构数据库迁移数据时,我们将数据类型从源数据库映射到称为 Amazon DMS 数据类型的中间数据类型。然后,我们将中间数据类型映射到目标数据类型。下表列出了各种 Amazon DMS 数据类型及其映射到 DynamoDB 中的数据类型:
Amazon DMS 数据类型 | DynamoDB 数据类型 |
---|---|
字符串 |
字符串 |
WString |
字符串 |
布尔值 |
布尔值 |
日期 |
字符串 |
DateTime |
字符串 |
INT1 |
数字 |
INT2 |
数字 |
INT4 |
数字 |
INT8 |
数字 |
数值 |
数字 |
Real4 |
数字 |
Real8 |
数字 |
UINT1 |
数字 |
UINT2 |
数字 |
UINT4 |
数字 |
UINT8 | 数字 |
CLOB | 字符串 |