本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 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。使用此設定搭配ParallelLoadThreads
;ParallelLoadBufferSize
,只有在有多個執行緒時才有效。 -
個別資料表的資料表對應設定:使用
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-record
和 map-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-record
和 map-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-record, NickName和收入的資料會映射到 DynamoDB 目標中相同名稱的項目。
不過,假設您使用相同的規則,但將 rule-action
參數變更為 map-record-to-document。在這種情況下,未列於 exclude-columns
參數NickName和收入中的資料欄會映射到 _doc 項目。
使用自訂條件表達式與物件映射
您可以使用稱為條件表達式的 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> }
以下範例會重點介紹用於條件表達式的區段。
使用屬性映射與物件映射
屬性映射讓您使用來源資料行名稱指定範本字串,在目標中重組資料。除使用者在範本中指定的以外,沒有任何格式化。
以下範例顯示來源資料庫的結構以及 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 | |
|
|
|
|
以下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_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 | 字串 |