使用 Amazon DynamoDB 資料庫作為 AWS Database Migration Service 的目標 - AWS Database Migration Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Amazon DynamoDB 資料庫作為 AWS Database Migration Service 的目標

您可以使用 AWS DMS 將資料遷移至 Amazon DynamoDB 資料表。Amazon DynamoDB 是完全受管的 NoSQL 資料庫服務,可提供快速且可預期的效能及流暢的可擴展性。AWS DMS 支援使用關聯式資料庫或 MongoDB 作為來源。

在 DynamoDB 中,資料表、項目與屬性都是您會用到的核心元件。資料表是項目的集合,而每個項目都是屬性的集合。DynamoDB 使用稱為分割區索引鍵的主索引鍵,唯一識別資料表中的各個項目。您也可以使用索引鍵和次要索引提供更多的查詢靈活性。

您要使用物件映射將資料從來源資料庫遷移到目標 DynamoDB 資料表。物件映射可讓您判斷來源資料在目標中的位置。

當 AWS DMS 在 DynamoDB 目標端點建立資料表時,其會建立和來源資料庫端點一樣多的資料表。AWS DMS 也會設定數個 DynamoDB 參數值。資料表的建立成本取決於要遷移的資料量和資料表數量。

注意

AWS DMS 主控台或 API 上的 SSL 模式選項不適用於某些資料串流和 NoSQL 服務,例如 Kinesis 和 DynamoDB。依預設,其是安全的,因此 AWS DMS 會顯示 SSL 模式設定等於無 (SSL 模式=無)。您無需為端點提供任何其他組態即可使用 SSL。例如,使用 DynamoDB 作為目標端點時,預設情況下其是安全的。對 DynamoDB 的所有 API 呼叫都使用 SSL,因此 AWS DMS 端點中不需要額外的 SSL 選項。您可以使用 HTTPS 通訊協定 (AWS DMS 是在連線到 DynamoDB 資料庫時預設使用的通訊協定),透過 SSL 端點安全地放置和擷取資料。

為了協助加快傳輸速度,AWS DMS 支援可對 DynamoDB 目標執行個體進行多執行緒完全載入。DMS 使用包括下列項目的任務設定來支援此多執行緒操作:

  • MaxFullLoadSubTasks:使用此選項,指出要平行載入的來源資料表數目上限。DMS 會使用專用子任務,將每個資料表載入到其對應的 DynamoDB 目標資料表。預設值為 8。最大值為 49。

  • ParallelLoadThreads:使用此選項,指定 AWS DMS 將每個資料表載入至其 DynamoDB 目標資料表時所使用的執行緒數目。預設值為 0 (單一執行緒)。最大值為 200。您可以要求提高此上限。

    注意

    DMS 會將資料表的每個區段指派給自己的執行緒,以進行載入。因此,將 ParallelLoadThreads 設定為您針對來源中資料表所指定的區段數量上限。

  • ParallelLoadBufferSize:使用此選項,指定要在平行載入執行緒用來將資料載入至 DynamoDB 目標的緩衝區中存放的記錄數量上限。預設值為 50。最大值為 1000。使用此設定搭配 ParallelLoadThreadsParallelLoadBufferSize,只有在有多個執行緒時才有效。

  • 個別資料表的資料表對應設定:使用 table-settings 規則,從來源中識別您想要平行載入的個別資料表。亦可使用這些規則,指定如何將每個資料表的資料列分段,以進行多執行緒載入。如需更多詳細資訊,請參閱 資料表和集合設定規則與操作

注意

當 AWS DMS 針對遷移任務設定 DynamoDB 參數值時,將預設的讀取容量單位 (RCU) 參數值設為 200。

也會設定寫入容量單位 (WCU) 參數值,但其值取決於多項其他設定:

  • WCU 參數的預設值為 200。

  • 如果 ParallelLoadThreads 任務設定的值大於 1 (預設為 0),則 WCU 參數會設定為 ParallelLoadThreads 值的 200 倍。

  • 標準 AWS DMS 使用費適用於您使用的資源。

從關聯式資料庫遷移到 DynamoDB 資料表

AWS DMS 支援將資料遷移到 DynamoDB 的純量資料類型。從 Oracle 或 MySQL 等關聯式資料庫遷移到 DynamoDB 時,您可能想要重組資料的存放方式。

目前 AWS DMS 支援單一資料表到單一資料表重組為 DynamoDB 純量類型屬性。如果要將資料從關聯式資料庫資料表遷移到 DynamoDB,您需要取出資料表的資料,將它重新格式化為 DynamoDB 純量資料類型屬性。這些屬性可以接受多資料行資料,而且您可以直接將資料行映射到屬性。

AWS DMS 支援下列 DynamoDB 純量資料類型:

  • 字串

  • Number

  • Boolean

注意

忽略目標中來自來源的 NULL 資料。

使用 DynamoDB 作為 AWS Database Migration Service 目標的先決條件

在您開始使用 DynamoDB 資料庫作為 AWS DMS 的目標之前,請務必建立 IAM 角色。此 IAM 角色應該允許 AWS 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 作為 AWS Database Migration Service 目標的限制

使用 DynamoDB 作為目標時,有下列限制:

  • DynamoDB 將 Number 資料類型的精確度限制到 38 位。將精確度更高的所有資料類型存放為字串。您需要使用物件映射功能來明確指定此設定。

  • 因為 DynamoDB 沒有 Date 資料類型,所以使用 Date 資料類型的資料會轉換為字串。

  • DynamoDB 不允許更新主索引鍵屬性。此限制在使用變更資料擷取 (CDC) 持續複寫時十分重要,因為它會導致目標出現不需要的資料。根據您如何映射物件,用於更新主索引鍵的 CDC 操作有兩種用途。它可以使新項目失敗,或隨著更新的主索引鍵和不完整的資料來插入新項目。

  • AWS DMS 僅支援使用非複合主索引鍵複寫資料表。如果您搭配分區索引鍵、排序索引鍵或兩者來指定目標資料表的物件映射,則為例外。

  • AWS DMS 不支援 LOB 資料,除非其是 CLOB。AWS DMS 在遷移資料時,會將 CLOB 資料轉換成 DynamoDB 字串。

  • 使用 DynamoDB 做為目標時,僅支援套用異常控制資料表 (dmslogs.awsdms_apply_exceptions)。如需控制資料表的詳細資訊,請參閱控制資料表任務設定

  • AWS DMS 不支援將 DynamoDB 作為目標的任務設定 TargetTablePrepMode=TRUNCATE_BEFORE_LOAD

  • AWS DMS 不支援將 DynamoDB 作為目標的任務設定 TaskRecoveryTableEnabled

使用物件映射將資料遷移到 DynamoDB

AWS DMS 使用資料表映射規則,將來源資料映射到目標 DynamoDB 資料表。若要將資料映射到 DynamoDB 目標,您要使用一種稱為 object-mapping 的資料表映射規則。物件映射可讓您定義屬性名稱和遷移到屬性的資料。當您使用物件映射時,您必須有選擇規則。

除了擁有分割區索引鍵和選擇性排序索引鍵外,DynamoDB 沒有預設結構。如果您有一個非複合主索引鍵,AWS 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>" } ] }

AWS DMS 目前僅支援 map-record-to-recordmap-record-to-document 做為 rule-action 參數的有效值。對於 exclude-columns 屬性清單中未排除的記錄,這些值指定 AWS DMS 的預設處理方式。這些值反正不會影響屬性映射。

  • 從關聯式資料庫遷移到 DynamoDB 時,您可以使用 map-record-to-record。其使用關聯式資料庫的主索引鍵作為 DynamoDB 的分割區索引鍵,並為來源資料庫中的每個資料欄建立一個屬性。使用 map-record-to-record 時,針對來源資料表中未列在 exclude-columns 屬性清單中的任何資料欄,AWS DMS 會在目標 DynamoDB 執行個體中建立對應的屬性。無論屬性映射中是否使用該來源欄,它都會這樣做。

  • 請使用 map-record-to-document 並利用屬性名稱 "_doc",將來源資料欄放到目標上的單一、普通 DynamoDB 對應中。使用 map-record-to-document 時,AWS DMS 會將資料放到來源上的單一、普通 DynamoDB 對應屬性中。此屬性稱為 "_doc"。此放置適用於來源資料表中未列在 exclude-columns 屬性清單的任何欄。

若要了解 rule-action 參數 map-record-to-recordmap-record-to-document 之間的差異,方法之一就是實際查看這兩個參數。在本範例中,假設您開始使用之關聯式資料庫資料表資料列的結構和資料如下:

範例所用的範例資料庫

若要將此資訊遷移到 DynamoDB,您要建立規則,將資料映射到 DynamoDB 資料表項目。記下針對 exclude-columns 參數列出的資料行。這些資料行不會直接映射至目標。而是改用屬性映射將資料組合為新項目,例如 FirstNameLastName 組成 DynamoDB 目標的 CustomerName。不排除 NickNameincome

{ "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-recordNickNameincome 的資料映射到 DynamoDB 目標的同名項目。

開始使用 AWS DMS

不過,假設您使用相同的規則,但將 rule-action 參數變更為 map-record-to-document。在本例中,未列在 exclude-columns 參數 NickNameincome 中的資料行會映射到 _doc 項目。

開始使用 AWS DMS

使用自訂條件表達式與物件映射

您可以使用稱為條件表達式的 DynamoDB 功能,操作要寫入 DynamoDB 資料表的資料。如需 DynamoDB 中條件表達式的詳細資訊,請參閱條件表達式

條件表達式成員包含:

  • 表達式 (必要)

  • 表達式屬性值 (選用)。指定屬性值的 DynamoDB json 結構

  • 表達式屬性名稱 (選用)

  • 何時使用條件表達式的選項 (選用)。預設值是 apply-during-cdc = false 和 apply-during-full-load = true

規則的結構如下:

"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> }

以下範例會重點介紹用於條件表達式的區段。

開始使用 AWS DMS

使用屬性映射與物件映射

屬性映射讓您使用來源資料行名稱指定範本字串,在目標中重組資料。除使用者在範本中指定的以外,沒有任何格式化。

以下範例顯示來源資料庫的結構以及 DynamoDB 目標所需的架構。首先顯示來源的結構 (本例中為 Oracle 資料庫),然後顯示 DynamoDB 資料所需的架構。此範例以建立所需目標結構所使用的 JSON 作結。

Oracle 資料的結構如下:

FirstName LastName StoreId HomeAddress HomePhone WorkAddress WorkPhone DateOfBirth
主索引鍵 N/A
Randy Marsh 5 221B Baker Street 1234567890 31 Spooner Street, Quahog 9876543210 1988/02/29

DynamoDB 資料的結構如下:

CustomerName StoreId ContactDetails DateOfBirth
分割區索引鍵 排序索引鍵 (Sort Key) N/A
Randy,Marsh
5
{ "Name": "Randy", "Home": { "Address": "221B Baker Street", "Phone": 1234567890 }, "Work": { "Address": "31 Spooner Street, Quahog", "Phone": 9876541230 } }
02/29/1988

下列 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_datasport_team 遷移到兩個 DynamoDB 資料表 NFLTeamsSportTeams。將資料從 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 的目標資料類型

適用於 AWS DMS 的 DynamoDB 端點支援大部分的 DynamoDB 資料類型。下表顯示在使用 AWS DMS 和來自 AWS DMS 資料類型的預設映射時受支援的 Amazon AWS DMS 目標資料類型。

如需 AWS DMS 資料類型的詳細資訊,請參閱AWS Database Migration Service 的資料類型

當 AWS DMS 從異質資料庫中遷移資料時,我們會將來源資料庫的資料類型映射到稱為 AWS DMS 資料類型的中繼資料類型。然後,我們會將中繼資料類型映射到目標資料類型。下表顯示每種 AWS DMS 資料類型以及其映射至 DynamoDB 的資料類型:

AWS DMS 資料類型 DynamoDB 資料類型

字串

字串

WString

字串

Boolean

Boolean

日期

字串

DateTime

字串

INT1

數字

INT2

數字

INT4

數字

INT8

數字

數值

數字

Real4

數字

Real8

數字

UINT1

數字

UINT2

數字

UINT4

數字

UINT8 數字
CLOB 字串