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

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

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

您可以使用 AWS DMS 將資料遷移至 Amazon DynamoDB 資料表。Amazon DynamoDB 是全受管的無SQL資料庫服務,可提供快速且可預測的效能和無縫的可擴展性。 AWS DMS 支援使用關聯式資料庫或 MongoDB 做為來源。

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

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

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

注意

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

為了協助提高傳輸速度, 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 converts CLOB 資料,否則不支援資料。遷移資料時,資料會轉換為 DynamoDB 字串。

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

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

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

  • BatchApply DynamoDB 端點不支援 。

使用物件映射將資料遷移到 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 參數的唯一有效值。這些值會指定預設 AWS DMS 如何處理屬性exclude-columns清單中未排除的記錄。這些值反正不會影響屬性映射。

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

  • 請使用 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 參數列出的資料行。這些資料行不會直接映射至目標。反之,屬性映射會用來將資料合併為新項目,例如 LastName FirstName和 分組成在 DynamoDB 目標CustomerName上。 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-recordNickName收入的資料會映射到 DynamoDB 目標中相同名稱的項目。

開始使用 AWS DMS

不過,假設您使用相同的規則,但將 rule-action 參數變更為 map-record-to-document。在這種情況下,未列於 exclude-columns 參數NickName收入中的資料欄會映射到 _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 遷移至兩個名為 NFLTeams和 的 DynamoDB 資料表SportTeams。資料表的結構和JSON用於將資料從我的SQL資料庫資料表映射到 DynamoDB 資料表的 如下所示。

My 資料庫資料表 nfl_data 的SQL結構如下所示:

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 | | +---------------+-------------+------+-----+---------+-------+

My 資料庫資料表 sport_team 的SQL結構如下所示:

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 端點 AWS DMS 支援大多數 DynamoDB 資料類型。下表顯示使用 時支援的 Amazon AWS DMS 目標資料類型, AWS DMS 以及來自 AWS DMS 資料類型的預設映射。

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

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

AWS DMS 資料類型 DynamoDB 資料類型

字串

字串

WString

字串

Boolean

Boolean

日期

字串

DateTime

字串

INT1

Number

INT2

Number

INT4

Number

INT8

Number

數值

Number

Real4

Number

Real8

Number

UINT1

Number

UINT2

Number

UINT4

Number

UINT8 Number
CLOB 字串