

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

# 資料遷移的目標
<a name="CHAP_Target"></a>

AWS Database Migration Service (AWS DMS) 可以使用許多最熱門的資料庫作為資料複寫的目標。目標可位於 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、Amazon Relational Database Service (Amazon RDS) 資料庫執行個體或內部部署資料庫中。

如需有效目標的完整清單，請參閱 [AWS DMS的目標](CHAP_Introduction.Targets.md)。

**注意**  
AWS DMS 針對下列目標端點類型， 不支援跨 AWS 區域遷移：  
Amazon DynamoDB
Amazon OpenSearch Service
Amazon Kinesis Data Streams
Amazon Aurora PostgreSQL Limitless 可作為 AWS Database Migration Service (AWS DMS) 的目標。如需詳細資訊[，請參閱使用 PostgreSQL 資料庫做為 的目標 AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html)。

**Topics**
+ [使用 Oracle 資料庫做為 的目標 AWS Database Migration Service](CHAP_Target.Oracle.md)
+ [使用 Microsoft SQL Server 資料庫做為 的目標 AWS Database Migration Service](CHAP_Target.SQLServer.md)
+ [使用 PostgreSQL 資料庫做為 的目標 AWS Database Migration Service](CHAP_Target.PostgreSQL.md)
+ [使用 MySQL 相容資料庫做為 的目標 AWS Database Migration Service](CHAP_Target.MySQL.md)
+ [使用 Amazon Redshift 資料庫做為 的目標 AWS Database Migration Service](CHAP_Target.Redshift.md)
+ [使用 SAP ASE 資料庫做為 的目標 AWS Database Migration Service](CHAP_Target.SAP.md)
+ [使用 Amazon S3 做為 的目標 AWS Database Migration Service](CHAP_Target.S3.md)
+ [使用 Amazon DynamoDB 資料庫做為 的目標 AWS Database Migration Service](CHAP_Target.DynamoDB.md)
+ [使用 Amazon Kinesis Data Streams 作為 的目標 AWS Database Migration Service](CHAP_Target.Kinesis.md)
+ [使用 Apache Kafka 做為 的目標 AWS Database Migration Service](CHAP_Target.Kafka.md)
+ [使用 Amazon OpenSearch Service 叢集做為 的目標 AWS Database Migration Service](CHAP_Target.Elasticsearch.md)
+ [使用 Amazon DocumentDB 做為 AWS Database Migration Service 的目標](CHAP_Target.DocumentDB.md)
+ [使用 Amazon Neptune 做為 的目標 AWS Database Migration Service](CHAP_Target.Neptune.md)
+ [使用 Redis OSS 做為 的目標 AWS Database Migration Service](CHAP_Target.Redis.md)
+ [使用 Babelfish 做為 的目標 AWS Database Migration Service](CHAP_Target.Babelfish.md)
+ [使用 Amazon Timestream 做為 的目標 AWS Database Migration Service](CHAP_Target.Timestream.md)
+ [使用 Amazon RDS for Db2 和 IBM Db2 LUW 作為 的目標 AWS DMS](CHAP_Target.DB2.md)

# 使用 Oracle 資料庫做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.Oracle"></a>

您可以使用 從另一個 Oracle 資料庫或其他支援的資料庫之一 AWS DMS，將資料遷移至 Oracle 資料庫目標。您可以使用 Secure Sockets Layer (SSL) 加密您 Oracle 端點與複寫執行個體之間的連線。如需搭配 Oracle 端點使用 SSL 的詳細資訊，請參閱 [搭配 使用 SSL AWS Database Migration Service](CHAP_Security.SSL.md)。 AWS DMS 也支援使用 Oracle 透明資料加密 (TDE) 來加密目標資料庫中的靜態資料，因為 Oracle TDE 不需要加密金鑰或密碼即可寫入資料庫。

如需 AWS DMS 支援做為目標的 Oracle 版本資訊，請參閱 [的目標 AWS DMS](CHAP_Introduction.Targets.md)。

當您使用 Oracle 做為目標時，我們假設資料將遷移到用於目標連線的結構描述或使用者。如果您想要將資料遷移到不同的結構描述，請使用結構描述轉型來執行此作業。例如，假設您的目標端點連線到使用者 `RDSMASTER`，而您想要從使用者 `PERFDATA1` 遷移到 `PERFDATA2`。在這種情況下，請建立如下所示的轉換。

```
{
   "rule-type": "transformation",
   "rule-id": "2",
   "rule-name": "2",
   "rule-action": "rename",
   "rule-target": "schema",
   "object-locator": {
   "schema-name": "PERFDATA1"
},
"value": "PERFDATA2"
}
```

使用 Oracle 做為目標時， 會將所有資料表和索引 AWS DMS 遷移至目標中的預設資料表和索引資料表空間。如果您要將資料表和索引遷移到不同的資料表和索引資料表空間，請使用資料表空間轉換來這樣做。例如，假設您在 `INVENTORY` 結構描述中有一組資料表指派給 Oracle 來源中的一些資料表空間。對於遷移，您想要將所有這些資料表指派給目標中的單一 `INVENTORYSPACE` 資料表空間。在這種情況下，請建立如下所示的轉換。

```
{
   "rule-type": "transformation",
   "rule-id": "3",
   "rule-name": "3",
   "rule-action": "rename",
   "rule-target": "table-tablespace",
   "object-locator": {
      "schema-name": "INVENTORY",
      "table-name": "%",
      "table-tablespace-name": "%"
   },
   "value": "INVENTORYSPACE"
}
```

如需轉型的詳細資訊，請參閱[使用 JSON 指定資料表選擇及轉換](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.md)。

如果 Oracle 同時是來源和目標，您可以設定 Oracle 來源額外連線屬性，來保留現有的資料表或索引資料表空間指派 `enableHomogenousTablespace=true`。如需詳細資訊，請參閱[使用 Oracle 做為 來源時的端點設定 AWS DMS](CHAP_Source.Oracle.md#CHAP_Source.Oracle.ConnectionAttrib)

如需使用 Oracle 資料庫做為 目標的其他詳細資訊 AWS DMS，請參閱下列章節：

**Topics**
+ [Oracle 做為 目標的限制 AWS Database Migration Service](#CHAP_Target.Oracle.Limitations)
+ [使用 Oracle 做為目標所需之使用者帳戶權限](#CHAP_Target.Oracle.Privileges)
+ [將 Oracle 資料庫設定為 的目標 AWS Database Migration Service](#CHAP_Target.Oracle.Configuration)
+ [使用 Oracle 做為 目標時的端點設定 AWS DMS](#CHAP_Target.Oracle.ConnectionAttrib)
+ [Oracle 的目標資料類型](#CHAP_Target.Oracle.DataTypes)

## Oracle 做為 目標的限制 AWS Database Migration Service
<a name="CHAP_Target.Oracle.Limitations"></a>

使用 Oracle 做為資料遷移目標時有以下限制：
+ AWS DMS 不會在目標 Oracle 資料庫上建立結構描述。您必須在目標 Oracle 資料庫中建立您想要的任何結構描述。Oracle 目標中必須已有結構描述名稱。來自來源結構描述的資料表會匯入至使用者或結構描述，其 AWS DMS 會用來連線至目標執行個體。若要遷移多個結構描述，您可以建立多個複寫任務。您也可以將資料遷移至目標上不同的資料架構。若要這樣做，您需要在 AWS DMS 資料表映射上使用結構描述轉換規則。
+ AWS DMS 不支援具有 INDEXTYPE CONTEXT 的資料表`Use direct path full load`選項。若要解決這個問題，您可以使用陣列載入。
+ 使用批次最佳化套用模式，載入到網路變更表會使用直接路徑，這不支援 XML 資料類型。若要解決這個問題，您可以使用交易套用模式。
+ 從來源資料庫遷移的空白字串可能會使用與 Oracle 目標不同的方式處理 (例如轉換成一個空格的字串)。這可能會導致 AWS DMS 驗證報告不相符。
+ 您可以使用下列公式，表示在批次最佳化套用模式下每個資料表支援的欄總數：

  ```
  2 * columns_in_original_table + columns_in_primary_key <= 999
  ```

  例如，如果原始資料表有 25 個欄，其中「主索引鍵」由 5 欄組成，則欄的總數為 55。如果資料表超過支援的欄數，則會以逐步模式套用所有變更。
+ AWS DMS 不支援 Oracle Cloud Infrastructure (OCI) 上的自治資料庫。
+ 在交易套用模式中，Oracle 目標可以處理大小上限為 32 KB 的 DML 陳述式。雖然此限制足以處理許多使用案例，但超過 32 KB 的 DML 陳述式將會失敗，並顯示錯誤：「請求「ORA-01460：未實作或不合理的轉換」。若要解決此問題，您必須將`BatchApplyEnabled`任務設定設定為 來啟用批次套用功能`true`。批次套用會減少整體陳述式大小，讓您繞過 32 KB 的限制。如需詳細資訊，請參閱[目標中繼資料任務設定](CHAP_Tasks.CustomizingTasks.TaskSettings.TargetMetadata.md)。
+ AWS DMS 由於 LOB 資料的特殊處理要求，LOB 資料表的直接路徑完全載入可能會失敗，並出現錯誤 ORA-39777。此錯誤會在直接路徑載入程序期間發生，並可能會中斷涉及 LOB 資料欄的遷移任務。若要解決此問題，請停用目標端點上的 `useDirectPathFullLoad`設定，然後重試載入操作。

## 使用 Oracle 做為目標所需之使用者帳戶權限
<a name="CHAP_Target.Oracle.Privileges"></a>

若要在 AWS Database Migration Service 任務中使用 Oracle 目標，請在 Oracle 資料庫中授予下列權限。請將這些權限授予 Oracle 資料庫定義中指定給 AWS DMS的使用者帳戶。
+ SELECT ANY TRANSACTION 
+ V\$1NLS\$1PARAMETERS 的 SELECT 權限 
+ V\$1TIMEZONE\$1NAMES 的 SELECT 權限 
+ ALL\$1INDEXES 的 SELECT 權限 
+ ALL\$1OBJECTS 的 SELECT 權限 
+ DBA\$1OBJECTS 的 SELECT 權限
+ ALL\$1TABLES 的 SELECT 權限 
+ ALL\$1USERS 的 SELECT 權限 
+ ALL\$1CATALOG 的 SELECT 權限 
+ ALL\$1CONSTRAINTS 的 SELECT 權限 
+ ALL\$1CONS\$1COLUMNS 的 SELECT 權限 
+ ALL\$1TAB\$1COLS 的 SELECT 權限 
+ ALL\$1IND\$1COLUMNS 的 SELECT 權限 
+ DROP ANY TABLE 
+ SELECT ANY TABLE
+ INSERT ANY TABLE 
+ UPDATE ANY TABLE
+ CREATE ANY VIEW
+ DROP ANY VIEW
+ CREATE ANY PROCEDURE
+ ALTER ANY PROCEDURE
+ DROP ANY PROCEDURE
+ CREATE ANY SEQUENCE
+ ALTER ANY SEQUENCE
+ DROP ANY SEQUENCE 
+ DELETE ANY TABLE

針對以下要求，請授予這些額外的權限：
+ 若要使用特定的資料表清單，請在任何複寫資料表中授予 SELECT 權限，也可以授予 ALTER 權限。
+ 若要讓使用者在預設資料表空間中建立資料表，請授予 GRANT UNLIMITED TABLESPACE 權限。
+ 針對登入，授予 CREATE SESSION 權限。
+ 如果您使用的是直接路徑 (這是完全載入的預設路徑)，則為 `GRANT LOCK ANY TABLE to dms_user;`。
+ 如果使用「DROP 和 CREATE」資料表準備模式時的結構描述不同，則為 `GRANT CREATE ANY INDEX to dms_user;`.
+ 對於某些完全載入案例，您可以選擇「DROP 與 CREATE 資料表」或「先截斷再載入」選項，其中目標資料表結構描述與 DMS 使用者不同。在此情況下，授予 DROP ANY TABLE。
+ 若要在目標資料表結構描述與 DMS 使用者結構描述不同時將變更儲存在變更資料表或稽核資料表中，請授予 CREATE ANY TABLE 和 CREATE ANY INDEX。
+ 若要使用驗證功能驗證 LOB 資料欄，請將 上的 EXECUTE 權限授予 `SYS.DBMS_CRYPTO` DMS 使用者。

### 目標資料庫 AWS Database Migration Service 上 所需的讀取權限
<a name="CHAP_Target.Oracle.Privileges.Read"></a>

必須授予 AWS DMS 使用者帳戶下列 DBA 資料表的讀取許可：
+ DBA\$1USERS 的 SELECT 權限
+ DBA\$1TAB\$1PRIVS 的 SELECT 權限
+ DBA\$1OBJECTS 的 SELECT 權限
+ DBA\$1SYNONYMS 的 SELECT 權限
+ DBA\$1SEQUENCES 的 SELECT 權限
+ DBA\$1TYPES 的 SELECT 權限
+ DBA\$1INDEXES 的 SELECT 權限
+ DBA\$1TABLES 的 SELECT 權限
+ DBA\$1TRIGGERS 的 SELECT 權限
+ SYS.DBA\$1REGISTRY 的 SELECT 權限

如果 V\$1xxx 無法獲授予任何所需的權限，請將這些權限授予 V\$1\$1xxx。

### 預遷移評估
<a name="CHAP_Target.Oracle.Privileges.Premigration"></a>

若要使用 中列出的預遷移評估[Oracle 評估](CHAP_Tasks.AssessmentReport.Oracle.md)搭配 Oracle 做為目標，您必須將下列許可新增至 Oracle 資料庫目標端點中指定的使用者帳戶：

```
GRANT SELECT ON V_$INSTANCE TO dms_user;
GRANT EXECUTE ON SYS.DBMS_XMLGEN TO dms_user;
```

## 將 Oracle 資料庫設定為 的目標 AWS Database Migration Service
<a name="CHAP_Target.Oracle.Configuration"></a>

使用 Oracle 資料庫做為資料遷移目標之前，您必須提供 Oracle 使用者帳戶 AWS DMS。此使用者帳戶必須擁有 Oracle 資料庫的讀取/寫入權限，如[使用 Oracle 做為目標所需之使用者帳戶權限](#CHAP_Target.Oracle.Privileges)一節所指定。

## 使用 Oracle 做為 目標時的端點設定 AWS DMS
<a name="CHAP_Target.Oracle.ConnectionAttrib"></a>

您可以使用端點設定來設定您的 Oracle 目標資料庫，類似於使用額外的連線屬性。當您使用 AWS DMS 主控台或使用 中的 `create-endpoint`命令搭配 `--oracle-settings '{"EndpointSetting": "value", ...}'` JSON 語法來建立目標端點時[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)，您可以指定設定。

下列資料表顯示您可搭配 Oracle 做為目標使用的端點設定。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.Oracle.html)

## Oracle 的目標資料類型
<a name="CHAP_Target.Oracle.DataTypes"></a>

搭配 使用的目標 Oracle 資料庫 AWS DMS 支援大多數 Oracle 資料類型。下表顯示使用 時支援的 Oracle 目標資料類型， AWS DMS 以及來自 AWS DMS 資料類型的預設映射。如需如何檢視從來源映射的資料類型詳細資訊，請參閱您要使用的來源一節。


|  AWS DMS 資料類型  |  Oracle 資料類型  | 
| --- | --- | 
|  BOOLEAN  |  NUMBER (1)  | 
|  BYTES  |  RAW (長度)  | 
|  DATE  |  DATETIME  | 
|  TIME  | TIMESTAMP (0) | 
|  DATETIME  |  TIMESTAMP (擴展)  | 
|  INT1  | NUMBER (3) | 
|  INT2  |  NUMBER (5)  | 
|  INT4  | NUMBER (10) | 
|  INT8  |  NUMBER (19)  | 
|  NUMERIC  |  NUMBER (p,s)  | 
|  REAL4  |  FLOAT  | 
|  REAL8  | FLOAT | 
|  STRING  |  使用日期指示：DATE  使用時間指示：TIMESTAMP  使用時間戳記指示：TIMESTAMP  使用 timestamp\$1with\$1timezone 指示：TIMESTAMP WITH TIMEZONE  使用 timestamp\$1with\$1local\$1timezone 指示：TIMESTAMP WITH LOCAL TIMEZONE 使用 interval\$1year\$1to\$1month 指示：INTERVAL YEAR TO MONTH  使用 interval\$1day\$1to\$1second 指示：INTERVAL DAY TO SECOND  如果長度 > 4000：CLOB 所有其他案例：VARCHAR2 (長度)  | 
|  UINT1  |  NUMBER (3)  | 
|  UINT2  |  NUMBER (5)  | 
|  UINT4  |  NUMBER (10)  | 
|  UINT8  |  NUMBER (19)  | 
|  WSTRING  |  如果長度 > 2000：NCLOB 所有其他案例：NVARCHAR2 (長度)  | 
|  BLOB  |  BLOB 若要搭配 使用此資料類型 AWS DMS，您必須針對特定任務啟用 BLOBs。只有包含主索引鍵的資料表支援 BLOB 資料類型  | 
|  CLOB  |  CLOB 若要搭配 使用此資料類型 AWS DMS，您必須針對特定任務啟用 CLOBs 的使用。在變更資料擷取 (CDC) 期間，只有包含主索引鍵的資料表支援 CLOB 資料類型。 STRING 來源上宣告大小大於 4000 個位元組的 Oracle VARCHAR2 資料類型會透過 AWS DMS CLOB 映射至 Oracle 目標上的 STRING。  | 
|  NCLOB  |  NCLOB 若要搭配 使用此資料類型 AWS DMS，您必須針對特定任務啟用 NCLOBs的使用。在 CDC 期間，只有包含主索引鍵的資料表支援 NCLOB 資料類型。 WSTRING 來源上宣告大小大於 4000 個位元組的 Oracle VARCHAR2 資料類型會透過 AWS DMS NCLOB 映射至 Oracle 目標上的 WSTRING。  | 
| XMLTYPE |  XMLTYPE 目標資料類型僅在 Oracle 到 Oracle 的複寫任務中相關。 當來源資料庫是 Oracle 時，來源資料類型會按「原狀」複寫到 Oracle 目標。例如，來源的 XMLTYPE 資料類型會建立為目標的 XMLTYPE 資料類型。  | 

# 使用 Microsoft SQL Server 資料庫做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.SQLServer"></a>

您可以使用 將資料遷移至 Microsoft SQL Server 資料庫 AWS DMS。使用 SQL Server 資料庫做為目標，您可以遷移其他 SQL Server 資料庫或其他受支援資料庫的資料。

如需 AWS DMS 支援做為目標之 SQL Server 版本的資訊，請參閱 [的目標 AWS DMS](CHAP_Introduction.Targets.md)。

AWS DMS 支援企業、標準、工作群組和開發人員的現場部署和 Amazon RDS 版本。

如需使用 AWS DMS 和 SQL Server 目標資料庫的其他詳細資訊，請參閱以下內容。

**Topics**
+ [使用 SQL Server 做為 目標的限制 AWS Database Migration Service](#CHAP_Target.SQLServer.Limitations)
+ [使用 SQL Server 做為 目標時的安全需求 AWS Database Migration Service](#CHAP_Target.SQLServer.Security)
+ [使用 SQL Server 做為 目標時的端點設定 AWS DMS](#CHAP_Target.SQLServer.ConnectionAttrib)
+ [Microsoft SQL Server 的目標資料類型](#CHAP_Target.SQLServer.DataTypes)

## 使用 SQL Server 做為 目標的限制 AWS Database Migration Service
<a name="CHAP_Target.SQLServer.Limitations"></a>

使用 SQL Server 資料庫做為 AWS DMS目標時有下列限制：
+ 當您手動建立附計算資料行的 SQL Server 目標資料表時，使用 BCP 大量複製公用程式時不支援完全載入複寫。若要使用完全載入複寫，請在端點上設定額外連線屬性 (ECA) `'useBCPFullLoad=false'` 以停用 BCP 載入。如需在端點上設定 ECA 的相關資訊，請參閱 [來源與目標端點](CHAP_Endpoints.Creating.md)。如需使用 BCP 的詳細資訊，請參閱 [Microsoft SQL Server 文件](https://docs.microsoft.com/en-us/sql/relational-databases/import-export/import-and-export-bulk-data-by-using-the-bcp-utility-sql-server)。
+ 使用 SQL Server 空間資料類型 (GEOMETRY 和 GEOGRAPHY) 複寫資料表時， 會 AWS DMS 取代您使用預設 SRID 插入的任何空間參考識別碼 (SRID)。GEOMETRY 的預設 SRID 為 0，而 GEOGRAPHY 的預設 SRID 為 4326。
+ 不支援暫時資料表。如果目標上的暫時資料表是以手動方式建立，則遷移這些資料表可能要在交易套用模式中使用僅複寫任務。
+ 目前 PostgreSQL 來源中的 `boolean` 資料類型會以具有不一致值的 `bit` 資料類型形式，移轉至 SQLServer 目標。

  若要解決這項問題，請執行下列動作：
  + 使用資料欄的`VARCHAR(1)`資料類型預先建立資料表 （或讓 AWS DMS 建立資料表）。然後讓下游處理將「F」視為 False，將「T」視為 True。
  + 若要避免變更下游處理，請將轉換規則新增至任務以將「F」值變更為「0」、將「T」值變更為 1，並將這些值儲存為 SQL Server 位元資料類型。
+ AWS DMS 不支援變更處理以設定資料欄 nullability （使用 `ALTER COLUMN [SET|DROP] NOT NULL`子句搭配 `ALTER TABLE` 陳述式）。
+ 不支援 Windows 驗證。

## 使用 SQL Server 做為 目標時的安全需求 AWS Database Migration Service
<a name="CHAP_Target.SQLServer.Security"></a>

以下說明 AWS DMS 搭配 Microsoft SQL Server 目標使用 的安全需求：
+  AWS DMS 使用者帳戶必須至少在您連線的 SQL Server 資料庫上具有`db_owner`使用者角色。
+ SQL Server 系統管理員必須向所有 AWS DMS 使用者帳戶提供此許可。

## 使用 SQL Server 做為 目標時的端點設定 AWS DMS
<a name="CHAP_Target.SQLServer.ConnectionAttrib"></a>

您可以使用端點設定來設定您的 SQL Server 目標，類似於使用額外的連線屬性。當您使用 AWS DMS 主控台或使用 中的 `create-endpoint`命令搭配 `--microsoft-sql-server-settings '{"EndpointSetting": "value", ...}'` JSON 語法來建立目標端點時[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)，您可以指定設定。

下列資料表顯示您可搭配 SQL Server 作為目標使用的端點設定。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.SQLServer.html)

## Microsoft SQL Server 的目標資料類型
<a name="CHAP_Target.SQLServer.DataTypes"></a>

下表顯示使用 時支援的 Microsoft SQL Server 目標資料類型， AWS DMS 以及來自 AWS DMS 資料類型的預設映射。如需 AWS DMS 資料類型的詳細資訊，請參閱 [AWS Database Migration Service 的資料類型](CHAP_Reference.DataTypes.md)。


|  AWS DMS 資料類型  |  SQL Server 資料類型  | 
| --- | --- | 
|  BOOLEAN  |  TINYINT  | 
|  BYTES  |  VARBINARY (長度)  | 
|  DATE  |  SQL Server 2008 和更新版本請使用 DATE。 舊版且若擴展等於或小於 3 請使用 DATETIME。所有其他案例請使用 VARCHAR (37)。  | 
|  TIME  |  SQL Server 2008 和更新版本請使用 DATETIME2 (%d)。 舊版且若擴展等於或小於 3 請使用 DATETIME。所有其他案例請使用 VARCHAR (37)。  | 
|  DATETIME  |  SQL Server 2008 和更新版本請使用 DATETIME2 (scale)。 舊版且若擴展等於或小於 3 請使用 DATETIME。所有其他案例請使用 VARCHAR (37)。  | 
|  INT1  | SMALLINT | 
|  INT2  |  SMALLINT  | 
|  INT4  | INT | 
|  INT8  |  BIGINT  | 
|  NUMERIC  |  NUMERIC (p,s)  | 
|  REAL4  |  REAL  | 
|  REAL8  | FLOAT | 
|  STRING  |  如果資料行是日期或時間資料行，請執行下列動作： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.SQLServer.html) 如果資料行不是日期或時間資料行，請使用 VARCHAR (長度)。  | 
|  UINT1  |  TINYINT  | 
|  UINT2  |  SMALLINT  | 
|  UINT4  |  INT  | 
|  UINT8  |  BIGINT  | 
|  WSTRING  |  NVARCHAR (長度)  | 
|  BLOB  |  VARBINARY(max) IMAGE 若要搭配 使用此資料類型 AWS DMS，您必須針對特定任務啟用 BLOBs 的使用。 僅在包含主索引鍵的資料表中 AWS DMS 支援 BLOB 資料類型。  | 
|  CLOB  |  VARCHAR(max) 若要搭配 使用此資料類型 AWS DMS，您必須針對特定任務啟用 CLOBs 的使用。在變更資料擷取 (CDC) 期間， AWS DMS 只在包含主索引鍵的資料表中支援 CLOB 資料類型。  | 
|  NCLOB  |  NVARCHAR(max) 若要搭配 使用此資料類型 AWS DMS，您必須針對特定任務啟用 NCLOBs的使用。在 CDC 期間， 僅在包含主索引鍵的資料表中 AWS DMS 支援 NCLOB 資料類型。  | 

# 使用 PostgreSQL 資料庫做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.PostgreSQL"></a>

您可以使用 從另一個 PostgreSQL 資料庫或其中一個其他支援的資料庫 AWS DMS，將資料遷移至 PostgreSQL 資料庫。

如需 AWS DMS 支援 做為目標之 PostgreSQL 版本的資訊，請參閱 [的目標 AWS DMS](CHAP_Introduction.Targets.md)。

**注意**  
Amazon Aurora Serverless 可作為具有 PostgreSQL 相容性的 Amazon Aurora 的目標。如需 Amazon Aurora Serverless 的詳細資訊，請參閱[《Amazon Aurora 使用者指南》中的使用 Amazon Aurora Serverless v2](https://docs.aws.amazon.com//AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.html)。 **
您只能從 Amazon VPC 存取 Aurora Serverless 資料庫叢集，且此類叢集無法使用[公有 IP 地址](https://docs.aws.amazon.com//AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.requirements.html)。[因此，如果您打算將複寫執行個體放在與 Aurora PostgreSQL Serverless 不同的區域，則必須設定 vpc 對等互連](https://docs.aws.amazon.com//dms/latest/userguide/CHAP_ReplicationInstance.VPC.html#CHAP_ReplicationInstance.VPC.Configurations.ScenarioVPCPeer)。否則，請檢查 Aurora PostgreSQL Serverless [區域](https://docs.aws.amazon.com//AmazonRDS/latest/AuroraUserGuide/Concepts.AuroraFeaturesRegionsDBEngines.grids.html#Concepts.Aurora_Fea_Regions_DB-eng.Feature.Serverless)的可用性，並決定 Aurora PostgreSQL Serverless 和複寫執行個體要共同使用其中的哪一個區域。
Babelfish 功能內建於 Amazon Aurora 之中，不會產生額外費用。如需詳細資訊，請參閱[使用 Babelfish for Aurora PostgreSQL 作為 AWS Database Migration Service的目標](#CHAP_Target.PostgreSQL.Babelfish)。

AWS DMS 在完整載入階段將資料從來源遷移至目標時， 會採取table-by-table方式。完全載入階段無法保證資料表的順序。資料表在完全載入階段不同步，同時會套用個別資料表的快取交易。因此，作用中的參考完整性限制條件會導致完全載入階段的任務失敗。

在 PostgreSQL 中，使用觸發實作外部索引鍵 (參考完整性限制條件)。在完全載入階段期間， 一次 AWS DMS 載入一個資料表。我們強烈建議您使用下列方法之一，在完全載入階段停用外部索引鍵限制條件：
+ 暫時停用執行個體的所有觸發，並完成完全載入。
+ 在 PostgreSQL 中使用 `session_replication_role` 參數。

在任何指定的時間，觸發可為下列狀態之一：`origin`、`replica`、`always` 或 `disabled`。當 `session_replication_role` 參數設為 `replica` 時，只有狀能為 `replica` 的觸發為作用中，只要呼叫就會觸發。否則，觸發會保持非作用中。

PostgreSQL 有故障安全防護裝置機制，即使設定了 `session_replication_role`，也能防止資料表被截斷。您可以用此替代方法停用觸發，以利完成完全載入執行。若要執行此作業，請將目標資料表準備模式設定為 `DO_NOTHING`。否則，當有外部索引鍵限制條件時，DROP 和 TRUNCATE 操作會失敗。

在 Amazon RDS 中，您可以控制使用參數群組設定此參數。針對在 Amazon EC2 上執行的 PostgreSQL 執行個體，您可以直接設定參數。



如需使用 PostgreSQL 資料庫做為目標的其他詳細資訊 AWS DMS，請參閱下列章節：

**Topics**
+ [使用 PostgreSQL 做為 目標的限制 AWS Database Migration Service](#CHAP_Target.PostgreSQL.Limitations)
+ [使用 Amazon Aurora PostgreSQL Limitless 做為 目標的限制 AWS Database Migration Service](#CHAP_Target.PostgreSQL.Aurora.Limitations)
+ [使用 PostgreSQL 資料庫做為 目標時的安全需求 AWS Database Migration Service](#CHAP_Target.PostgreSQL.Security)
+ [使用 PostgreSQL 做為 目標時的端點設定和額外連線屬性 (ECAs) AWS DMS](#CHAP_Target.PostgreSQL.ConnectionAttrib)
+ [PostgreSQL 的目標資料類型](#CHAP_Target.PostgreSQL.DataTypes)
+ [使用 Babelfish for Aurora PostgreSQL 做為 的目標 AWS Database Migration Service](#CHAP_Target.PostgreSQL.Babelfish)

## 使用 PostgreSQL 做為 目標的限制 AWS Database Migration Service
<a name="CHAP_Target.PostgreSQL.Limitations"></a>

使用 PostgreSQL 資料庫做為 AWS DMS目標時有下列限制：
+ 對於異質遷移，JSON 資料類型會在內部轉換為原生 CLOB 資料類型。
+ 在 Oracle 到 PostgreSQL 遷移中，如果 Oracle 中的資料欄包含 NULL 字元 （十六進位值 U\$10000)， 會將 NULL 字元 AWS DMS 轉換為空格 （十六進位值 U\$10020)。這是因 PostgreSQL 限制所致。
+ AWS DMS 不支援複寫至具有以 coalesce 函數建立之唯一索引的資料表。
+ 如果您的資料表使用序列，請在停止來源資料庫的複寫之後，更新目標資料庫中每個序列`NEXTVAL`的 值。 會從來源資料庫 AWS DMS 複製資料，但不會在持續複寫期間將序列遷移至目標。

## 使用 Amazon Aurora PostgreSQL Limitless 做為 目標的限制 AWS Database Migration Service
<a name="CHAP_Target.PostgreSQL.Aurora.Limitations"></a>

使用 Amazon Aurora PostgreSQL Limitless 做為 的目標時，適用下列限制 AWS DMS：
+ AWS DMS 資料驗證不支援 Amazon Aurora PostgreSQL Limitless。
+ AWS DMS 會將來源資料表遷移為未分佈的標準資料表。遷移後，您可以遵循官方轉換指南，將這些標準資料表轉換為無限資料表。

## 使用 PostgreSQL 資料庫做為 目標時的安全需求 AWS Database Migration Service
<a name="CHAP_Target.PostgreSQL.Security"></a>

基於安全考量，用於資料遷移的使用者帳戶必須是您做為目標使用之任何 PostgreSQL 資料庫的註冊使用者。

您的 PostgreSQL 目標端點需要最低使用者許可才能執行 AWS DMS 遷移，請參閱下列範例。

```
    CREATE USER newuser WITH PASSWORD 'your-password';
    ALTER SCHEMA schema_name OWNER TO newuser;
```

或者

```
    GRANT USAGE ON SCHEMA schema_name TO myuser;
    GRANT CONNECT ON DATABASE postgres to myuser;
    GRANT CREATE ON DATABASE postgres TO myuser;
    GRANT CREATE ON SCHEMA schema_name TO myuser;
    GRANT UPDATE, INSERT, SELECT, DELETE, TRUNCATE ON ALL TABLES IN SCHEMA schema_name TO myuser;
    GRANT TRUNCATE ON schema_name."BasicFeed" TO myuser;
```

## 使用 PostgreSQL 做為 目標時的端點設定和額外連線屬性 (ECAs) AWS DMS
<a name="CHAP_Target.PostgreSQL.ConnectionAttrib"></a>

您可以使用端點設定和額外連線屬性 (ECAs) 來設定 PostgreSQL 目標資料庫。

當您使用 AWS DMS 主控台或使用 中的 `create-endpoint`命令搭配 `--postgre-sql-settings '{"EndpointSetting": "value", ...}'` JSON 語法來建立目標端點時[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)，您可以指定設定。

您可以使用端點的 `ExtraConnectionAttributes` 參數來指定 ECAs。

下列資料表顯示您可搭配 PostgreSQL 做為目標使用的端點設定。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.PostgreSQL.html)

## PostgreSQL 的目標資料類型
<a name="CHAP_Target.PostgreSQL.DataTypes"></a>

的 PostgreSQL 資料庫端點 AWS DMS 支援大多數 PostgreSQL 資料庫資料類型。下表顯示使用 時支援的 PostgreSQL 資料庫目標資料類型， AWS DMS 以及來自 AWS DMS 資料類型的預設映射。

如需 AWS DMS 資料類型的詳細資訊，請參閱 [AWS Database Migration Service 的資料類型](CHAP_Reference.DataTypes.md)。


|  AWS DMS 資料類型  |  PostgreSQL 資料類型  | 
| --- | --- | 
|  BOOLEAN  |  BOOLEAN  | 
|  BLOB  |  BYTEA  | 
|  BYTES  |  BYTEA  | 
|  DATE  |  DATE  | 
|  TIME  |  TIME  | 
|  DATETIME  |  如果擴展是從 0 到 6，則使用 TIMESTAMP。 如果擴展是從 7 到 9，則使用 VARCHAR (37)。  | 
|  INT1  |  SMALLINT  | 
|  INT2  |  SMALLINT  | 
|  INT4  |  INTEGER  | 
|  INT8  |  BIGINT  | 
|  NUMERIC   |  DECIMAL (P,S)  | 
|  REAL4  |  FLOAT4  | 
|  REAL8  |  FLOAT8  | 
|  STRING  |  如果長度是從 1 到 21,845，則使用 VARCHAR (長度為位元組)。 如果長度是從 21,846 到 2,147,483,647，則使用 VARCHAR (65535)。  | 
|  UINT1  |  SMALLINT  | 
|  UINT2  |  INTEGER  | 
|  UINT4  |  BIGINT  | 
|  UINT8  |  BIGINT  | 
|  WSTRING  |  如果長度是從 1 到 21,845，則使用 VARCHAR (長度為位元組)。 如果長度是從 21,846 到 2,147,483,647，則使用 VARCHAR (65535)。  | 
|  NCLOB  |  TEXT  | 
|  CLOB  |  TEXT  | 

**注意**  
從 PostgreSQL 來源複寫時， 會為所有資料欄 AWS DMS 建立具有相同資料類型的目標資料表，除了具有使用者定義資料類型的資料欄之外。在這種情況下，此資料類型在目標中會建立為「字元不相同」。

## 使用 Babelfish for Aurora PostgreSQL 做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.PostgreSQL.Babelfish"></a>

您可以使用 AWS Database Migration Service將 SQL 伺服器來源資料表遷移到 Babelfish for Amazon Aurora PostgreSQL 目標。透過 Babelfish，Aurora PostgreSQL 便可理解 T-SQL、Microsoft SQL 服務器的專有 SQL 方言，並支援相同的通訊協議。因此，針對 SQL Server 撰寫的應用程式現在只需較少的程式碼變更即可使用 Aurora。Babelfish 功能內建於 Amazon Aurora 之中，不會產生額外費用。您可以從 Amazon RDS 主控台啟用 Amazon Aurora 叢集上的 Babelfish。

當您使用 AWS DMS 主控台、API 或 CLI 命令建立 AWS DMS 目標端點時，請將目標引擎指定為 **Amazon Aurora PostgreSQL**，並將資料庫命名為 **babelfish\$1db**。在**端點設定**區段中，新增設定以將 `DatabaseMode` 設定為 `Babelfish`，並將 `BabelfishDatabaseName` 設定為目標 Babelfish T-SQL 資料庫的名稱。

### 將轉換規則新增至遷移任務
<a name="CHAP_Target.PostgreSQL.Babelfish.transform"></a>

當您定義 Babelfish 目標的遷移任務時，必須納入轉換規則，才能確保 DMS 使用目標資料庫中預先建立的 T-SQL Babelfish 資料表。

首先，將轉換規則新增至您的遷移任務，使所有資料表名稱都變成小寫。Babelfish 會將您使用 T-SQL 建立的資料表名稱以小寫格式儲存在 PostgreSQL `pg_class` 目錄中。不過，當您有混合大小寫名稱的 SQL Server 資料表時，DMS 會使用 PostgreSQL 原生資料類型來建立資料表，而不是與 T-SQL 相容的資料類型。因此，請務必新增將所有資料表名稱都轉為小寫的轉換規則。請注意，欄名不應轉換為小寫。

接下來，如果您在定義叢集時使用了多資料庫遷移模式，請新增重新命名原始 SQL Server 結構描述的轉換規則。請務必重新命名 SQL Server 結構描述名稱，以便包含 T-SQL 資料庫的名稱。例如，如果原始 SQL Server 結構描述名稱為 dbo，而您的 T-SQL 資料庫名稱為 mydb，請使用轉換規則將結構描述重新命名為 mydb\$1dbo。

**注意**  
使用 Babelfish for Aurora PostgreSQL 16 或更新版本時，預設遷移模式為「mutidatabase」。執行 DMS 遷移任務時，請務必檢閱遷移模式參數，並視需要更新轉換規則。

如果您使用單一資料庫模式，則不需要轉換規則來重新命名結構描述名稱。結構描述名稱與 Babelfish 中的目標 T-SQL 資料庫具有一對一的映射。

下列範例轉換規則會將所有資料表名稱設為小寫，並將原始 SQL Server 結構描述名稱從 `dbo` 重新命名為 `mydb_dbo`。

```
{
   "rules": [
   {
      "rule-type": "transformation",
      "rule-id": "566251737",
      "rule-name": "566251737",
      "rule-target": "schema",
      "object-locator": {
         "schema-name": "dbo"
      },
      "rule-action": "rename",
      "value": "mydb_dbo",
      "old-value": null
   },
   {
      "rule-type": "transformation",
      "rule-id": "566139410",
      "rule-name": "566139410",
      "rule-target": "table",
      "object-locator": {
         "schema-name": "%",
         "table-name": "%"
      },
      "rule-action": "convert-lowercase",
      "value": null,
      "old-value": null
   },
   {
      "rule-type": "selection",
      "rule-id": "566111704",
      "rule-name": "566111704",
      "object-locator": {
         "schema-name": "dbo",
         "table-name": "%"
      },
      "rule-action": "include",
      "filters": []
   }
]
}
```

### 將 PostgreSQL 目標端點與 Babelfish 資料表搭配使用的限制
<a name="CHAP_Target.PostgreSQL.Babelfish.limitations"></a>

將 PostgreSQL 目標端點與 Babelfish 資料表搭配使用時，將適用下列限制：
+ 對於**目標資料表準備**模式，請僅使用**不執行任何操作**或**截斷**模式。請勿使用**刪除目標中的資料表**模式。在該模式下，DMS 會將資料表建立為 T-SQL 可能無法辨識的 PostgreSQL 資料表。
+ AWS DMS 不支援 sql\$1variant 資料類型。
+ Postgres 端點下的 Babelfish 不支援 `HEIRARCHYID`、 `GEOMETRY`(3.5.4 之前） 和 `GEOGRAPHY`(3.5.4 之前） 資料類型。若要遷移這些資料類型，您可以新增轉換規則，將資料類型轉換為 wstring(250)。
+ Babelfish 僅支援使用 `BYTEA` 資料類型來遷移 `BINARY`、`VARBINARY` 和 `IMAGE` 資料類型。對於舊版的 Aurora PostgreSQL，您可以使用 DMS 將這些資料表遷移到 [Babelfish 目標端點](CHAP_Target.Babelfish.md)。您不必指定 `BYTEA` 資料類型的長度，如下列範例所示。

  ```
  [Picture] [VARBINARY](max) NULL
  ```

  將先前的 T-SQL 資料類型變更為 T-SQL 支援的 `BYTEA` 資料類型。

  ```
  [Picture] BYTEA NULL
  ```
+ 對於舊版的 Aurora PostgreSQL Babelfish，如果您使用 PostgreSQL 目標端點建立遷移任務，以從 SQL 伺服器進行中複寫到 Babelfish，則需要將 `SERIAL` 資料類型指派給任何使用 `IDENTITY` 欄的資料表。從 Aurora PostgreSQL (版本 15.3/14.8 及更新版本) 和 Babelfish (3.2.0 及更新版本) 開始可支援身分資料欄，並且不再需要指派 SERIAL 資料類型。如需詳細資訊，請參閱《*SQL Server 至 Aurora PostgreSQL 遷移操作手冊*》中「序列和身分」一節中的「[SERIAL 使用方法](https://docs.aws.amazon.com/dms/latest/sql-server-to-aurora-postgresql-migration-playbook/chap-sql-server-aurora-pg.tsql.sequences..html)」。然後，當您在 Babelfish 中建立資料表時，請從以下內容更改資料欄定義。

  ```
      [IDCol] [INT] IDENTITY(1,1) NOT NULL PRIMARY KEY
  ```

  將先前內容變更為下列內容。

  ```
      [IDCol] SERIAL PRIMARY KEY
  ```

  與 Babelfish 相容的 Aurora PostgreSQL 會使用預設組態建立序列，並將 `NOT NULL` 限制條件新增至資料欄。新建立的序列行為類似於一般序列 (以 1 遞增)，且沒有複合 `SERIAL` 選項。
+ 遷移包含使用 `IDENTITY` 資料欄或 `SERIAL` 資料類型的資料表資料後，請根據資料欄的最大值重設 PostgreSQL 型序列物件。執行資料表的完全載入後，請使用下列 T-SQL 查詢產生陳述式以植入相關聯的序列物件。

  ```
  DECLARE @schema_prefix NVARCHAR(200) = ''
  
  IF current_setting('babelfishpg_tsql.migration_mode') = 'multi-db'
          SET @schema_prefix = db_name() + '_'
  
  SELECT 'SELECT setval(pg_get_serial_sequence(''' + @schema_prefix + schema_name(tables.schema_id) + '.' + tables.name + ''', ''' + columns.name + ''')
                 ,(select max(' + columns.name + ') from ' + schema_name(tables.schema_id) + '.' + tables.name + '));'
  FROM sys.tables tables
  JOIN sys.columns columns ON tables.object_id = columns.object_id
  WHERE columns.is_identity = 1
  
  UNION ALL
  
  SELECT 'SELECT setval(pg_get_serial_sequence(''' + @schema_prefix + table_schema + '.' + table_name + ''', 
  ''' + column_name + '''),(select max(' + column_name + ') from ' + table_schema + '.' + table_name + '));'
  FROM information_schema.columns
  WHERE column_default LIKE 'nextval(%';
  ```

  查詢會產生一系列 SELECT 陳述式，您可以執行這些陳述式來更新 IDENTITY 值和 SERIAL 值的上限。
+ 對於 3.2 版本之前的 Babelfish，**完整 LOB 模式**可能會導致資料表錯誤。如果發生這種情況，請為無法載入的資料表建立個別任務。接著使用**有限 LOB 模式**，為 **LOB 大小上限 (KB)** 指定適當的值。另一個選項是設定 SQL Server 端點連線屬性設定 `ForceFullLob=True`。
+ 對於 3.2 版本之前的 Babelfish，透過非使用整數型主索引鍵的 Babelfish 資料表執行資料驗證會產生一則訊息，表示找不到合適的唯一索引鍵。從 Aurora PostgreSQL (版本 15.3/14.8 及更新版本) 和 Babelfish (版本 3.2.0 及更新版本) 開始，支援非整數型主索引鍵的資料驗證。
+ 由於秒的小數位數精確度差異，DMS 會針對使用 `DATETIME` 資料類型的 Babelfish 資料表報告資料驗證失敗。若要隱藏這些失敗，您可以針對 `DATETIME` 資料類型新增下列驗證規則類型。

  ```
  {
           "rule-type": "validation",
           "rule-id": "3",
           "rule-name": "3",
           "rule-target": "column",
           "object-locator": {
               "schema-name": "dbo",
               "table-name": "%",
               "column-name": "%",
               "data-type": "datetime"
           },
           "rule-action": "override-validation-function",
           "source-function": "case when ${column-name} is NULL then NULL else 0 end",
           "target-function": "case when ${column-name} is NULL then NULL else 0 end"
       }
  ```

# 使用 MySQL 相容資料庫做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.MySQL"></a>

您可以從 AWS DMS 支援的任何來源資料引擎 AWS DMS，使用 將資料遷移至任何 MySQL 相容資料庫。如果您要遷移至內部部署 MySQL 相容資料庫，則 AWS DMS 需要您的來源引擎位於 AWS 生態系統中。引擎可以採用 AWS受管服務，例如 Amazon RDS、Amazon Aurora 或 Amazon S3。或者，引擎可以在 Amazon EC2 的自我管理資料庫中。

您可以使用 SSL 加密您 MySQL 相容端點與複寫執行個體之間的連線。如需在與 MySQL 相容之端點使用 SSL 的詳細資訊，請參閱[搭配 使用 SSL AWS Database Migration Service](CHAP_Security.SSL.md)。

如需 AWS DMS 支援做為目標的 MySQL 版本資訊，請參閱 [的目標 AWS DMS](CHAP_Introduction.Targets.md)。

您可以使用下列 MySQL 相容資料庫做為 的目標 AWS DMS：
+ MySQL Community Edition
+ MySQL Standard Edition
+ MySQL Enterprise Edition
+ MySQL Cluster Carrier Grade Edition
+ MariaDB Community Edition
+ MariaDB Enterprise Edition
+ MariaDB 資料行存放區
+ Amazon Aurora MySQL

**注意**  
根據預設，無論來源儲存引擎為何 (MyISAM、MEMORY 等等)， AWS DMS 會建立與 MySQL 相容的目標資料表做為 InnoDB 表。  
如果您在 InnoDB 外還需要一份儲存引擎中的資料表，您可以在與 MySQL 相容的目標中手動建立資料表，並使用 **Do nothing (不執行任何動作)** 選項遷移資料表。如需詳細資訊，請參閱[完全載入任務設定](CHAP_Tasks.CustomizingTasks.TaskSettings.FullLoad.md)。

如需使用與 MySQL 相容之資料庫做為 AWS DMS目標的其他詳細資訊，請參閱以下各節。

**Topics**
+ [使用任何 MySQL 相容資料庫做為 的目標 AWS Database Migration Service](#CHAP_Target.MySQL.Prerequisites)
+ [使用 MySQL 相容資料庫做為 目標的限制 AWS Database Migration Service](#CHAP_Target.MySQL.Limitations)
+ [使用 MySQL 相容資料庫做為 目標時的端點設定 AWS DMS](#CHAP_Target.MySQL.ConnectionAttrib)
+ [MySQL 的目標資料類型](#CHAP_Target.MySQL.DataTypes)

## 使用任何 MySQL 相容資料庫做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.MySQL.Prerequisites"></a>

開始使用與 MySQL 相容之資料庫做為 AWS DMS的目標之前，請務必完成以下事前準備：
+ 將具有 MySQL 相容資料庫讀取/寫入權限 AWS DMS 的使用者帳戶提供給 。若要建立必要的權限，請執行下列命令。

  ```
  CREATE USER '<user acct>'@'%' IDENTIFIED BY '<user password>';
  GRANT ALTER, CREATE, DROP, INDEX, INSERT, UPDATE, DELETE, SELECT, CREATE TEMPORARY TABLES  ON <schema>.* TO 
  '<user acct>'@'%';
  GRANT ALL PRIVILEGES ON awsdms_control.* TO '<user acct>'@'%';
  ```
+ 在完全載入遷移階段，您必須停用您目標資料表的外部索引鍵。若要在完全載入期間停用 MySQL 相容資料庫上的外部金鑰檢查，您可以將下列命令新增至目標端點 AWS DMS 主控台**的額外連線屬性**區段。

  ```
  Initstmt=SET FOREIGN_KEY_CHECKS=0;
  ```
+ 設定資料庫參數 `local_infile = 1` 以讓 AWS DMS 將資料載入目標資料庫。
+ 如果您使用 MySQL 特定的預遷移評估，請授予下列權限。

  ```
  grant select on mysql.user to <dms_user>;
  grant select on mysql.db to <dms_user>;
  grant select on mysql.tables_priv to <dms_user>;
  grant select on mysql.role_edges to <dms_user>  #only for MySQL version 8.0.11 and higher
  ```

## 使用 MySQL 相容資料庫做為 目標的限制 AWS Database Migration Service
<a name="CHAP_Target.MySQL.Limitations"></a>

使用 MySQL 資料庫做為目標時， AWS DMS 不支援下列項目：
+ 資料定義語言 (DDL) 陳述式 TRUNCATE PARTITION、DROP TABLE 和 RENAME TABLE。
+ 使用 `ALTER TABLE table_name ADD COLUMN column_name` 陳述式將資料欄新增至資料表的開頭或中間。
+ 在完全載入任務中將資料載入至 MySQL 相容目標時， AWS DMS 不會報告任務日誌中的限制條件所造成的錯誤，這可能會導致重複的金鑰錯誤或與記錄數量不相符。這是由 MySQL 使用 `LOAD DATA` 命令處理本機資料的方式所引起。在完全載入階段，請務必執行下列操作：
  + 停用限制
  + 使用 AWS DMS 驗證來確保資料一致。
+ 當您將資料行值更新為現有的值時，與 MySQL 相容的資料庫會傳回 `0 rows affected` 警告。雖然在技術上此行為不算錯誤，但這和其他資料庫引擎處理此情況的方法不同。例如，Oracle 會執行一個資料列的更新。對於與 MySQL 相容的資料庫， 會在 awsdms\$1apply\$1exceptions 控制資料表中 AWS DMS 產生項目，並記錄下列警告。

  ```
  Some changes from the source database had no impact when applied to
  the target database. See awsdms_apply_exceptions table for details.
  ```
+ Aurora Serverless 可作為 Amazon Aurora 第 2 版的目標 (與 MySQL 5.7 版相容)。(選取 Aurora MySQL 2.07.1 版，以便使用與 MySQL 5.7 相容的 Aurora Serverless。) 如需 Aurora Serverless 的詳細資訊，請參閱《*Amazon* [Aurora 使用者指南》中的使用 Aurora Serverless v2](https://docs.aws.amazon.com//AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.html)。
+ AWS DMS 不支援使用 Aurora 或 Amazon RDS 的讀取器端點，除非執行個體處於可寫入模式，也就是 `read_only`和 `innodb_read_only` 參數設定為 `0`或 `OFF`。如需有關使用 Amazon RDS 和 Aurora 作為目標的詳細資訊，請參閱下列內容：
  +  [判斷您連接的資料庫執行個體](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.BestPractices.html#AuroraMySQL.BestPractices.DeterminePrimaryInstanceConnection) 
  +  [使用 MySQL 更新僅供讀取複本](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_MySQL.Replication.ReadReplicas.html#USER_MySQL.Replication.ReadReplicas.Updates) 
+ 複寫 TIME 資料類型時，不會複寫部分時間值。
+ 使用額外連線屬性 複寫 TIME 資料類型時`loadUsingCSV=false`，時間值上限為範圍 `[00:00:00, 23:59:59]`。

## 使用 MySQL 相容資料庫做為 目標時的端點設定 AWS DMS
<a name="CHAP_Target.MySQL.ConnectionAttrib"></a>

您可以使用端點設定來設定 MySQL 相容目標資料庫，類似於使用額外的連線屬性。當您使用 AWS DMS 主控台或使用 中的 `create-endpoint`命令搭配 `--my-sql-settings '{"EndpointSetting": "value", ...}'` JSON 語法來建立目標端點時[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)，您可以指定設定。

下列資料表顯示您可以在將 MySQL 作為目標搭配使用的端點設定。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.MySQL.html)

您也可以使用額外連線屬性設定 MySQL 相容目標資料庫。

下表顯示以 MySQL 作為目標時可使用的額外連線屬性。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.MySQL.html)

或者，您可以使用 `--my-sql-settings` 命令的 `AfterConnectScript` 參數，來停用外部索引鍵檢查，並指定資料庫的時區。

## MySQL 的目標資料類型
<a name="CHAP_Target.MySQL.DataTypes"></a>

下表顯示使用 時支援的 MySQL 資料庫目標資料類型， AWS DMS 以及來自 AWS DMS 資料類型的預設映射。

如需 AWS DMS 資料類型的詳細資訊，請參閱 [AWS Database Migration Service 的資料類型](CHAP_Reference.DataTypes.md)。


|  AWS DMS 資料類型  |  MySQL 資料類型  | 
| --- | --- | 
|  BOOLEAN  |  BOOLEAN  | 
|  BYTES  |  如果長度是從 1 到 65,535，則使用 VARBINARY (長度)。 如果長度是從 65,536 到 2,147,483,647，則使用 LONGLOB。  | 
|  DATE  |  DATE  | 
|  TIME  |  TIME  | 
|  TIMESTAMP  |  「如果擴展 => 0 且 =< 6，則：DATETIME (擴展) 如果擴展 => 7 且 =< 9，則：VARCHAR (37)」  | 
|  INT1  |  TINYINT  | 
|  INT2  |  SMALLINT  | 
|  INT4  |  INTEGER  | 
|  INT8  |  BIGINT  | 
|  NUMERIC  |  DECIMAL (p,s)  | 
|  REAL4  |  FLOAT  | 
|  REAL8  |  DOUBLE PRECISION  | 
|  STRING  |  如果長度是從 1 到 21,845，則使用 VARCHAR (長度)。 如果長度是從 21,846 到 2,147,483,647，則使用 LONGTEXT。  | 
|  UINT1  |  UNSIGNED TINYINT  | 
|  UINT2  |  UNSIGNED SMALLINT  | 
|  UINT4  |  UNSIGNED INTEGER  | 
|  UINT8  |  UNSIGNED BIGINT  | 
|  WSTRING  |  如果長度是從 1 到 32,767，則使用 VARCHAR (長度)。 如果長度是從 32,768 到 2,147,483,647，則使用 LONGTEXT。  | 
|  BLOB  |  如果長度是從 1 到 65,535，則使用 BLOB。 如果長度是從 65,536 到 2,147,483,647，則使用 LONGBLOB。 如果長度為 0，則使用 LONGBLOB (完整的 LOB 支援)。  | 
|  NCLOB  |  如果長度是從 1 到 65,535，則使用 TEXT。 如果長度是從 65,536 到 2,147,483,647，則使用 LONGTEXT 加適用於 CHARACTER SET 的 ucs2。 如果長度為 0，則使用 LONGTEXT (完整 LOB 支援) 加適用於 CHARACTER SET 的 ucs2。  | 
|  CLOB  |  如果長度是從 1 到 65,535，則使用 TEXT。 如果長度是從 65,536 到 2147483647，則使用 LONGTEXT。 如果長度為 0，則使用 LONGTEXT (完整的 LOB 支援)。  | 

# 使用 Amazon Redshift 資料庫做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.Redshift"></a>

您可以使用 將資料遷移至 Amazon Redshift 資料庫 AWS Database Migration Service。Amazon Redshift 是一種在雲端中完全受管的 PB 級資料倉儲服務。您可以從任何受支援的來源資料庫，將資料遷移到作為目標的 Amazon Redshift 資料庫。

您可以使用 Amazon Redshift Serverless 做為目標 AWS DMS。如需詳細資訊，請參閱下列 [使用 AWS DMS 搭配 Amazon Redshift Serverless 做為目標Amazon Redshift Serverless](#CHAP_Target.Redshift.RSServerless)。

 Amazon Redshift 叢集必須與複寫執行個體位於相同的 AWS 帳戶和 AWS 區域。

在資料庫遷移至 Amazon Redshift 期間， AWS DMS 會先將資料移至 Amazon S3 儲存貯體。當檔案位於 Amazon S3 儲存貯體時， AWS DMS 然後將它們傳輸到 Amazon Redshift 資料倉儲中的適當資料表。 會在與 Amazon Redshift 資料庫相同的 AWS 區域中 AWS DMS 建立 S3 儲存貯體。 AWS DMS 複寫執行個體必須位於相同的 AWS 區域 。

如果您使用 AWS CLI 或 DMS API 將資料遷移至 Amazon Redshift，請設定 AWS Identity and Access Management (IAM) 角色以允許 S3 存取。如需建立此 IAM 角色的詳細資訊，請參閱[建立要與 搭配使用的 IAM 角色 AWS DMS](security-iam.md#CHAP_Security.APIRole)。

Amazon Redshift 端點提供以下作業的全自動化：
+ 產生結構描述與映射資料類型
+ 完全載入來源資料庫資料表
+ 變更來源資料表的增量載入
+ 在來源資料表中套用資料定義語言 (DDL) 的結構描述變更
+ 同步完全載入和變更資料擷取 (CDC) 程序。

AWS Database Migration Service 同時支援完全載入和變更處理操作。 會從來源資料庫 AWS DMS 讀取資料，並建立一系列逗號分隔值 (.csv) 檔案。對於完全載入操作， 會為每個資料表 AWS DMS 建立檔案。 AWS DMS 然後， 會將每個資料表的資料表檔案複製到 Amazon S3 中的個別資料夾。當檔案上傳至 Amazon S3 時， AWS DMS 會傳送複製命令，並將檔案中的資料複製到 Amazon Redshift。對於變更處理操作， 會將淨變更 AWS DMS 複製到 .csv 檔案。 AWS DMS 然後， 會將淨變更檔案上傳至 Amazon S3，並將資料複製到 Amazon Redshift。

如需使用 Amazon Redshift 做為目標的其他詳細資訊 AWS DMS，請參閱下列章節：

**Topics**
+ [使用 Amazon Redshift 資料庫做為 目標的先決條件 AWS Database Migration Service](#CHAP_Target.Redshift.Prerequisites)
+ [使用 Redshift 作為目標所需的權限](#CHAP_Target.Redshift.Privileges)
+ [使用 Amazon Redshift 做為 目標的限制 AWS Database Migration Service](#CHAP_Target.Redshift.Limitations)
+ [將 Amazon Redshift 資料庫設定為 的目標 AWS Database Migration Service](#CHAP_Target.Redshift.Configuration)
+ [使用增強型 VPC 路由搭配 Amazon Redshift 做為 的目標 AWS Database Migration Service](#CHAP_Target.Redshift.EnhancedVPC)
+ [建立和使用 AWS KMS 金鑰來加密 Amazon Redshift 目標資料](#CHAP_Target.Redshift.KMSKeys)
+ [使用 Amazon Redshift 做為 目標時的端點設定 AWS DMS](#CHAP_Target.Redshift.ConnectionAttrib)
+ [使用資料加密金鑰和 Amazon S3 儲存貯體做為中繼儲存體](#CHAP_Target.Redshift.EndpointSettings)
+ [Amazon Redshift 的多執行緒任務設定](#CHAP_Target.Redshift.ParallelApply)
+ [Amazon Redshift 的目標資料類型](#CHAP_Target.Redshift.DataTypes)
+ [使用 AWS DMS 搭配 Amazon Redshift Serverless 做為目標](#CHAP_Target.Redshift.RSServerless)

## 使用 Amazon Redshift 資料庫做為 目標的先決條件 AWS Database Migration Service
<a name="CHAP_Target.Redshift.Prerequisites"></a>

以下清單說明使用 Amazon Redshift 作為資料遷移目標的必要事前準備：
+ 使用 AWS 管理主控台啟動 Amazon Redshift 叢集。請注意有關 AWS 您的帳戶和 Amazon Redshift 叢集的基本資訊，例如您的密碼、使用者名稱和資料庫名稱。建立 Amazon Redshift 目標端點時，您需要這些值。
+ Amazon Redshift 叢集必須位於與複寫執行個體相同的 AWS 帳戶和相同 AWS 區域。
+  AWS DMS 複寫執行個體需要連線至叢集使用的 Amazon Redshift 端點 （主機名稱和連接埠）。
+ AWS DMS 使用 Amazon S3 儲存貯體將資料傳輸到 Amazon Redshift 資料庫。為使 AWS DMS 能建立儲存貯體，主控台使用 IAM 角色，`dms-access-for-endpoint`。如果您使用 AWS CLI 或 DMS API 以 Amazon Redshift 做為目標資料庫建立資料庫遷移，則必須建立此 IAM 角色。如需建立此角色的詳細資訊，請參閱[建立要與 搭配使用的 IAM 角色 AWS DMS](security-iam.md#CHAP_Security.APIRole)。
+ AWS DMS 會將 BLOBs、CLOBs 和 NCLOBs 轉換為目標 Amazon Redshift 執行個體上的 VARCHAR。Amazon Redshift 不支援大於 64 KB 的 VARCHAR 資料類型，因此您無法在 Amazon Redshift 上存放傳統 LOBs。
+ 將目標中繼資料任務設定 [BatchApplyEnabled](CHAP_Tasks.CustomizingTasks.TaskSettings.ChangeProcessingTuning.md) 設為 `true`，以讓 AWS DMS 在 CDC 期間處理 Amazon Redshift 目標資料表的變更。來源和目標資料表上的主索引鍵皆為必填。在沒有主索引鍵的情況下，會依陳述式逐一套用變更。此外，這會導致目標延遲並影響叢集遞交佇列，在 CDC 期間對任務效能造成負面影響。
+ 在 Redshift 的資料表上啟用資料列層級安全性時，您必須將適當的許可授予所有 DMS 使用者。

## 使用 Redshift 作為目標所需的權限
<a name="CHAP_Target.Redshift.Privileges"></a>

使用 GRANT 命令定義使用者或使用者群組的存取權限。權限包括存取選項，例如能夠讀取資料表和檢視中的資料、寫入資料及建立資料表。如需將 GRANT 搭配 Amazon Redshift 使用的詳細資訊，請參閱《*Amazon Redshift 資料庫開發人員*》指南中的「[GRANT](https://docs.aws.amazon.com//redshift/latest/dg/r_GRANT.html)」。

以下是為 Amazon Redshift 資料表和檢視上的資料表、資料庫、結構描述、函數、程序或語言層級權限授與特定權限的語法。

```
GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES } [,...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO { username [ WITH GRANT OPTION ] | GROUP group_name | PUBLIC } [, ...]

GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE db_name [, ...]
    TO { username [ WITH GRANT OPTION ] | GROUP group_name | PUBLIC } [, ...]

GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO { username [ WITH GRANT OPTION ] | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { FUNCTION function_name ( [ [ argname ] argtype [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
    TO { username [ WITH GRANT OPTION ] | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { PROCEDURE procedure_name ( [ [ argname ] argtype [, ...] ] ) [, ...] | ALL PROCEDURES IN SCHEMA schema_name [, ...] }
    TO { username [ WITH GRANT OPTION ] | GROUP group_name | PUBLIC } [, ...]

GRANT USAGE 
    ON LANGUAGE language_name [, ...]
    TO { username [ WITH GRANT OPTION ] | GROUP group_name | PUBLIC } [, ...]
```

下列語法適用於 Amazon Redshift 資料表和檢視上的資料欄層級權限。

```
GRANT { { SELECT | UPDATE } ( column_name [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( column_name [,...] ) }
     ON { [ TABLE ] table_name [, ...] }
     TO { username | GROUP group_name | PUBLIC } [, ...]
```

以下語法可將 ASSUMEROLE 權限授與具有指定角色的使用者和群組。

```
GRANT ASSUMEROLE
    ON { 'iam_role' [, ...] | ALL }
    TO { username | GROUP group_name | PUBLIC } [, ...]
    FOR { ALL | COPY | UNLOAD } [, ...]
```

## 使用 Amazon Redshift 做為 目標的限制 AWS Database Migration Service
<a name="CHAP_Target.Redshift.Limitations"></a>

使用 Amazon Redshift 資料庫作為目標時有下列限制：
+ 請勿為當成 Amazon Redshift 目標中繼儲存區的 S3 儲存貯體啟用版本控制功能。如果您需要 S3 版本控制，請使用生命週期政策以主動刪除舊版本。否則，您可能會因 S3 `list-object` 呼叫逾時而遭遇端點測試連線失敗。若要建立 S3 儲存貯體的生命週期政策，請參閱[管理儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)。若要刪除 S3 物件的版本，請參閱[刪除啟用版本控制功能之儲存貯體中的物件](https://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingObjectVersions.html)。
+ 不支援以下 DDL：

  ```
  ALTER TABLE table name MODIFY COLUMN column name data type;
  ```
+  AWS DMS 無法遷移或複寫名稱開頭為底線 (\$1) 的結構描述變更。如果您有名稱以底線開頭的結構描述，請使用映射轉換重新命名目標上的結構描述。
+  Amazon Redshift 不支援大於 64 KB 的 VARCHAR。傳統資料庫的 LOB 無法儲存在 Amazon Redshift。
+  當任何主索引鍵欄名稱使用保留字時，不支援將 DELETE 陳述式套用至具有多欄主索引鍵的資料表。請前往[此處](https://docs.aws.amazon.com/redshift/latest/dg/r_pg_keywords.html)查看 Amazon Redshift 保留字的清單。
+ 如果來源系統對來源資料表的主索引鍵執行 UPDATE 操作，您可能會遇到效能問題。將變更套用至目標時，就會發生這些效能問題。這是因為 UPDATE (和 DELETE) 操作會依靠主索引鍵值來識別目標資料列。如果您更新來源資料表的主索引鍵，您的任務日誌會包含如下訊息：

  ```
  Update on table 1 changes PK to a PK that was previously updated in the same bulk update.
  ```
+ DMS 在為 Redshift 叢集設定端點時不支援自訂 DNS 名稱，而且您需要使用 Amazon 提供的 DNS 名稱。由於 Amazon Redshift 叢集必須與複寫執行個體位於相同的 AWS 帳戶和區域，因此如果您使用自訂 DNS 端點，驗證會失敗。
+ Amazon Redshift 具有預設的 4 小時閒置工作階段逾時。當 DMS 複寫任務中沒有任何活動時，Redshift 會在 4 小時後中斷工作階段的連線。DMS 無法連線且可能需要重新啟動時，可能會導致錯誤。作為因應措施，請針對 DMS 複寫使用者設定超過 4 小時的工作階段逾時限制。或者，請參閱《*Amazon Redshift 資料庫開發人員指南*》中有關「[ALTER USER](https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_USER.html)」的說明。
+ 當 在沒有主索引鍵或唯一索引鍵的情況下 AWS DMS 複寫來源資料表資料時，CDC 延遲可能會很高，進而產生無法接受的效能層級。
+ 從 Oracle 來源到 Redshift 目標的 CDC 複寫期間，不支援截斷分割區。
+ 重複的記錄可能會出現在目標資料表中，因為 Amazon Redshift 不會強制執行主索引鍵，且 AWS DMS 可能會在任務恢復時重播 CDC。若要防止重複，請使用 `ApplyErrorInsertPolicy=INSERT_RECORD`設定。如需詳細資訊，請參閱[錯誤處理任務設定](CHAP_Tasks.CustomizingTasks.TaskSettings.ErrorHandling.md)。或者，您可以實作應用程式層級的重複偵測和遷移後清除程序。

## 將 Amazon Redshift 資料庫設定為 的目標 AWS Database Migration Service
<a name="CHAP_Target.Redshift.Configuration"></a>

AWS Database Migration Service 必須設定為使用 Amazon Redshift 執行個體。下表說明 Amazon Redshift 端點可用的組態屬性。


| 屬性 | Description | 
| --- | --- | 
| 伺服器 | 您使用的 Amazon Redshift 叢集名稱。 | 
| port | Amazon Redshift 的連接埠號碼。預設值為 5439。 | 
| 使用者名稱 | 已註冊使用者的 Amazon Redshift 使用者名稱。 | 
| password | 在 username 屬性中命名之使用者的密碼。 | 
| 資料庫 | 您使用的 Amazon Redshift 資料倉儲 (服務) 名稱。 | 

如果您想將額外的連線字串屬性新增到您的 Amazon Redshift 端點，您可以指定 `maxFileSize` 和 `fileTransferUploadStreams` 屬性。如需這些屬性的詳細資訊，請參閱[使用 Amazon Redshift 做為 目標時的端點設定 AWS DMS](#CHAP_Target.Redshift.ConnectionAttrib)。

## 使用增強型 VPC 路由搭配 Amazon Redshift 做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.Redshift.EnhancedVPC"></a>

如果您對 Amazon Redshift 目標使用增強型 VPC 路由，則 Amazon Redshift 叢集與資料儲存庫之間的所有 COPY 流量會通過 VPC。因為增強型 VPC 路由會影響 Amazon Redshift 存取其他資源的方式，如果未正確設定 VPC，COPY 命令可能會失敗。

AWS DMS 可能會受到此行為的影響，因為它使用 COPY 命令將 S3 中的資料移至 Amazon Redshift 叢集。

以下是將資料載入 Amazon Redshift 目標所 AWS DMS 採取的步驟：

1. AWS DMS 會將資料從來源複製到複寫伺服器上的 .csv 檔案。

1. AWS DMS 使用 AWS SDK 將 .csv 檔案複製到您帳戶的 S3 儲存貯體。

1. AWS DMS 然後，在 Amazon Redshift 中使用 COPY 命令，將資料從 S3 中的 .csv 檔案複製到 Amazon Redshift 中的適當資料表。

如果未啟用增強型 VPC 路由，Amazon Redshift 會透過網際網路路由流量，包括網路中其他服務的流量 AWS 。如未啟用此功能，您不必設定網路路徑。如啟用此功能，您必須特別在叢集的 VPC 與資料資源之間建立網路路徑。如需所需組態的詳細資訊，請參閱 Amazon Redshift 文件中的「[增強型 VPC 路由](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-routing.html)」。

## 建立和使用 AWS KMS 金鑰來加密 Amazon Redshift 目標資料
<a name="CHAP_Target.Redshift.KMSKeys"></a>

您可以將推送到 Amazon S3 的目標資料先加密，然後再複製到 Amazon Redshift。若要這樣做，您可以建立和使用自訂 AWS KMS 金鑰。當您建立 Amazon Redshift 目標端點時，您可以使用以下其中一個機制，以您建立的金鑰來加密目標資料：
+ 當您使用 AWS CLI執行 `create-endpoint` 命令時，使用下列選項。

  ```
  --redshift-settings '{"EncryptionMode": "SSE_KMS", "ServerSideEncryptionKmsKeyId": "your-kms-key-ARN"}'
  ```

  其中，`your-kms-key-ARN` 是 KMS 金鑰的 Amazon Resource Name (ARN)。如需詳細資訊，請參閱[使用資料加密金鑰和 Amazon S3 儲存貯體做為中繼儲存體](#CHAP_Target.Redshift.EndpointSettings)。
+ 將額外連線屬性 `encryptionMode` 設定為值 `SSE_KMS`，將額外連線屬性 `serverSideEncryptionKmsKeyId` 設定為 KMS 金鑰的 ARN。如需詳細資訊，請參閱[使用 Amazon Redshift 做為 目標時的端點設定 AWS DMS](#CHAP_Target.Redshift.ConnectionAttrib)。

若要使用 KMS 金鑰加密 Amazon Redshift 目標資料，您需要具有存取 Amazon Redshift 資料許可的 AWS Identity and Access Management (IAM) 角色。將政策 (金鑰政策) 連接到您建立的加密金鑰，然後在該政策中存取此 IAM 角色。若要這麼做，您可以在 IAM 主控台建立下列項目：
+ 具有 AWS受管政策的 IAM 角色。
+ KMS 金鑰搭配參考此角色的金鑰政策。

下列程序說明作法。

**使用所需的受管政策建立 IAM AWS角色**

1. 在以下網址開啟 IAM 主控台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在導覽窗格中，選擇**角色**。**Roles (角色)** 頁面隨即開啟。

1. 選擇建**立角色**。**Create role (建立角色)** 頁面隨即開啟。

1. 針對信任的實體選擇 **AWS 服務**，然後針對使用該角色的服務選擇 **DMS**。

1. 選擇**下一步：許可**。**Attach permissions policies (連接許可政策)** 頁面隨即出現。

1. 尋找並選取 `AmazonDMSRedshiftS3Role` 政策。

1. 選擇下**一步：標籤**。**Add tags (新增標籤)** 頁面隨即出現。在此，可以增加您想要的任何標籤。

1. 選擇 **Next: Review (下一步：檢閱)**，檢閱您的結果。

1. 確認是您需要的設定後，輸入角色的名稱 (例如，`DMS-Redshift-endpoint-access-role`) 和任何額外的描述，然後選擇 **Create role (建立角色)**。**Roles (角色)** 頁面隨即開啟，並以訊息指出已建立您的角色。

現在，您已經以指定的名稱建立新角色來存取要加密的 Amazon Redshift 資源，例如 `DMS-Redshift-endpoint-access-role`。

**使用參考 IAM 角色的金鑰政策建立 AWS KMS 加密金鑰**
**注意**  
如需 AWS DMS 如何使用 AWS KMS 加密金鑰的詳細資訊，請參閱 [設定加密金鑰並指定 AWS KMS 許可](CHAP_Security.md#CHAP_Security.EncryptionKey)。

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/kms](https://console.aws.amazon.com/kms) 的 AWS Key Management Service (AWS KMS) 主控台。

1. 若要變更 AWS 區域，請使用頁面右上角的區域選擇器。

1. 在導覽窗格中，選擇 **Customer managed keys** (客戶受管金鑰)。

1. 選擇**建立金鑰**。**Configure key (設定金鑰)** 頁面隨即開啟。

1. 針對 **Key type (金鑰類型)**，請選擇 **Symmetric (對稱)**。
**注意**  
建立此金鑰時，您只能建立對稱金鑰，因為 Amazon Redshift 等所有 AWS 服務都只能使用對稱加密金鑰。

1. 選擇 **Advanced Options (進階選項)**。針對 **Key material origin (金鑰材料來源)**，請確認已選擇 **KMS**，然後選擇 **Next (下一步)**。**Add labels (新增標籤)** 頁面隨即開啟。

1. 針對 **Create alias and description (建立別名和描述)**，請輸入一個金鑰別名 (例如，`DMS-Redshift-endpoint-encryption-key`) 和任何額外的描述。

1. 針對 **Tags (標籤)**，請新增您想要的任何標籤以協助識別金鑰和追蹤其使用情況，然後選擇 **Next (下一步)**。**Define key administrative permissions (定義金鑰管理許可)** 頁面隨即開啟，其中顯示您可以選擇的使用者和角色清單。

1. 新增您想要的使用者和角色來管理金鑰。請確定這些使用者和角色具有管理金鑰所需的許可。

1. 針對 **Key deletion (金鑰刪除)**，請選擇金鑰管理員是否可以刪除金鑰，然後選擇 **Next (下一步)**。**Define key usage permissions (定義金鑰使用許可)** 頁面隨即開啟，其中顯示您可以選擇的額外使用者和角色清單。

1. 針對**此帳戶**，選擇您要對 Amazon Redshift 目標執行密碼編譯操作的可用使用者。並請選擇您之前在**角色**中建立的角色，以啟用存取來加密 Amazon Redshift 目標物件，例如 `DMS-Redshift-endpoint-access-role`。

1. 如果您想要新增未列出的其他帳戶以擁有相同的存取權，請針對**其他 AWS 帳戶**選擇**新增另一個 AWS 帳戶**，然後選擇**下一步**。**Review and edit key policy (檢閱並編輯金鑰政策)** 頁面隨即開啟，並顯示金鑰政策的 JSON，您可以透過輸入現有 JSON 來執行檢閱和編輯。在此，您可以查看金鑰政策於何處參考您在上一步所選擇的角色與使用者 (例如 `Admin` 和 `User1`)。您也可以查看不同委託人 (使用者和角色) 允許的不同金鑰動作，如下列範例所示。

------
#### [ JSON ]

****  

   ```
   {
       "Id": "key-consolepolicy-3",
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "Enable IAM User Permissions",
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::111122223333:root"
                   ]
               },
               "Action": "kms:*",
               "Resource": "*"
           },
           {
               "Sid": "Allow access for Key Administrators",
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::111122223333:role/Admin"
                   ]
               },
               "Action": [
                   "kms:Create*",
                   "kms:Describe*",
                   "kms:Enable*",
                   "kms:List*",
                   "kms:Put*",
                   "kms:Update*",
                   "kms:Revoke*",
                   "kms:Disable*",
                   "kms:Get*",
                   "kms:Delete*",
                   "kms:TagResource",
                   "kms:UntagResource",
                   "kms:ScheduleKeyDeletion",
                   "kms:CancelKeyDeletion"
               ],
               "Resource": "*"
           },
           {
               "Sid": "Allow use of the key",
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::111122223333:role/DMS-Redshift-endpoint-access-role",
                       "arn:aws:iam::111122223333:role/Admin",
                       "arn:aws:iam::111122223333:role/User1"
                   ]
               },
               "Action": [
                   "kms:Encrypt",
                   "kms:Decrypt",
                   "kms:ReEncrypt*",
                   "kms:GenerateDataKey*",
                   "kms:DescribeKey"
               ],
               "Resource": "*"
           },
           {
               "Sid": "Allow attachment of persistent resources",
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::111122223333:role/DMS-Redshift-endpoint-access-role",
                       "arn:aws:iam::111122223333:role/Admin",
                       "arn:aws:iam::111122223333:role/User1"
                   ]
               },
               "Action": [
                   "kms:CreateGrant",
                   "kms:ListGrants",
                   "kms:RevokeGrant"
               ],
               "Resource": "*",
               "Condition": {
                   "Bool": {
                       "kms:GrantIsForAWSResource": true
                   }
               }
           }
       ]
   }
   ```

------

1. 選擇**完成**。**加密金鑰**頁面隨即開啟，並顯示訊息指出 AWS KMS key 您的 已建立。

您現在已使用指定的別名建立新的 KMS 金鑰 (例如，`DMS-Redshift-endpoint-encryption-key`)。此金鑰可讓 AWS DMS 加密 Amazon Redshift 目標資料。

## 使用 Amazon Redshift 做為 目標時的端點設定 AWS DMS
<a name="CHAP_Target.Redshift.ConnectionAttrib"></a>

您可以使用端點設定來設定您的 Amazon Redshift 目標資料庫，類似於使用額外的連線屬性。當您使用 AWS DMS 主控台或使用 中的 `create-endpoint`命令搭配 `--redshift-settings '{"EndpointSetting": "value", ...}'` JSON 語法來建立目標端點時[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)，您可以指定設定。

下列資料表顯示您可搭配 Amazon Redshift 作為目標使用的端點設定。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.Redshift.html)

## 使用資料加密金鑰和 Amazon S3 儲存貯體做為中繼儲存體
<a name="CHAP_Target.Redshift.EndpointSettings"></a>

您可以使用 Amazon Redshift 目標端點設定來設定下列項目：
+ 自訂 AWS KMS 資料加密金鑰。您可以使用此金鑰將推送到 Amazon S3 的資料先加密，然後再複製到 Amazon Redshift。
+ 自訂 S3 儲存貯體是資料遷移到 Amazon Redshift 的中繼儲存體。
+ 將布林值映射為 PostgreSQL 來源的布林值。根據預設，BOOLEAN 型別會以 varchar (1) 遷移。您可以指定 `MapBooleanAsBoolean` 讓 Redshift 目標將布林型別以 boolean 遷移，如下列範例所示。

  ```
  --redshift-settings '{"MapBooleanAsBoolean": true}'
  ```

  請注意，您必須同時在來源端點和目標端點上設定此設定，該設定才會生效。

### 用於資料加密的 KMS 金鑰設定
<a name="CHAP_Target.Redshift.EndpointSettings.KMSkeys"></a>

以下範例說明設定自訂的 KMS 金鑰，以加密推送到 S3 的資料。首先，您可以使用以下 AWS CLI呼叫 `create-endpoint`。

```
aws dms create-endpoint --endpoint-identifier redshift-target-endpoint --endpoint-type target 
--engine-name redshift --username your-username --password your-password 
--server-name your-server-name --port 5439 --database-name your-db-name 
--redshift-settings '{"EncryptionMode": "SSE_KMS", 
"ServerSideEncryptionKmsKeyId": "arn:aws:kms:us-east-1:111122223333:key/24c3c5a1-f34a-4519-a85b-2debbef226d1"}'
```

其中，`--redshift-settings` 選項指定的 JSON 物件定義兩個參數。一個是 `EncryptionMode` 參數，值為 `SSE_KMS`。另一個是 `ServerSideEncryptionKmsKeyId` 參數，值為 `arn:aws:kms:us-east-1:111122223333:key/24c3c5a1-f34a-4519-a85b-2debbef226d1`。這個值是自訂 KMS 金鑰的 Amazon Resource Name (ARN)。

在預設情況下，將使用 S3 伺服器端加密進行 S3 資料加密。對於上述範例中的 Amazon Redshift 目標，這也等同於指定其端點設定，如下列範例所示。

```
aws dms create-endpoint --endpoint-identifier redshift-target-endpoint --endpoint-type target 
--engine-name redshift --username your-username --password your-password 
--server-name your-server-name --port 5439 --database-name your-db-name 
--redshift-settings '{"EncryptionMode": "SSE_S3"}'
```

如需使用 S3 伺服器端加密的詳細資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的[使用伺服器端加密保護資料](https://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html)。

**注意**  
您也可以使用 CLI `modify-endpoint` 指令將現有端點的 `EncryptionMode` 參數值從 `SSE_KMS` 變更為 `SSE_S3`。但您不能將 `EncryptionMode` 值從 `SSE_S3` 變更為 `SSE_KMS`。

### Amazon S3 儲存貯體設定
<a name="CHAP_Target.Redshift.EndpointSettings.S3Buckets"></a>

當您將資料遷移至 Amazon Redshift 目標端點時， AWS DMS 會使用預設的 Amazon S3 儲存貯體做為中繼任務儲存體，再將遷移的資料複製到 Amazon Redshift。例如，說明使用此預設 S3 儲存貯體，以 AWS KMS 資料加密金鑰建立 Amazon Redshift 目標端點的範例 (請參閱 [用於資料加密的 KMS 金鑰設定](#CHAP_Target.Redshift.EndpointSettings.KMSkeys))。

您可以改為指定此中繼儲存體的自訂 S3 儲存貯體，方法是在 AWS CLI `create-endpoint`命令的 `--redshift-settings`選項值中包含下列參數：
+ `BucketName` – 您指定為 S3 儲存貯體儲存名稱的字串。如果您的服務存取角色以 `AmazonDMSRedshiftS3Role` 政策為基礎，則此值的前綴必須為 `dms-`，例如 `dms-my-bucket-name`。
+ `BucketFolder` – (選用) 您可以指定做為指定 S3 儲存貯體中儲存資料夾名稱的字串。
+ `ServiceAccessRoleArn` – 允許管理存取 S3 儲存貯體之 IAM 角色的 ARN。一般而言，您可以根據 `AmazonDMSRedshiftS3Role` 政策建立此角色。如需範例，請參閱 [建立和使用 AWS KMS 金鑰來加密 Amazon Redshift 目標資料](#CHAP_Target.Redshift.KMSKeys) 中的程序，了解如何以要求的 AWS受管政策建立 IAM 角色。
**注意**  
如果您使用 `create-endpoint` 命令的 `--service-access-role-arn` 選項指定不同 IAM 角色的 ARN，這個 IAM 角色選項優先。

以下範例顯示如何使用 AWS CLI，以這些參數指定下列 `create-endpoint` 呼叫中的自訂 Amazon S3 儲存貯體。

```
aws dms create-endpoint --endpoint-identifier redshift-target-endpoint --endpoint-type target 
--engine-name redshift --username your-username --password your-password 
--server-name your-server-name --port 5439 --database-name your-db-name 
--redshift-settings '{"ServiceAccessRoleArn": "your-service-access-ARN", 
"BucketName": "your-bucket-name", "BucketFolder": "your-bucket-folder-name"}'
```

## Amazon Redshift 的多執行緒任務設定
<a name="CHAP_Target.Redshift.ParallelApply"></a>

採用多執行緒任務設定，可以改善 Amazon Redshift 目標端點的完全載入和變更資料擷取 (CDC) 任務效能。這些設定可讓您指定並行執行緒數目，以及儲存在緩衝區中的記錄數目。

### Amazon Redshift 的多執行緒完全載入任務設定
<a name="CHAP_Target.Redshift.ParallelApply.FullLoad"></a>

若要提升完全載入效能，您可以使用下列 `ParallelLoad*` 任務設定：
+ `ParallelLoadThreads` – 指定完全載入期間 DMS 用來將資料記錄推送至 Amazon Redshift 目標端點的並行執行緒數目。預設值為零 (0)，最大值為 32。如需詳細資訊，請參閱[完全載入任務設定](CHAP_Tasks.CustomizingTasks.TaskSettings.FullLoad.md)。

  使用 `ParallelLoadThreads` 任務設定時，您可以使用設為 `false` 的 `enableParallelBatchInMemoryCSVFiles` 屬性。此屬性可讓 DMS 寫入磁碟而非記憶體，藉此改善較大型多執行緒完全載入任務的效能。預設值為 `true`。
+ `ParallelLoadBufferSize` – 指定搭配 Redshift 目標使用平行負載執行緒時的資料記錄請求上限。預設值為 100，最大值為 1,000。我們建議您在 ParallelLoadThreads > 1 (大於一個) 時使用此選項。

**注意**  
3.4.5 版及更高 AWS DMS 版本支援在 FULL LOAD 到 Amazon Redshift 目標端點期間使用`ParallelLoad*`任務設定。  
在變更資料擷取 (CDC) 期間或啟用平行載入的完全載入移轉任務期間，不支援 `ReplaceInvalidChars` Redshift 端點設定。未啟用平行負載時，支援 FULL LOAD 遷移。如需詳細資訊，請參閱 *AWS Database Migration Service API 參考*中的 [RedshiftSettings](https://docs.aws.amazon.com/dms/latest/APIReference/API_RedshiftSettings.html)

### Amazon Redshift 的多執行緒 CDC 任務設定
<a name="CHAP_Target.Redshift.ParallelApply.CDC"></a>

若要提升 CDC 效能，您可以使用下列 `ParallelApply*` 任務設定：
+ `ParallelApplyThreads` – 指定在 CDC 載入期間 AWS DMS 用來將資料記錄推送至 Amazon Redshift 目標端點的並行執行緒數目。預設值為零 (0)，最大值為 32。建議的最小值等同於叢集中的切片數量。
+ `ParallelApplyBufferSize` – 指定搭配 Redshift 目標使用平行套用執行緒時的資料記錄請求上限。預設值為 100，最大值為 1,000。我們建議在 ParallelApplyThreads > 1 (大於一個) 時使用此選項。

  為了獲得 Redshift 作為目標的最大效益，我們建議 `ParallelApplyBufferSize` 的值至少為 `ParallelApplyThreads` 數量的兩倍 (兩倍或更多)。

**注意**  
在 CDC 到 Amazon Redshift 目標端點期間使用`ParallelApply*`任務設定的支援可在 3.4.3 版和更高 AWS DMS 版本中使用。

套用的平行處理原則層級取決於總*批次大小*與傳輸資料*檔案大小*上限之間的關聯性。將多執行緒 CDC 任務設定搭配 Redshift 目標時，相對於檔案大小上限，提高批次大小的效益較為顯著。例如，您可以使用下列端點和任務設定的組合進行調整以獲得最佳效能。

```
// Redshift endpoint setting
                
        MaxFileSize=250000;

// Task settings

        BatchApplyEnabled=true;
        BatchSplitSize =8000;
        BatchApplyTimeoutMax =1800;
        BatchApplyTimeoutMin =1800;
        ParallelApplyThreads=32;
        ParallelApplyBufferSize=100;
```

藉由上一個範例中的設定，具有繁重交易工作負載的客戶可受益於批次緩衝，其中包含 8000 筆記錄，並在 1800 秒內填滿，並利用檔案大小上限為 250 MB 的 32 個平行執行緒。

如需詳細資訊，請參閱[變更處理調校設定](CHAP_Tasks.CustomizingTasks.TaskSettings.ChangeProcessingTuning.md)。

**注意**  
在進行中複寫至 Redshift 叢集期間執行的 DMS 查詢，可與其他執行中的應用程式查詢共用相同的 WLM (工作負載管理) 佇列。因此，請留意正確設定 WLM 內容，以確保 Redshift 目標在進行中複寫期間的效能。例如，如果其他平行 ETL 查詢正在執行，DMS 執行速度會變慢，且喪失效能提升。

## Amazon Redshift 的目標資料類型
<a name="CHAP_Target.Redshift.DataTypes"></a>

的 Amazon Redshift 端點 AWS DMS 支援大多數 Amazon Redshift 資料類型。下表顯示使用 時支援的 Amazon Redshift 目標資料類型， AWS DMS 以及來自 AWS DMS 資料類型的預設映射。

如需 AWS DMS 資料類型的詳細資訊，請參閱 [AWS Database Migration Service 的資料類型](CHAP_Reference.DataTypes.md)。


| AWS DMS 資料類型 | Amazon Redshift 資料類型 | 
| --- | --- | 
| BOOLEAN | BOOL | 
| BYTES | VARCHAR (長度) | 
| DATE | DATE | 
| TIME | VARCHAR(20) | 
| DATETIME |  如果小數位數為 => 0 和 =< 6 (取決於 Redshift 目標欄類型)，則以下之一： TIMESTAMP (s) TIMESTAMPTZ — 如果來源時間戳記包含區域偏移量 (例如在 SQL Server 或 Oracle 中)，則會在插入/更新時轉換為 UTC。如果不包含偏移量，則時間會視為已是 UTC。 如果擴展 => 7 且 =< 9，則： VARCHAR (37) | 
| INT1 | INT2 | 
| INT2 | INT2 | 
| INT4 | INT4 | 
| INT8 | INT8 | 
| NUMERIC | 如果擴展 => 0 且 =< 37，則： NUMERIC (p,s)  如果擴展 => 38 且 =< 127，則： VARCHAR (長度) | 
| REAL4 | FLOAT4 | 
| REAL8 | FLOAT8 | 
| STRING | 如果長度是 1–65,535，則使用 VARCHAR (長度為位元組)  如果長度是 65,536–2,147,483,647，則使用 VARCHAR (65535) | 
| UINT1 | INT2 | 
| UINT2 | INT2 | 
| UINT4 | INT4 | 
| UINT8 | NUMERIC (20,0) | 
| WSTRING |  如果長度是 1–65,535，則使用 NVARCHAR (長度為位元組)  如果長度是 65,536–2,147,483,647，則使用 NVARCHAR (65535) | 
| BLOB | VARCHAR (LOB 大小上限 \$1 2)  LOB 大小上限不能超過 31 KB。Amazon Redshift 不支援大於 64 KB 的 VARCHAR。 | 
| NCLOB | NVARCHAR (LOB 大小上限)  LOB 大小上限不能超過 63 KB。Amazon Redshift 不支援大於 64 KB 的 VARCHAR。 | 
| CLOB | VARCHAR (LOB 大小上限)  LOB 大小上限不能超過 63 KB。Amazon Redshift 不支援大於 64 KB 的 VARCHAR。 | 

## 使用 AWS DMS 搭配 Amazon Redshift Serverless 做為目標
<a name="CHAP_Target.Redshift.RSServerless"></a>

AWS DMS 支援使用 Amazon Redshift Serverless 做為目標端點。如需使用 Amazon Redshift Serverless 的相關資訊，請參閱《[Amazon Redshift 管理指南](https://docs.aws.amazon.com/redshift/latest/mgmt/welcome.html)》中的「[Amazon Redshift Serverless](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-serverless.html)」。

本主題說明如何搭配 使用 Amazon Redshift Serverless 端點 AWS DMS。

**注意**  
建立 Amazon Redshift Serverless 端點時，對於 [RedshiftSettings](https://docs.aws.amazon.com/dms/latest/APIReference/API_RedshiftSettings.html) 端點組態的 **DatabaseName** 欄位，請使用 Amazon Redshift 資料倉儲的名稱或工作群組端點的名稱。對於 **ServerName** 欄位，請針對無伺服器叢集使用**工作群組**頁面中顯示的端點值 (例如 `default-workgroup.093291321484.us-east-1.redshift-serverless.amazonaws.com`)。如需建立端點的相關資訊，請參閱 [來源與目標端點](CHAP_Endpoints.Creating.md)。如需工作群組端點的相關資訊，請參閱[連線至 Amazon Redshift Serverless](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-connecting.html)。

### 使用 Amazon Redshift Serverless 作為目標的信任政策
<a name="CHAP_Target.Redshift.RSServerless.policy"></a>

使用 Amazon Redshift Serverless 作為目標端點時，您必須將以下反白顯示的部分新增至信任政策。此信任政策會附加至 `dms-access-for-endpoint` 角色。

如需搭配 使用信任政策的詳細資訊 AWS DMS，請參閱 [建立要與 搭配使用的 IAM 角色 AWS DMS](security-iam.md#CHAP_Security.APIRole)。

### 使用 Amazon Redshift Serverless 作為目標時的限制
<a name="CHAP_Target.Redshift.RSServerless.Limitations"></a>

使用 Redshift Serverless 作為目標具有下列限制：
+ AWS DMS 僅支援 Amazon Redshift Serverless 作為支援 Amazon Redshift Serverless 區域中的端點。如需哪些區域支援 Amazon Redshift Serverless 的相關資訊，請參閱 [AWS 一般參考資料](https://docs.aws.amazon.com/general/latest/gr/Welcome.html)中 [Redshift 端點和配額](https://docs.aws.amazon.com/general/latest/gr/redshift-service.html)主題的 **Redshift Serverless API**。
+ 使用增強型 VPC 路由時，請務必在與 Redshift Serverless 或 Redshift 佈建叢集相同的 VPC 中建立 Amazon S3 端點。如需詳細資訊，請參閱[使用增強型 VPC 路由搭配 Amazon Redshift 做為 的目標 AWS Database Migration Service](#CHAP_Target.Redshift.EnhancedVPC)。
+ AWS DMS 不支援 Amazon Redshift Serverless 的增強輸送量做為目標。如需詳細資訊，請參閱[用於將 Oracle 完全載入 Amazon Redshift 和 Amazon S3 遷移的增強輸送量](CHAP_Serverless.Components.md#CHAP_Serverless.Throughput)。
+ AWS DMS 當 SSL 模式設定為 時， 不支援與 Amazon Redshift Redshift Serverless 的連線`verify-full`。對於需要對 Amazon Redshift Serverless 目標進行 SSL 驗證的連線，請使用替代 SSL 模式，例如 `require`或 `verify-ca`。

# 使用 SAP ASE 資料庫做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.SAP"></a>

您可以從任何支援的資料庫來源，使用 AWS DMS將資料遷移至先前稱為 Sybase 的 SAP Adaptive Server Enterprise (ASE)。

如需 AWS DMS 支援做為目標的 SAP ASE 版本資訊，請參閱 [的目標 AWS DMS](CHAP_Introduction.Targets.md)。

## 使用 SAP ASE 資料庫做為 目標的先決條件 AWS Database Migration Service
<a name="CHAP_Target.SAP.Prerequisites"></a>

在您開始使用 SAP ASE 資料庫做為 的目標之前 AWS DMS，請確定您有下列先決條件：
+ 提供 SAP ASE 帳戶存取權給 AWS DMS 使用者。這個使用者必須擁有 SAP ASE 資料庫的讀取/寫入權限。
+ 在某些情況下，您的複寫目標 SAP ASE 15.7 版可能安裝在採用非拉丁字元 (例如中文) 設定 Microsoft Windows 上的 Amazon EC2 執行個體。在這種情況下， AWS DMS 需要在目標 SAP ASE 機器上安裝 SAP ASE 15.7 SP121。

## 使用 SAP ASE 資料庫做為 目標的限制 AWS DMS
<a name="CHAP_Target.SAP.Limitations"></a>

使用 SAP ASE 資料庫做為 AWS DMS目標時，有下列限制：
+ AWS DMS 不支援包含具有下列資料類型之欄位的資料表。這些資料類型顯示為 null 的複寫資料行。
  + 使用者定義的類型 (UDT)

## 使用 SAP ASE 做為 目標時的端點設定 AWS DMS
<a name="CHAP_Target.SAP.ConnectionAttrib"></a>

您可以使用端點設定來設定您的 SAP ASE 目標，類似於使用額外的連線屬性。當您使用 AWS DMS 主控台或使用 中的 `create-endpoint`命令搭配 `--sybase-settings '{"EndpointSetting": "value", ...}'` JSON 語法來建立目標端點時[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)，您可以指定設定。

下列資料表顯示您可搭配 SAP ASE 作為目標使用的端點設定。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.SAP.html)

## SAP ASE 的目標資料類型
<a name="CHAP_Target.SAP.DataTypes"></a>

下表顯示使用 時支援的 SAP ASE 資料庫目標資料類型， AWS DMS 以及來自 AWS DMS 資料類型的預設映射。

如需 AWS DMS 資料類型的詳細資訊，請參閱 [AWS Database Migration Service 的資料類型](CHAP_Reference.DataTypes.md)。


|  AWS DMS 資料類型  |  SAP ASE 資料類型  | 
| --- | --- | 
| BOOLEAN | BIT | 
| BYTES | VARBINARY (長度) | 
| DATE | DATE | 
| TIME | TIME | 
| TIMESTAMP |  如果擴展 => 0 且 =< 6，則：BIGDATETIME  如果擴展 => 7 且 =< 9，則：VARCHAR (37)  | 
| INT1 | TINYINT | 
| INT2 | SMALLINT | 
| INT4 | INTEGER | 
| INT8 | BIGINT | 
| NUMERIC | NUMERIC (p,s) | 
| REAL4 | REAL | 
| REAL8 | DOUBLE PRECISION | 
| STRING | VARCHAR (長度) | 
| UINT1 | TINYINT | 
| UINT2 | UNSIGNED SMALLINT | 
| UINT4 | UNSIGNED INTEGER | 
| UINT8 | UNSIGNED BIGINT | 
| WSTRING | VARCHAR (長度) | 
| BLOB | IMAGE | 
| CLOB | UNITEXT | 
| NCLOB | TEXT | 

# 使用 Amazon S3 做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.S3"></a>

您可以從 AWS DMS 任何支援的資料庫來源，使用 將資料遷移至 Amazon S3。在 AWS DMS 任務中使用 Amazon S3 做為目標時，完全載入和變更資料擷取 (CDC) 資料預設會寫入逗號分隔值 (.csv) 格式。若要使用更精簡的儲存和更快速的查詢選項，您也可以選擇以 Apache Parquet (.parquet) 格式寫入資料。

AWS DMS 針對使用時間戳記的 .csv files. AWS DMS names CDC 檔案，使用增量十六進位計數器命名在完全載入期間建立的檔案，例如 LOAD00001.csv、LOAD00002...LOAD00009, LOAD0000A 等20141029-1134010000。對於包含記錄的每個來源資料表， 會在指定的目標資料夾下 AWS DMS 建立資料夾 （如果來源資料表不是空的）。 會將所有完全載入和 CDC 檔案 AWS DMS 寫入指定的 Amazon S3 儲存貯體。您可以使用 [MaxFileSize](https://docs.aws.amazon.com/dms/latest/APIReference/API_S3Settings.html#DMS-Type-S3Settings-MaxFileSize) 端點設定來控制 AWS DMS 建立的檔案大小。

參數 `bucketFolder` 包含 .csv 或 .parquet 檔案上傳到 S3 儲存貯體之前的儲存位置。就 .csv 檔案而言，資料表資料使用以下格式儲存在 S3 儲存貯體中，並顯示完全載入檔案。

```
database_schema_name/table_name/LOAD00000001.csv
database_schema_name/table_name/LOAD00000002.csv
...
database_schema_name/table_name/LOAD00000009.csv
database_schema_name/table_name/LOAD0000000A.csv
database_schema_name/table_name/LOAD0000000B.csv
...database_schema_name/table_name/LOAD0000000F.csv
database_schema_name/table_name/LOAD00000010.csv
...
```

您可以使用額外的連線屬性指定資料行分隔符號、資料列分隔符號和其他參數。有關額外連線屬性的詳細資訊，請參閱本節最後的[使用 Amazon S3 做為 目標時的端點設定 AWS DMS](#CHAP_Target.S3.Configuring)。

為了防止詐騙， 會在執行操作之前 AWS DMS 驗證儲存貯體擁有權。根據預設，未指定 `ExpectedBucketOwner` Amazon S3 端點設定時， AWS DMS 會使用擁有 AWS DMS 服務角色 AWS 的帳戶 ID 做為預期的儲存貯體擁有者。

若要將資料遷移至不同 AWS 帳戶擁有的 S3 儲存貯體，您必須在 Amazon S33 `ExpectedBucketOwner` 端點設定中明確指定實際儲存貯體擁有者，如下所示。否則，跨帳戶複寫任務將會失敗。

```
--s3-settings '{"ExpectedBucketOwner": "AWS_Account_ID"}'
```

當您使用 AWS DMS 複寫使用 CDC 任務的資料變更時，.csv 或 .parquet 輸出檔案的第一欄會指出資料列資料如何變更，如下列 .csv 檔案所示。

```
I,101,Smith,Bob,4-Jun-14,New York
U,101,Smith,Bob,8-Oct-15,Los Angeles
U,101,Smith,Bob,13-Mar-17,Dallas
D,101,Smith,Bob,13-Mar-17,Dallas
```

在此範例中，假設來源資料庫中有一個`EMPLOYEE`資料表。 會將資料 AWS DMS 寫入 .csv 或 .parquet 檔案，以回應下列事件：
+ 2014 年 6 月 4 日紐約辦公室聘雇的新員工 (Bob Smith，員工 ID 101)。在 .csv 或 .parquet 檔案中，第一欄的 `I` 指出新資料列 `INSERT` 到來源資料庫中的 EMPLOYEE 資料表。
+ Bob 於 2015 年 10 月 8 日調到洛杉磯辦公室。在 .csv 或 .parquet 檔案中，`U` 指出 EMPLOYEE 資料表的對應資料列已 `UPDATE`，以反映 Bob 的新辦公室位置。行中其他部分反映 `UPDATE` 後的 EMPLOYEE 資料表資料列。
+ Bob 於 2017 年 3 月 13 日再次調到達拉斯辦公室。在 .csv 或 .parquet 檔案中，`U` 指出此資料列再次 `UPDATE`。行中其他部分反映 `UPDATE` 後的 EMPLOYEE 資料表資料列。
+ 在達拉斯工作一段時間後，Bob 離開了公司。在 .csv 或 .parquet 檔案中，`D` 指出來源資料表已 `DELETE` 此資料列。行中其他部分反映刪除前的 EMPLOYEE 資料表資料列內容。

請注意，CDC 預設會 AWS DMS 儲存每個資料庫資料表的資料列變更，而不考慮交易順序。如果您想要將資料列變更依交易順序儲存至 CDC 檔案中，則需要使用 S3 端點設定來指定此項目，以及 S3 目標上儲存 CDC 交易檔案的資料夾路徑。如需詳細資訊，請參閱[在 S3 目標上包含交易順序之擷取資料變更 (CDC)](#CHAP_Target.S3.EndpointSettings.CdcPath)。

若要控制在資料複寫任務期間寫入 Amazon S3 目標的頻率，您可以設定額外的連線屬性 `cdcMaxBatchInterval` 和 `cdcMinFileSize`。在沒有任何額外負荷操作的情況下分析資料時，此設定可使效能提升。如需詳細資訊，請參閱[使用 Amazon S3 做為 目標時的端點設定 AWS DMS](#CHAP_Target.S3.Configuring) 

**Topics**
+ [使用 Amazon S3 作為目標的事前準備](#CHAP_Target.S3.Prerequisites)
+ [使用 Amazon S3 作為目標的限制](#CHAP_Target.S3.Limitations)
+ [安全](#CHAP_Target.S3.Security)
+ [使用 Apache Parquet 儲存 Amazon S3 物件](#CHAP_Target.S3.Parquet)
+ [Amazon S3 物件標記](#CHAP_Target.S3.Tagging)
+ [建立 AWS KMS 金鑰來加密 Amazon S3 目標物件](#CHAP_Target.S3.KMSKeys)
+ [使用日期型資料夾分割](#CHAP_Target.S3.DatePartitioning)
+ [使用 Amazon S3 做為 的目標時，分割來源的平行負載 AWS DMS](#CHAP_Target.S3.ParallelLoad)
+ [使用 Amazon S3 做為 目標時的端點設定 AWS DMS](#CHAP_Target.S3.Configuring)
+ [使用 AWS Glue Data Catalog 搭配 的 Amazon S3 目標 AWS DMS](#CHAP_Target.S3.GlueCatalog)
+ [在您的 Amazon S3 目標上使用資料加密、parquet 檔案和 CDC](#CHAP_Target.S3.EndpointSettings)
+ [在遷移的 S3 資料中指示來源資料庫操作](#CHAP_Target.S3.Configuring.InsertOps)
+ [S3 Parquet 的目標資料類型](#CHAP_Target.S3.DataTypes)

## 使用 Amazon S3 作為目標的事前準備
<a name="CHAP_Target.S3.Prerequisites"></a>

使用 Amazon S3 作為目標之前，請檢查下列條件為真：
+ 您用作目標的 S3 儲存貯體與您用來遷移資料的 DMS 複寫執行個體位於相同 AWS 區域。
+ 您用於遷移 AWS 的帳戶具有 IAM 角色，具有您用作目標之 S3 儲存貯體的寫入和刪除存取權。
+ 此角色具有標記存取，因此您可以標記任何寫入到目標儲存貯體的 S3 物件。
+ IAM 角色具有已新增為*受信任實體*的 DMS (dms.amazonaws.com)。
+ 對於 3.4.7 版和更新 AWS DMS 版本，DMS 必須透過 VPC 端點或公有路由存取來源儲存貯體。如需 VPC 端點的資訊，請參閱 [設定 的 VPC 端點 AWS DMS](CHAP_VPC_Endpoints.md)。

若要設定此帳戶存取，對於用來建立遷移任務的使用者帳戶，請確定指派給此帳戶的角色具有以下許可集。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:DeleteObject",
                "s3:PutObjectTagging"
            ],
            "Resource": [
                "arn:aws:s3:::buckettest2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::buckettest2"
            ]
        }
    ]
}
```

------

如需使用驗證搭配 S3 作為目標的先決條件，請參閱 [S3 目標驗證先決條件](CHAP_Validating_S3.md#CHAP_Validating_S3_prerequisites)。

## 使用 Amazon S3 作為目標的限制
<a name="CHAP_Target.S3.Limitations"></a>

使用 Amazon S3 作為目標時，有下列限制：
+ 請勿為 S3 啟用版本控制。如果您需要 S3 版本控制，請使用生命週期政策以主動刪除舊版本。否則，您可能會因 S3 `list-object` 呼叫逾時而遭遇端點測試連線失敗。若要建立 S3 儲存貯體的生命週期政策，請參閱[管理儲存生命週期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)。若要刪除 S3 物件的版本，請參閱[刪除啟用版本控制功能之儲存貯體中的物件](https://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingObjectVersions.html)。
+ 3.4.7 及更新版本支援啟用 VPC (閘道 VPC) 的 S3 儲存貯體。
+ 變更資料擷取 (CDC) 支援下列資料定義語言 (DDL) 命令：截斷資料表、刪除資料表、建立資料表、重新命名資料表、新增資料欄、刪除資料欄、重新命名資料欄和變更資料欄資料類型。請注意，在來源資料庫上新增、捨棄或重新命名資料欄時，目標 S3 儲存貯體中不會記錄 ALTER 陳述式， AWS DMS 也不會變更先前建立的記錄以符合新結構。變更之後， 會使用新的資料表結構 AWS DMS 建立新的記錄。
**注意**  
截斷 DDL 操作會移除 S3 儲存貯體中的所有檔案以及相應的資料表資料夾。您可以使用任務設定停用該行為，並設定 DMS 在變更資料擷取 (CDC) 期間處理 DDL 行為的方式。如需詳細資訊，請參閱[變更處理 DDL 處理的任務設定](CHAP_Tasks.CustomizingTasks.TaskSettings.DDLHandling.md)。
+ 不支援完全的 LOB 模式。
+ 不支援在完全載入階段變更來源資料表結構。支援在完全載入階段變更資料。
+ 將同一來源資料表中的資料複寫到相同目標 S3 端點儲存貯體的多項任務，會讓這些任務寫入相同的檔案。如果您的資料來源為相同的資料表，建議您指定不同的目標端點 (儲存貯體)。
+ S3 端點不支援 `BatchApply`。對 S3 目標使用批次套用 (例如 `BatchApplyEnabled` 目標中繼資料任務設定) 可能會導致資料遺失。
+ `DatePartitionEnabled` 和 `addColumnName` 無法搭配 `PreserveTransactions` 或 `CdcPath` 一起使用。
+ AWS DMS 不支援使用轉換規則將多個來源資料表重新命名為相同的目標資料夾。
+ 如果在完全載入階段需要大量寫入來源資料表，DMS 可能會將重複的記錄寫入 S3 儲存貯體或快取的變更。
+ 如果您使用 `TargetTablePrepMode` 為 `DO_NOTHING` 來設定任務，任務若在完全載入階段突然停止，然後繼續執行，此時 DMS 可能會將重複的記錄寫入 S3 儲存貯體。
+ 如果您使用 `PreserveTransactions` 設定值為 `true` 來設定目標端點，則重新載入資料表並不會清除先前產生的 CDC 檔案。如需詳細資訊，請參閱[在 S3 目標上包含交易順序之擷取資料變更 (CDC)](#CHAP_Target.S3.EndpointSettings.CdcPath)。

如需了解使用驗證搭配 S3 作為目標的限制，請參閱 [使用 S3 目標驗證的限制](CHAP_Validating_S3.md#CHAP_Validating_S3_limitations)。

## 安全
<a name="CHAP_Target.S3.Security"></a>

若要使用 Amazon S3 作為目標，用於遷移的帳戶必須擁有目標 Amazon S3 儲存貯體的寫入和刪除存取權。指定具有存取 Amazon S3 所需許可的 IAM 角色的 Amazon Resource Name (ARN)。

AWS DMS 支援一組預先定義的 Amazon S3 授予，稱為標準存取控制清單 ACLs)。每個標準 ACL 都有一組承授者和許可，供您用來設定 Amazon S3 儲存貯體的許可。您可以在您 S3 目標端點的連線字串屬性中使用 `cannedAclForObjects` 指定固定 ACL。如需有關使用額外連線屬性 `cannedAclForObjects` 的詳細資訊，請參閱[使用 Amazon S3 做為 目標時的端點設定 AWS DMS](#CHAP_Target.S3.Configuring)。如需 Amazon S3 固定 ACL 的詳細資訊，請參閱[固定 ACL](https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl)。

用於遷移的 IAM 角色必須能夠執行 `s3:PutObjectAcl` API 操作。

## 使用 Apache Parquet 儲存 Amazon S3 物件
<a name="CHAP_Target.S3.Parquet"></a>

逗號分隔值 (.csv) 格式是 Amazon S3 目標物件的預設儲存格式。若要使用更精簡的儲存和更快速的查詢，您可以改用 Apache Parquet (.parquet) 做為儲存格式。

Apache Parquet 是原本專為 Hadoop 設計的開放原始碼檔案儲存格式。如需 Apache Parquet 的詳細資訊，請參閱 [https://parquet.apache.org/](https://parquet.apache.org/)。

若要將 .parquet 設定為您遷移的 S3 目標物件的儲存格式，您可以使用以下機制：
+ 當您使用 AWS CLI 或 API for AWS DMS建立端點時，您提供做為 JSON 物件參數的端點設定。如需詳細資訊，請參閱[在您的 Amazon S3 目標上使用資料加密、parquet 檔案和 CDC](#CHAP_Target.S3.EndpointSettings)。
+ 當您建立端點時，您提供做為分號區隔清單的額外連線屬性。如需詳細資訊，請參閱[使用 Amazon S3 做為 目標時的端點設定 AWS DMS](#CHAP_Target.S3.Configuring)。

## Amazon S3 物件標記
<a name="CHAP_Target.S3.Tagging"></a>

您可以在任務-資料表映射規則中指定適當的 JSON 物件，以標記複寫執行個體建立的 Amazon S3 物件。如需 S3 物件標記的需求和選項的詳細資訊 (包括有效標籤名稱)，請參閱《*Amazon Simple Storage Service 使用者指南*》中的「[物件標記](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-tagging.html)」。如需有關使用 JSON 來映射資料表的詳細資訊，請參閱[使用 JSON 指定資料表選擇及轉換](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.md)。

對於為指定的資料表和結構描述建立的 S3 物件，請使用 `selection` 規則類型的一或多個 JSON 物件來這些標記 S3 物件。然後，在此 `selection` 物件 (或多個物件) 後面，加上具有 `post-processing` 規則類型和 `add-tag` 動作的一或多個 JSON 物件。這些後續處理規則識別您要標記的 S3 物件，並針對您要新增到這些 S3 物件的標籤，指定其名稱和值。

在以下資料表中，您可以找到在 `post-processing` 規則類型的 JSON 物件中指定的參數。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.S3.html)

當您指定多個 `post-processing` 規則類型來標記一組 S3 物件時，將會從一個後續處理規則中只使用一個 `tag-set` 物件來標記每個 S3 物件。如果後續處理規則相關聯的物件定位器最符合某個 S3 物件，則會使用此規則中的特定標籤組來標記該 S3 物件。

例如，假設兩個後續處理規則識別相同的 S3 物件。也假設其中一個規則的物件定位器使用萬用字元，而另一個規則的物件定位器使用完全相符來識別 S3 物件 (不含萬用字元)。在這種情況下，與採用完全相符的後續處理規則相關聯的標籤組會用來標記 S3 物件。如果多個後續處理規則都同樣符合指定的 S3 物件，則會使用與第一個後續處理規則相關聯的標籤組來標記物件。

**Example 將靜態標籤新增到為單一資料表和結構描述建立的 S3 物件**  
以下選擇規則和後續處理規則將三個標籤 (`tag_1`、`tag_2` 和 `tag_3` 連同對應的靜態值 `value_1`、`value_2` 和 `value_3`) 新增到建立的 S3 物件。此 S3 物件對應到名為 `STOCK` 的來源和名為 `aat2` 的結構描述中的單一資料表。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "5",
            "rule-name": "5",
            "object-locator": {
                "schema-name": "aat2",
                "table-name": "STOCK"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "post-processing",
            "rule-id": "41",
            "rule-name": "41",
            "rule-action": "add-tag",
            "object-locator": {
                "schema-name": "aat2",
                "table-name": "STOCK"
            },
            "tag-set": [
              {
                "key": "tag_1",
                "value": "value_1"
              },
              {
                "key": "tag_2",
                "value": "value_2"
              },
              {
                "key": "tag_3",
                "value": "value_3"
              }                                     
           ]
        }
    ]
}
```

**Example 將靜態和動態標籤新增到為多個資料表和結構描述建立的 S3 物件**  
以下範例有一個選擇規則和兩個後續處理規則，其中，來源的輸入包含所有資料表及其所有結構描述。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "post-processing",
            "rule-id": "21",
            "rule-name": "21",
            "rule-action": "add-tag",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%",
            },
            "tag-set": [
              { 
                "key": "dw-schema-name",
                "value":"${schema-name}"
              },
              {
                "key": "dw-schema-table",
                "value": "my_prefix_${table-name}"
              }
            ]
        },
        {
            "rule-type": "post-processing",
            "rule-id": "41",
            "rule-name": "41",
            "rule-action": "add-tag",
            "object-locator": {
                "schema-name": "aat",
                "table-name": "ITEM",
            },
            "tag-set": [
              {
                "key": "tag_1",
                "value": "value_1"
              },
              {
                "key": "tag_2",
                "value": "value_2"
              }           ]
        }
    ]
}
```
第一個後續處理規則將兩個標籤 (`dw-schema-name` 和 `dw-schema-table`) 連同對應的動態值 (`${schema-name}` 和 `my_prefix_${table-name}`)，新增到幾乎所有在目標中建立的 S3 物件。例外的是以第二個後續處理規則所識別和標記的 S3 物件。因此，對於萬用字元物件定位器所識別的每個目標 S3 物件，用來建立物件的標籤會識別物件在來源中對應的結構描述和資料表。  
第二個後續處理規則將 `tag_1` 和 `tag_2` 連同對應的靜態值 `value_1` 和 `value_2`，新增到完全相符物件定位器識別的所建立 S3 物件。這個建立的 S3 物件對應到名為 `ITEM` 的來源和名為 `aat` 的結構描述中的單一資料表。因為是完全相符，這些標籤在此物件上會取代從第一個後續處理規則新增的任何標籤，而此規則僅以萬用字元比對 S3 物件。

**Example 將動態標籤名稱和值新增至 S3 物件**  
以下範例有兩個選擇規則和一個後續處理規則。其中，來源的輸入只在 `retail` 或 `wholesale` 結構描述中包含 `ITEM` 資料表。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "retail",
                "table-name": "ITEM"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "wholesale",
                "table-name": "ITEM"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "post-processing",
            "rule-id": "21",
            "rule-name": "21",
            "rule-action": "add-tag",
            "object-locator": {
                "schema-name": "%",
                "table-name": "ITEM",
            },
            "tag-set": [
              { 
                "key": "dw-schema-name",
                "value":"${schema-name}"
              },
              {
                "key": "dw-schema-table",
                "value": "my_prefix_ITEM"
              },
              {
                "key": "${schema-name}_ITEM_tag_1",
                "value": "value_1"
              },
              {
                "key": "${schema-name}_ITEM_tag_2",
                "value": "value_2"
              }
            ]
    ]
}
```
後續處理規則的標籤組將兩個標籤 (`dw-schema-name` 和 `dw-schema-table`) 新增到目標中為 `ITEM` 資料表建立的所有 S3 物件。第一個標籤有動態值 `"${schema-name}"`，第二個標籤有靜態值 `"my_prefix_ITEM"`。因此，對於每個目標 S3 物件，用來建立物件的標籤會識別物件在來源中對應的結構描述和資料表。  
此外，標籤組還以動態名稱 (`${schema-name}_ITEM_tag_1` 和 `"${schema-name}_ITEM_tag_2"`) 新增兩個額外的標籤。這些具有對應的靜態值 `value_1` 和 `value_2`。因此，這些標籤將各以目前結構描述 `retail` 或 `wholesale` 來命名。您無法在此物件中建立重複的動態標籤名稱，因為每個物件是針對單一唯一結構描述名稱而建立。結構描述名稱用於建立其他唯一的標籤名稱。

## 建立 AWS KMS 金鑰來加密 Amazon S3 目標物件
<a name="CHAP_Target.S3.KMSKeys"></a>

您可以建立和使用自訂 AWS KMS 金鑰來加密 Amazon S3 目標物件。在建立 KMS 金鑰之後，當您建立 S3 目標端點時，您可以使用以下其中一個方法，以此金鑰來加密物件：
+ 當您使用 AWS CLI執行 `create-endpoint` 命令時，對 S3 目標物件 (使用預設 .csv 檔案儲存格式) 使用以下選項。

  ```
  --s3-settings '{"ServiceAccessRoleArn": "your-service-access-ARN", 
  "CsvRowDelimiter": "\n", "CsvDelimiter": ",", "BucketFolder": "your-bucket-folder", 
  "BucketName": "your-bucket-name", "EncryptionMode": "SSE_KMS", 
  "ServerSideEncryptionKmsKeyId": "your-KMS-key-ARN"}'
  ```

  在這裡，您的 -`your-KMS-key-ARN` 是 KMS 金鑰的 Amazon Resource Name (ARN)，而且您的 IAM 角色必須具有存取許可，請參閱 [在您的 Amazon S3 目標上使用資料加密、parquet 檔案和 CDC](#CHAP_Target.S3.EndpointSettings)。
+ 將額外連線屬性 `encryptionMode` 設定為值 `SSE_KMS`，將額外連線屬性 `serverSideEncryptionKmsKeyId` 設定為 KMS 金鑰的 ARN。如需詳細資訊，請參閱[使用 Amazon S3 做為 目標時的端點設定 AWS DMS](#CHAP_Target.S3.Configuring)。

若要使用 KMS 金鑰加密 Amazon S3 目標物件，您需要一個具備 Amazon S3 儲存貯體存取許可的 IAM 角色。將政策 (金鑰政策) 連接到您建立的加密金鑰，然後在該政策中存取此 IAM 角色。若要這麼做，您可以在 IAM 主控台建立下列項目：
+ 具備 Amazon S3 儲存貯體存取許可的政策。
+ 搭配此政策的 IAM 角色。
+ KMS 金鑰加密金鑰搭配參考此角色的金鑰政策。

下列程序說明作法。

**建立具備 Amazon S3 儲存貯體存取許可的 IAM 政策**

1. 前往 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選擇 **Policies (政策)**。**Policies (政策)** 頁面隨即開啟。

1. 選擇**建立政策**。**Create policy (建立政策)** 頁面隨即開啟。

1. 選擇 **Service (服務)**，然後選擇 **S3**。將出現動作許可清單。

1. 選擇 **Expand all (全部展開)** 來展開清單，然後至少選擇以下許可：
   + **ListBucket**
   + **PutObject**
   + **DeleteObject**

   選擇您需要的任何其他許可，然後選擇 **Collapse all (全部折疊)** 來折疊清單。

1. 選擇 **Resources (資源)** 以指定想要存取的資源。至少選擇**所有資源**，以提供一般 Amazon S3 資源存取。

1. 新增您需要的任何其他條件或許可，然後選擇 **Review policy (檢閱政策)**。在 **Review policy (檢閱政策)** 頁面檢查您的結果。

1. 確認是您需要的設定後，輸入政策的名稱 (例如，`DMS-S3-endpoint-access`) 和任何描述，然後選擇 **Create policy (建立政策)**。**Policies (政策)** 頁面隨即開啟，並以訊息指出已建立您的政策。

1. 在 **Policies (政策)** 清單中搜尋並選擇政策名稱。將會出現 **Summary (總結)** 頁面，其中顯示類似以下的政策 JSON。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "VisualEditor0",
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject",
                   "s3:ListBucket",
                   "s3:DeleteObject"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

現在，您已經以指定的名稱建立新政策來存取要加密的 Amazon S3 資源，例如 `DMS-S3-endpoint-access`。

**建立搭配此政策的 IAM 角色**

1. 在 IAM 主控台的導覽窗格中，選擇**角色**。**Roles (角色)** 詳細資訊頁面隨即開啟。

1. 選擇建**立角色**。**Create role (建立角色)** 頁面隨即開啟。

1. 選取 AWS 服務做為信任的實體後，選擇 **DMS** 做為服務以使用 IAM 角色。

1. 選擇**下一步：許可**。**建立角色**頁面中隨即出現**連接許可政策**檢視。

1. 尋找並選取您在之前程序中 (`DMS-S3-endpoint-access`) 建立 IAM 角色的 IAM 政策。

1. 選擇下**一步：標籤**。**建立角色**頁面中隨即顯示**新增標籤**檢視。在此，可以增加您想要的任何標籤。

1. 選擇下**一步：檢閱**。**建立角色**頁面中隨即顯示**檢閱**檢視。您可以在這裡驗證結果。

1. 確認是您需要的設定後，輸入角色的名稱 (必要，例如 `DMS-S3-endpoint-access-role`) 和任何額外的描述，然後選擇 **Create role (建立角色)**。**Roles (角色)** 詳細資訊頁面隨即開啟，並以訊息指出已建立您的角色。

現在，您已經以指定的名稱建立新角色，用於存取要加密的 Amazon S3 資源，例如 `DMS-S3-endpoint-access-role`。

**搭配參考 IAM 角色的金鑰政策來建立 KMS 金鑰加密金鑰**
**注意**  
如需 AWS DMS 如何使用 AWS KMS 加密金鑰的詳細資訊，請參閱 [設定加密金鑰並指定 AWS KMS 許可](CHAP_Security.md#CHAP_Security.EncryptionKey)。

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/kms](https://console.aws.amazon.com/kms) 的 AWS Key Management Service (AWS KMS) 主控台。

1. 若要變更 AWS 區域，請使用頁面右上角的區域選擇器。

1. 在導覽窗格中，選擇 **Customer managed keys** (客戶受管金鑰)。

1. 選擇**建立金鑰**。**Configure key (設定金鑰)** 頁面隨即開啟。

1. 針對 **Key type (金鑰類型)**，請選擇 **Symmetric (對稱)**。
**注意**  
建立此金鑰時，您只能建立對稱金鑰，因為 Amazon S3 等所有 AWS 服務都只能使用對稱加密金鑰。

1. 選擇 **Advanced Options (進階選項)**。針對 **Key material origin (金鑰材料來源)**，請確認已選擇 **KMS**，然後選擇 **Next (下一步)**。**Add labels (新增標籤)** 頁面隨即開啟。

1. 針對 **Create alias and description (建立別名和描述)**，請輸入一個金鑰別名 (例如，`DMS-S3-endpoint-encryption-key`) 和任何額外的描述。

1. 針對 **Tags (標籤)**，請新增您想要的任何標籤以協助識別金鑰和追蹤其使用情況，然後選擇 **Next (下一步)**。**Define key administrative permissions (定義金鑰管理許可)** 頁面隨即開啟，其中顯示您可以選擇的使用者和角色清單。

1. 新增您想要的使用者和角色來管理金鑰。請確定這些使用者和角色具有管理金鑰所需的許可。

1. 針對 **Key deletion (金鑰刪除)**，請選擇金鑰管理員是否可以刪除金鑰，然後選擇 **Next (下一步)**。**Define key usage permissions (定義金鑰使用許可)** 頁面隨即開啟，其中顯示您可以選擇的額外使用者和角色清單。

1. 針對**此帳戶**，選擇您要對 Amazon S3 目標執行密碼編譯操作的可用使用者。並請選擇您之前在**角色**中建立的角色，以啟用存取來加密 Amazon S3 目標物件，例如 `DMS-S3-endpoint-access-role`。

1. 如果您想要新增其他未列出的帳戶以擁有相同的存取權，請針對**其他 AWS 帳戶**選擇**新增另一個 AWS 帳戶**，然後選擇**下一步**。**Review and edit key policy (檢閱並編輯金鑰政策)** 頁面隨即開啟，並顯示金鑰政策的 JSON，您可以透過輸入現有 JSON 來執行檢閱和編輯。在此，您可以查看金鑰政策於何處參考您在上一步所選擇的角色與使用者 (例如 `Admin` 和 `User1`)。您也可以查看不同委託人 (使用者和角色) 允許的不同金鑰動作，如以下範例所示。

------
#### [ JSON ]

****  

   ```
   {
       "Id": "key-consolepolicy-3",
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "Enable IAM User Permissions",
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::111122223333:root"
                   ]
               },
               "Action": "kms:*",
               "Resource": "*"
           },
           {
               "Sid": "Allow access for Key Administrators",
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::111122223333:role/Admin"
                   ]
               },
               "Action": [
                   "kms:Create*",
                   "kms:Describe*",
                   "kms:Enable*",
                   "kms:List*",
                   "kms:Put*",
                   "kms:Update*",
                   "kms:Revoke*",
                   "kms:Disable*",
                   "kms:Get*",
                   "kms:Delete*",
                   "kms:TagResource",
                   "kms:UntagResource",
                   "kms:ScheduleKeyDeletion",
                   "kms:CancelKeyDeletion"
               ],
               "Resource": "*"
           },
           {
               "Sid": "Allow use of the key",
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::111122223333:role/DMS-S3-endpoint-access-role",
                       "arn:aws:iam::111122223333:role/Admin",
                       "arn:aws:iam::111122223333:role/User1"
                   ]
               },
               "Action": [
                   "kms:Encrypt",
                   "kms:Decrypt",
                   "kms:ReEncrypt*",
                   "kms:GenerateDataKey*",
                   "kms:DescribeKey"
               ],
               "Resource": "*"
           },
           {
               "Sid": "Allow attachment of persistent resources",
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::111122223333:role/DMS-S3-endpoint-access-role",
                       "arn:aws:iam::111122223333:role/Admin",
                       "arn:aws:iam::111122223333:role/User1"
                   ]
               },
               "Action": [
                   "kms:CreateGrant",
                   "kms:ListGrants",
                   "kms:RevokeGrant"
               ],
               "Resource": "*",
               "Condition": {
                   "Bool": {
                       "kms:GrantIsForAWSResource": true
                   }
               }
           }
       ]
   }
   ```

------

1. 選擇**完成**。**加密金鑰**頁面隨即開啟，並以訊息指出已建立您的 KMS 金鑰。

您現在已使用指定的別名建立新的 KMS 金鑰 (例如，`DMS-S3-endpoint-encryption-key`)。此金鑰可讓 AWS DMS 加密 Amazon S3 目標物件。

## 使用日期型資料夾分割
<a name="CHAP_Target.S3.DatePartitioning"></a>

AWS DMS 當您使用 Amazon S3 做為目標端點時， 會根據交易遞交日期支援 S3 資料夾分割區。透過日期型資料夾分割，您可以將資料從單一來源資料表寫入 S3 儲存貯體中的時間階層資料夾結構。透過在建立 S3 目標端點時分割資料夾，您可以實現下列事項：
+ 更妥善管理您的 S3 物件
+ 限制每個 S3 資料夾的大小
+ 最佳化資料湖查詢或其他後續作業

在建立 S3 目標端點時，您可以啟用日期型資料夾分割。您可以在遷移現有資料並複寫持續的變更 (完全載入 \$1 CDC) 或僅複寫資料變更 (僅限 CDC) 時啟用此功能。當您遷移現有資料並複寫持續變更時，只會分割持續變更。使用下列目標端點設定：
+ `DatePartitionEnabled` – 根據日期指定分區。將此布林選項設為 `true` 時，此參數會根據交易遞交日期對 S3 儲存貯體資料夾進行分割。

  您不能將此設定與 `PreserveTransactions` 或 `CdcPath` 搭配使用。

  預設值為 `false`。
+ `DatePartitionSequence` – 識別資料夾分割期間要使用的日期格式順序。將此 ENUM 選項設置為 `YYYYMMDD`、`YYYYMMDDHH`、`YYYYMM`、`MMYYYYDD` 或 `DDMMYYYY`。預設值為 `YYYYMMDD`。當 `DatePartitionEnabled` 設定為 `true.` 時，請使用此項設定。
+ `DatePartitionDelimiter` – 指定資料夾分割期間要使用的日期分隔符號。將此 ENUM 選項設置為 `SLASH`、`DASH`、`UNDERSCORE` 或 `NONE`。預設值為 `SLASH`。當 `DatePartitionEnabled` 設定為 `true` 時，使用此項設定。
+ `DatePartitionTimezone` – 建立 S3 目標端點時，`DatePartitionTimezone`請將 設定為將目前的 UTC 時間轉換為指定的時區。建立日期分割區資料夾並產生 CDC 檔案名稱時，就會發生轉換。時區格式為「區域/位置」。在 `DatePartitionedEnabled` 設定為 時使用此參數`true`，如下列範例所示：

  ```
  s3-settings='{"DatePartitionEnabled": true, "DatePartitionSequence": "YYYYMMDDHH", "DatePartitionDelimiter": "SLASH", "DatePartitionTimezone":"Asia/Seoul", "BucketName": "dms-nattarat-test"}'
  ```

下列範例會示範如何啟用日期型的資料夾分割，並使用資料分割順序和分隔符號的預設值。它使用 . AWS CLI`create-endpoint`命令的 `--s3-settings '{json-settings}'`選項。

```
   --s3-settings '{"DatePartitionEnabled": true,"DatePartitionSequence": "YYYYMMDD","DatePartitionDelimiter": "SLASH"}'
```

## 使用 Amazon S3 做為 的目標時，分割來源的平行負載 AWS DMS
<a name="CHAP_Target.S3.ParallelLoad"></a>

您可以設定將分割資料來源平行完全載入到 Amazon S3 目標。此方法可改善將分割資料從支援的來源資料庫引擎遷移至 S3 目標的載入時間。若要改善分割來源資料的載入時間，您可以建立對應至來源資料庫中每個資料表分割區的 S3 目標子資料夾。這些分割區繫結子資料夾允許 AWS DMS 執行平行程序，以在目標上填入每個子資料夾。

若要設定 S3 目標的平行完全載入，S3 支援資料表對應 `table-settings` 規則的三種 `parallel-load` 規則類型：
+ `partitions-auto`
+ `partitions-list`
+ `ranges`

如需這些平行載入規則類型的詳細資訊，請參閱 [資料表和集合設定規則與操作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.md)。

對於 `partitions-auto` 和 `partitions-list` 規則類型， AWS DMS 會使用來源端點中的每個分割區名稱來識別目標子資料夾結構，如下所示。

```
bucket_name/bucket_folder/database_schema_name/table_name/partition_name/LOADseq_num.csv
```

此處，用於資料遷移和儲存的 S3 目標子資料夾路徑包含一個額外的 `partition_name` 子資料夾，該子資料夾對應至具有相同名稱的來源分割區。此 `partition_name` 子資料夾隨後會儲存一個或多個 `LOADseq_num.csv` 檔案，其中包含遷移自指定來源分割區的資料。此處`seq_num`是 .csv 檔案名稱上的序號後綴，例如`00000001`在 .csv 檔案中，名稱為 `LOAD00000001.csv`。

不過，某些資料庫引擎 (例如 MongoDB 和 DocumentDB) 並沒有分割區的概念。對於這些資料庫引擎， AWS DMS 會將執行中的來源區段索引新增為目標 .csv 檔案名稱的字首，如下所示。

```
.../database_schema_name/table_name/SEGMENT1_LOAD00000001.csv
.../database_schema_name/table_name/SEGMENT1_LOAD00000002.csv
...
.../database_schema_name/table_name/SEGMENT2_LOAD00000009.csv
.../database_schema_name/table_name/SEGMENT3_LOAD0000000A.csv
```

其中檔案 `SEGMENT1_LOAD00000001.csv` 和 `SEGMENT1_LOAD00000002.csv` 的命名會使用相同的執行中來源區段索引前綴 `SEGMENT1`。如此命名是因為這兩個 .csv 檔案的遷移來源資料都關聯至相同的執行中來源區段索引。另一方面，儲存在目標 `SEGMENT2_LOAD00000009.csv` 和 `SEGMENT3_LOAD0000000A.csv` 檔案中的遷移資料會分別關聯至不同的執行中來源區段索引。每個檔案都會在其檔案名稱前加上其正在執行的區段索引名稱，`SEGMENT2` 和 `SEGMENT3`。

對於 `ranges` 平行載入類型，您可以使用 `table-settings` 規則的 `columns` 和 `boundaries` 設定來定義欄名稱和欄值。透過這些規則，您可以指定與區段名稱對應的分割區，如下所示。

```
"parallel-load": {
    "type": "ranges",
    "columns": [
         "region",
         "sale"
    ],
    "boundaries": [
          [
               "NORTH",
               "1000"
          ],
          [
               "WEST",
               "3000"
          ]
    ],
    "segment-names": [
          "custom_segment1",
          "custom_segment2",
          "custom_segment3"
    ]
}
```

其中 `segment-names` 設定會定義 S3 目標上用於平行遷移資料的三個分割區名稱。遷移的資料會平行載入並依序儲存在分割區子資料夾下的 .csv 檔案中，如下所示。

```
.../database_schema_name/table_name/custom_segment1/LOAD[00000001...].csv
.../database_schema_name/table_name/custom_segment2/LOAD[00000001...].csv
.../database_schema_name/table_name/custom_segment3/LOAD[00000001...].csv
```

在這裡， 會將一系列 .csv 檔案 AWS DMS 存放在三個分割區子資料夾中。每個分割區子資料夾中的一系列 .csv 檔案會從 `LOAD00000001.csv` 開始遞增命名，直到所有資料遷移完成。

在某些情況下，您可能無法使用 `segment-names` 設定明確命名 `ranges` 平行載入類型的分割區子資料夾。在這些情況下， 會 AWS DMS 套用在其`table_name`子資料夾下建立每個系列 .csv 檔案的預設值。此時 AWS DMS 會在每個系列的 .csv 檔案的檔案名稱開頭加上執行中來源區段索引的名稱，如下所示。

```
.../database_schema_name/table_name/SEGMENT1_LOAD[00000001...].csv
.../database_schema_name/table_name/SEGMENT2_LOAD[00000001...].csv
.../database_schema_name/table_name/SEGMENT3_LOAD[00000001...].csv
...
.../database_schema_name/table_name/SEGMENTZ_LOAD[00000001...].csv
```

## 使用 Amazon S3 做為 目標時的端點設定 AWS DMS
<a name="CHAP_Target.S3.Configuring"></a>

您可以使用端點設定來設定您的 S3 目標資料庫，類似於使用額外的連線屬性。當您使用 AWS DMS 主控台或使用 中的 `create-endpoint`命令搭配 `--s3-settings '{"EndpointSetting": "value", ...}'` JSON 語法來建立目標端點時[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)，您可以指定設定。

**注意**  
DMS 會根據來源資料庫的遞交順序將變更寫入 Parquet 檔案，但在遷移多個資料表時，由於資料表層級分割，不會保留原始交易順序。若要維護交易序列資訊，請設定`TimestampColumnName`端點設定以包含每一列的來源遞交時間戳記，然後您可以在下游處理中使用它來重建原始交易序列。與提供 `PreserveTransactions`設定的 CSV 格式不同，Parquet 檔案會因為其單欄式儲存結構而以不同的方式處理交易，但此方法可準確追蹤來源遞交時間、支援遷移後交易訂單重建，並允許高效率資料處理，同時維持資料一致性。

下列資料表顯示您可搭配 Amazon S3 作為目標使用的端點設定。


| **選項** | **Description** | 
| --- | --- | 
| CsvNullValue |  選用參數，指定 如何處理 null AWS DMS 值。處理 Null 值時，您可以在寫入目標時使用此參數將使用者定義的字串作為 Null 傳遞。例如，目標資料行可為 Null 時，您可以使用此選項來區分空字串值和 Null 值。 預設值：`""` 有效值：任何有效字串 範例：`--s3-settings '{"CsvNullValue": "NULL"}'` 如果來源資料庫資料欄值為 null，在 S3 CSV 檔案中，資料欄值`NULL`不是「」字串。  | 
| AddColumnName |  設定為 `true` 或 `y` 的選用參數時，可用來將欄名稱資訊新增到 .csv 輸出檔。 您不能將此參數搭配 `PreserveTransactions` 或 `CdcPath` 使用。 預設值：`false` 有效值：`true`、`false`、`y`、`n` 範例：`--s3-settings '{"AddColumnName": true}'`  | 
| AddTrailingPaddingCharacter |  使用 S3 目標端點設定 `AddTrailingPaddingCharacter`，在字串資料上新增填補數。預設值為 `false`。 類型：布林值 範例：`--s3-settings '{"AddTrailingPaddingCharacter": true}'`  | 
| BucketFolder |  選用參數；可設定 S3 儲存貯體中的資料夾名稱。如果提供此參數，則目標物件會建立為路徑 `BucketFolder/schema_name/table_name/` 中的 .csv 或 .parquet 檔案。如果不指定此參數，則使用的路徑是 `schema_name/table_name/`。 範例：`--s3-settings '{"BucketFolder": "testFolder"}'`  | 
| BucketName |  S3 儲存貯體的名稱，S3 目標物件會在其中建立為 .csv 或 .parquet 檔案。 範例：`--s3-settings '{"BucketName": "buckettest"}'`  | 
| CannedAclForObjects |  讓 AWS DMS 將 S3 儲存貯體中建立之物件的預先定義 （固定） 存取控制清單指定為 .csv 或 .parquet 檔案的值。如需有關 Amazon S3 標準 ACL 的詳細資訊，請參閱《Amazon S3 開發人員指南》中的[標準 ACL](https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl)。 預設值：NONE 此屬性的有效值：NONE、PRIVATE、PUBLIC\$1READ、PUBLIC\$1READ\$1WRITE、AUTHENTICATED\$1READ、AWS\$1EXEC\$1READ、BUCKET\$1OWNER\$1READ、BUCKET\$1OWNER\$1FULL\$1CONTROL。 範例：`--s3-settings '{"CannedAclForObjects": "PUBLIC_READ"}'`  | 
| CdcInsertsOnly |  變更資料擷取 (CDC )期間的選用參數載入僅會寫入 INSERT 操作到逗號分隔值 (.csv) 檔案，或欄式儲存 (.parquet) 的輸出檔案。根據預設 (`false` 設定)，.csv 或 .parquet 記錄中的第一個欄位包含字母 I (插入)、U (更新) 或 D (刪除)。此字母指出資料列是否已插入、更新或刪除 CDC 載入至目標的來源資料庫。如果 `cdcInsertsOnly` 是設定為 `true` 或 `y`，只有從來源資料庫的 INSERT 會移轉至 .csv 或 .parquet 檔案。 僅針對 .csv 格式，這些 INSERTS 記錄取決於 `IncludeOpForFullLoad` 的值。如果 `IncludeOpForFullLoad` 設定為 `true`，每個 CDC 記錄的第一個欄位設定為 I，用來指示來源的 INSERT 操作。如果 `IncludeOpForFullLoad` 設定為 `false`，每個 CDC 記錄沒有第一個欄位，用來指示來源的 INSERT 操作。有關這些參數如何共同運作的更多資訊，請參閱 [在遷移的 S3 資料中指示來源資料庫操作](#CHAP_Target.S3.Configuring.InsertOps)。 預設值：`false` 有效值：`true`、`false`、`y`、`n` 範例：`--s3-settings '{"CdcInsertsOnly": true}'`  | 
| CdcInsertsAndUpdates |  啟用變更資料擷取 (CDC) 載入，以將 INSERT (插入) 和 UPDATE (更新) 操作寫入 .csv 或 .parquet (直欄式儲存) 輸出檔案。預設設定為 `false`，但是當 `cdcInsertsAndUpdates` 設定為 `true` 或 `y` 時，來源資料庫的 INSERT 和 UPDATE 會移轉至 .csv 或 .parquet 檔案。 這些 INSERT 和 UPDATE 的記錄，取決於 `includeOpForFullLoad` 參數的值 (僅適用於 .csv 檔案格式)。如果 `includeOpForFullLoad` 設為 `true`，則每個 CDC 記錄的第一個欄位都會設為 `I` 或 `U`，以指示來源的 INSERT 和 UPDATE 操作。但是，如果 `includeOpForFullLoad` 設定為 `false`，則 CDC 記錄會在沒有來源的 INSERT 或 UPDATE 操作指示的狀態下被寫入。  有關這些參數如何共同運作的更多資訊，請參閱 [在遷移的 S3 資料中指示來源資料庫操作](#CHAP_Target.S3.Configuring.InsertOps)。  `CdcInsertsOnly` 與 `cdcInsertsAndUpdates` 不能在同一個端點都設為 true。對於同一端點，可將 `cdcInsertsOnly` 或 `cdcInsertsAndUpdates` 設定為 `true`，但不能同時將兩者設定為此參數。  預設值：`false` 有效值：`true`、`false`、`y`、`n` 範例：`--s3-settings '{"CdcInsertsAndUpdates": true}'`  | 
|  `CdcPath`  |  指定 CDC 檔案的資料夾路徑。對於 S3 來源，如果任務要擷取變更資料，此設定即為必要，否則即為選用。如果已設定 `CdcPath`，則 DMS 會從這個路徑讀取 CDC 檔案，並將資料變更複寫到目標端點。對於 S3 目標，若 `PreserveTransactions` 設定為 true，DMS 會驗證您已將此參數設定為 S3 目標上的資料夾路徑，可用於儲存 CDC 載入的交易順序。DMS 會在 S3 目標工作目錄或由 `BucketFolder` 和 `BucketName` 指定的 S3 目標位置中建立此 CDC 資料夾路徑。 您不能將此參數搭配 `DatePartitionEnabled` 或 `AddColumnName` 使用。 類型：字串 例如，如果您將 `CdcPath` 指定為 `MyChangedData`，將 `BucketName` 指定為 `MyTargetBucket`，但不指定 `BucketFolder`，DMS 將建立以下 CDC 資料夾路徑：`MyTargetBucket/MyChangedData`。 如果您指定相同的 `CdcPath`，且將 `BucketName` 指定為 `MyTargetBucket`，將 `BucketFolder` 指定為 `MyTargetData`，DMS 會建立以下 CDC 資料夾路徑：`MyTargetBucket/MyTargetData/MyChangedData`。 3.4.2 版和更新 AWS DMS 版本支援此設定。 依交易順序擷取資料變更時，無論目標上的 DataFormat S3 設定值為何，DMS 一律會將資料列變更儲存在 .csv 檔案中。   | 
|  `CdcMaxBatchInterval`  |  將檔案輸出到 Amazon S3 的間隔長度條件上限（以秒定義）。 預設值：60 秒 指定 `CdcMaxBatchInterval` 並指定 `CdcMinFileSize` 時，將由最先符合的參數條件觸發檔案寫入。  從 3.5.3 AWS DMS 版開始，使用 PostgreSQL 或 Aurora PostgreSQL 做為來源和 Amazon S3 搭配 Parquet 做為目標時，`confirmed_flush_lsn`更新的頻率取決於目標端點設定為保留在記憶體中的資料量。只有在將記憶體中的資料寫入 Amazon S3 之後， 才會 AWS DMS 將 `confirmed_flush_lsn` 傳回來源。如果您將 `CdcMaxBatchInterval` 參數設定為較高的值，您可能會在來源資料庫上觀察到增加的複寫槽用量。   | 
|  `CdcMinFileSize`  |  將檔案輸出到 Amazon S3 的檔案大小條件下限 (以 KB 定義)。 預設值：32000 KB 指定 `CdcMinFileSize` 並指定 `CdcMaxBatchInterval` 時，將由最先符合的參數條件觸發檔案寫入。  | 
|  `PreserveTransactions`  |  如果設為 `true`，DMS 將在 `CdcPath` 指定的 Amazon S3 目標上儲存變更資料擷取 (CDC) 的交易順序。 您不能將此參數搭配 `DatePartitionEnabled` 或 `AddColumnName` 使用。 類型：布林值 依交易順序擷取資料變更時，無論目標上的 DataFormat S3 設定值為何，DMS 一律會將資料列變更儲存在 .csv 檔案中。 3.4.2 版和更新 AWS DMS 版本支援此設定。   | 
| IncludeOpForFullLoad |  完全載入期間的選用參數，僅會寫入 INSERT 操作到逗號分隔值 (.csv) 輸出檔案。 針對完全載入，記錄僅能插入。在預設情況下 ( `false` 設定)，完全載入中沒有資訊記錄於輸出檔中用來指示該資料列插入來源資料庫。如果 `IncludeOpForFullLoad` 設定為 `true` 或 `y`，INSERT 記錄為 I 作為 .csv 檔案的第一個欄位的註釋。  此參數與 `CdcInsertsOnly` 或 `CdcInsertsAndUpdates` 共同運作，僅適用於輸出到 .csv 檔案。有關這些參數如何共同運作的更多資訊，請參閱 [在遷移的 S3 資料中指示來源資料庫操作](#CHAP_Target.S3.Configuring.InsertOps)。  預設值：`false` 有效值：`true`、`false`、`y`、`n` 範例：`--s3-settings '{"IncludeOpForFullLoad": true}'`  | 
| CompressionType |  設定為 時使用 `GZIP` GZIP 壓縮目標 .csv 檔案時的選用參數。此參數設為預設值時，不壓縮檔案。 預設值：`NONE` 有效值：`GZIP` 或 `NONE` 範例：`--s3-settings '{"CompressionType": "GZIP"}'`  | 
| CsvDelimiter |  在 .csv 來源檔案中用於區隔欄的分隔符號。預設為逗號 (,)。 範例：`--s3-settings '{"CsvDelimiter": ","}'`  | 
| CsvRowDelimiter |  在 .csv 來源檔案中用於區隔列的分隔符號。預設為新行 (\$1n)。 範例：`--s3-settings '{"CsvRowDelimiter": "\n"}'`  | 
|   `MaxFileSize`   |  對於完全載入期間遷移到 S3 目標時要建立的任何 .csv 檔案，此值指定其大小上限 (KB)。 預設值：1048576 KB (1 GB) 有效值：1–1,048,576 範例：`--s3-settings '{"MaxFileSize": 512}'`  | 
| Rfc4180 |  選用參數，對於只使用 .csv 檔案格式遷移到 Amazon S3 的資料，用來設定 RFC 合規行為。當此值設定為 `y` `true`或使用 Amazon S3 做為目標時，如果資料中包含引號、逗號或換行字元， 會使用額外的雙引號 (") AWS DMS 括住整欄。資料內的每個引號都會重複兩次。此格式遵守 RFC 4180。 預設值：`true` 有效值：`true`、`false`、`y`、`n` 範例：`--s3-settings '{"Rfc4180": false}'`  | 
| EncryptionMode |  對於複製到 S3 的 .csv 或 .parquet 物件檔案，您想要用來加密檔案的伺服器端加密模式。有效值為 `SSE_S3` (S3 伺服器端加密) 或 `SSE_KMS` (KMS 金鑰加密)。如果您選擇 `SSE_KMS`，請將 `ServerSideEncryptionKmsKeyId` 參數設定為用於加密的 KMS 金鑰的 Amazon Resource Name (ARN)。  您也可以使用 CLI `modify-endpoint` 命令將現有端點的 `EncryptionMode` 屬性值從 `SSE_KMS` 變更為 `SSE_S3`。但您不能將 `EncryptionMode` 值從 `SSE_S3` 變更為 `SSE_KMS`。  預設值：`SSE_S3` 有效值：`SSE_S3` 或 `SSE_KMS` 範例：`--s3-settings '{"EncryptionMode": SSE_S3}'`  | 
| ServerSideEncryptionKmsKeyId |  如果您將 `EncryptionMode` 設定為 `SSE_KMS`，請將此參數設定為 KMS 金鑰的 Amazon Resource Name (ARN)。您可以在為您的帳戶建立的金鑰清單中選取 AWS KMS 金鑰別名，以尋找此 ARN。當您建立金鑰時，您必須將特定政策和角色與此 KMS 金鑰建立關聯。如需詳細資訊，請參閱[建立 AWS KMS 金鑰來加密 Amazon S3 目標物件](#CHAP_Target.S3.KMSKeys)。 範例：`--s3-settings '{"ServerSideEncryptionKmsKeyId":"arn:aws:kms:us-east-1:111122223333:key/11a1a1a1-aaaa-9999-abab-2bbbbbb222a2"}'`  | 
| DataFormat |   AWS DMS 用來建立 S3 物件之檔案的輸出格式。對於 Amazon S3 目標， AWS DMS 支援 .csv 或 .parquet 檔案。.parquet 檔案具有二進位單欄式儲存格式，以及有效率的壓縮選項和更快速的查詢效能。如需 .parquet 檔案的詳細資訊，請參閱 [https://parquet.apache.org/](https://parquet.apache.org/)。 預設值：`csv` 有效值：`csv` 或 `parquet` 範例：`--s3-settings '{"DataFormat": "parquet"}'`  | 
| EncodingType |  Parquet 編碼類型。編碼類型選項包括下列項目： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.S3.html) 預設值：`rle-dictionary` 有效值：`rle-dictionary`、`plain` 或 `plain-dictionary` 範例：`--s3-settings '{"EncodingType": "plain-dictionary"}'`  | 
| DictPageSizeLimit |  .parquet 檔案中一個字典頁面允許的大小上限 (以位元組為單位)。如果字典頁面超過此值，頁面會使用純文字編碼。 預設值：1,024,000 (1 MB) 有效值：任何有效的整數值 範例：`--s3-settings '{"DictPageSizeLimit": 2,048,000}'`  | 
| RowGroupLength |  .parquet 檔案的一個資料列群組的列數。 預設值：10,024 (10 KB) 有效值：任何有效的整數 範例：`--s3-settings '{"RowGroupLength": 20,048}'`  | 
| DataPageSize |  .parquet 檔案中一個資料頁面允許的大小上限 (以位元組為單位)。 預設值：1,024,000 (1 MB) 有效值：任何有效的整數 範例：`--s3-settings '{"DataPageSize": 2,048,000}'`  | 
| ParquetVersion |  .parquet 檔案格式的版本。 預設值：`PARQUET_1_0` 有效值：`PARQUET_1_0` 或 `PARQUET_2_0` 範例：`--s3-settings '{"ParquetVersion": "PARQUET_2_0"}'`  | 
| EnableStatistics |  設為 `true` 或 `y`，啟用有關 .parquet 檔案頁面和資料列群組的統計資料。 預設值：`true` 有效值：`true`、`false`、`y`、`n` 範例：`--s3-settings '{"EnableStatistics": false}'`  | 
| TimestampColumnName |  選用參數；可包含在 S3 目標端點資料的時間戳記欄位。 AWS DMS 當您`TimestampColumnName`將 設定為非空白值時， 會在遷移資料的 .csv 或 .parquet 物件檔案中包含額外的`STRING`資料欄。 針對完全載入，此時間戳記欄位的每一資料列，包含一個資料透過 DMS 從來源移轉至目標的時間戳記。 針對 CDC 載入，每個資料列的時間戳記欄位，包含該列在來源資料庫認可的時間戳記。 此時間戳記欄位值的字串格式為 `yyyy-MM-dd HH:mm:ss.SSSSSS`。根據預設，此值的精確度是以毫秒為單位。針對 CDC 載入，精確度的捨入取決於 DMS 來源資料庫支援的遞交時間戳記。 當 `AddColumnName` 參數設為 `true`，DMS 還包含您設定的時間戳記欄的名稱，就是您設定為非空白值的 `TimestampColumnName`。 範例：`--s3-settings '{"TimestampColumnName": "TIMESTAMP"}'`  | 
| UseTaskStartTimeForFullLoadTimestamp |  設定為 `true` 時，此參數會使用任務開始時間 (而非資料寫入目標的時間) 作為時間戳記資料行值。對於完全載入，`UseTaskStartTimeForFullLoadTimestamp` 設定為 `true` 時，時間戳記資料行的每個資料列皆包含任務開始時間。針對 CDC 載入，時間戳記資料行的每個資料列皆包含交易遞交時間。 `UseTaskStartTimeForFullLoadTimestamp` 設定為 `false` 時，時間戳記資料行中的完全載入時間戳記會隨著資料到達目標的時間而遞增。 預設值：`false` 有效值：`true`、`false` 範例：`--s3-settings '{"UseTaskStartTimeForFullLoadTimestamp": true}'` `UseTaskStartTimeForFullLoadTimestamp: true` 協助讓完全載入的 S3 目標 `TimestampColumnName` 可以根據 CDC 載入的 `TimestampColumnName` 進行排序。  | 
| ParquetTimestampInMillisecond |  選用參數，用來指定以 .parquet 格式寫入至 S3 物件之任何 `TIMESTAMP` 欄位值的精確度。 當此屬性設定為 `true`或 時`y`， 會以毫秒精確度 AWS DMS 寫入 .parquet 格式檔案中的所有資料`TIMESTAMP`欄。否則，DMS 會在精確度為微秒的情況下寫入它們。 目前， Amazon Athena 和 AWS Glue 只能處理 `TIMESTAMP`值的毫秒精確度。對於 .parquet 格式的 S3 端點物件檔案，只在您計劃使用 Athena 或 AWS Glue來查詢或處理資料時，才會將此屬性設定為 true。    AWS DMS 會以微秒的精確度，將任何資料`TIMESTAMP`欄值寫入 .csv 格式的 S3 檔案。   此屬性的設定對於透過設定 `TimestampColumnName` 屬性來插入之時間戳記欄位值的字串格式沒有影響。    預設值：`false` 有效值：`true`、`false`、`y`、`n` 範例：`--s3-settings '{"ParquetTimestampInMillisecond": true}'`  | 
| GlueCatalogGeneration |  若要產生 AWS Glue Data Catalog，請將此端點設定設為 `true`。 預設值：`false` 有效值：`true`、`false`。 範例：`--s3-settings '{"GlueCatalogGeneration": true}'` **注意：**請勿將 `GlueCatalogGeneration` 搭配 `PreserveTransactions` 和 `CdcPath` 使用。  | 

## 使用 AWS Glue Data Catalog 搭配 的 Amazon S3 目標 AWS DMS
<a name="CHAP_Target.S3.GlueCatalog"></a>

AWS Glue 是一種 服務，提供簡單的資料分類方式，由名為 的中繼資料儲存庫組成 AWS Glue Data Catalog。您可以將 AWS Glue Data Catalog 與您的 Amazon S3 目標端點整合，並透過 Amazon Athena 等 AWS 其他服務查詢 Amazon S3 資料。 Amazon Athena Amazon Redshift 使用 ， AWS Glue 但 AWS DMS 不支援該選項做為預先建置的選項。

若要產生資料目錄，請將`GlueCatalogGeneration`端點設定設為 `true`，如下列 AWS CLI 範例所示。

```
aws dms create-endpoint --endpoint-identifier s3-target-endpoint 
            --engine-name s3 --endpoint-type target--s3-settings '{"ServiceAccessRoleArn": 
            "your-service-access-ARN", "BucketFolder": "your-bucket-folder", "BucketName": 
            "your-bucket-name", "DataFormat": "parquet", "GlueCatalogGeneration": true}'
```

對於包含 `csv` 類型資料的完全載入複製任務，請將 `IncludeOpForFullLoad` 設定為 `true`。

請勿將 `GlueCatalogGeneration` 搭配 `PreserveTransactions` 和 `CdcPath` 使用。 AWS Glue 爬蟲程式無法協調存放在指定 下檔案的不同結構描述`CdcPath`。

若要讓 Amazon Athena 為您的 Amazon S3 資料建立索引，以及透過 Amazon Athena 使用標準 SQL 查詢來查詢資料，連接到端點的 IAM 角色必須具有下列政策：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	  
    "Statement": [ 
        {
            "Effect": "Allow", 
            "Action": [
                "s3:GetBucketLocation", 
                "s3:GetObject",
                "s3:ListBucket", 
                "s3:ListBucketMultipartUploads", 
                "s3:ListMultipartUploadParts", 
                "s3:AbortMultipartUpload" 
            ], 
            "Resource": [
                "arn:aws:s3:::bucket123", 
                "arn:aws:s3:::bucket123/*" 
            ]
        },
        {
            "Effect": "Allow", 
            "Action": [ 
                "glue:CreateDatabase", 
                "glue:GetDatabase", 
                "glue:CreateTable", 
                "glue:DeleteTable", 
                "glue:UpdateTable", 
                "glue:GetTable", 
                "glue:BatchCreatePartition", 
                "glue:CreatePartition", 
                "glue:UpdatePartition", 
                "glue:GetPartition", 
                "glue:GetPartitions", 
                "glue:BatchGetPartition"
            ], 
            "Resource": [
                "arn:aws:glue:*:111122223333:catalog", 
                "arn:aws:glue:*:111122223333:database/*", 
                "arn:aws:glue:*:111122223333:table/*" 
            ]
        }, 
        {
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "athena:GetQueryExecution", 
                "athena:CreateWorkGroup"
            ],
            "Resource": "arn:aws:athena:*:111122223333:workgroup/glue_catalog_generation_for_task_*"
        }
    ]
}
```

------

**參考**
+ 如需詳細資訊 AWS Glue，請參閱《 *AWS Glue 開發人員指南*[》中的概念](https://docs.aws.amazon.com//glue/latest/dg/components-key-concepts.html)。
+ 如需詳細資訊， AWS Glue Data Catalog 請參閱《 *AWS Glue 開發人員指南*》中的[元件](https://docs.aws.amazon.com/glue/latest/dg/components-overview.html)。

## 在您的 Amazon S3 目標上使用資料加密、parquet 檔案和 CDC
<a name="CHAP_Target.S3.EndpointSettings"></a>

您可以使用 S3 目標端點設定來設定下列項目：
+ 用於加密 S3 目標物件的自訂 KMS 金鑰。
+ 做為 S3 目標物件儲存格式的 Parquet 檔案。
+ 在 S3 目標上包含交易順序之擷取資料變更 (CDC)。
+  AWS Glue Data Catalog 與您的 Amazon S3 目標端點整合，並透過 Amazon Athena 等其他服務查詢 Amazon S3 資料。 Amazon Athena

### AWS KMS 資料加密的金鑰設定
<a name="CHAP_Target.S3.EndpointSettings.KMSkeys"></a>

以下範例說明設定自訂的 KMS 金鑰，以加密您的 S3 目標物件。若要啟動，您可以執行下列 `create-endpoint` CLI 命令。

```
aws dms create-endpoint --endpoint-identifier s3-target-endpoint --engine-name s3 --endpoint-type target 
--s3-settings '{"ServiceAccessRoleArn": "your-service-access-ARN", "CsvRowDelimiter": "\n", 
"CsvDelimiter": ",", "BucketFolder": "your-bucket-folder", 
"BucketName": "your-bucket-name", 
"EncryptionMode": "SSE_KMS", 
"ServerSideEncryptionKmsKeyId": "arn:aws:kms:us-east-1:111122223333:key/72abb6fb-1e49-4ac1-9aed-c803dfcc0480"}'
```

其中，`--s3-settings` 選項指定的 JSON 物件定義兩個參數。一個是 `EncryptionMode` 參數，值為 `SSE_KMS`。另一個是 `ServerSideEncryptionKmsKeyId` 參數，值為 `arn:aws:kms:us-east-1:111122223333:key/72abb6fb-1e49-4ac1-9aed-c803dfcc0480`。這個值是自訂 KMS 金鑰的 Amazon Resource Name (ARN)。對於 S3 目標，您還可以指定額外的設定。這些設定可識別伺服器存取角色，提供預設 CSV 物件儲存格式的分隔符號，以及提供儲存貯體位置和名稱來儲存 S3 目標物件。

在預設情況下，將使用 S3 伺服器端加密進行 S3 資料加密。對於上述範例中的 S3 目標，這也等同於指定其端點設定，如下列範例所示。

```
aws dms create-endpoint --endpoint-identifier s3-target-endpoint --engine-name s3 --endpoint-type target
--s3-settings '{"ServiceAccessRoleArn": "your-service-access-ARN", "CsvRowDelimiter": "\n", 
"CsvDelimiter": ",", "BucketFolder": "your-bucket-folder", 
"BucketName": "your-bucket-name", 
"EncryptionMode": "SSE_S3"}'
```

如需使用 S3 伺服器端加密的詳細資訊，請參閱[使用伺服器端加密保護資料](https://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html)。

**注意**  
您也可以使用 CLI `modify-endpoint` 指令將現有端點的 `EncryptionMode` 參數值從 `SSE_KMS` 變更為 `SSE_S3`。但您不能將 `EncryptionMode` 值從 `SSE_S3` 變更為 `SSE_KMS`。

### 關於使用 .parquet 檔案儲存 S3 目標物件的設定
<a name="CHAP_Target.S3.EndpointSettings.Parquet"></a>

建立 S3 目標物件的預設格式為 .csv 檔案。以下範例顯示一些端點設定，用於指定 .parquet 檔案做為建立 S3 目標物件的格式。您可以用所有預設值指定 .parquet 檔案格式，如下列範例所示。

```
aws dms create-endpoint --endpoint-identifier s3-target-endpoint --engine-name s3 --endpoint-type target 
--s3-settings '{"ServiceAccessRoleArn": "your-service-access-ARN", "DataFormat": "parquet"}'
```

其中，`DataFormat` 參數設為 `parquet`，以所有 S3 預設值啟用此格式。這些預設值中有一種字典編碼 (`"EncodingType: "rle-dictionary"`) 使用位元壓縮和執行長度編碼的組合，更有效率地儲存重複值。

對於預設值以外的選項，您可以新增額外的設定，如下列範例所示。

```
aws dms create-endpoint --endpoint-identifier s3-target-endpoint --engine-name s3 --endpoint-type target
--s3-settings '{"ServiceAccessRoleArn": "your-service-access-ARN", "BucketFolder": "your-bucket-folder",
"BucketName": "your-bucket-name", "DataFormat": "parquet", "EncodingType: "plain-dictionary", "DictPageSizeLimit": 3,072,000,
"EnableStatistics": false }'
```

在這種情況下，除了幾個標準 S3 儲存貯體選項的參數和 `DataFormat` 參數，還會設定以下額外的 .parquet 檔案參數：
+ `EncodingType` – 設定為字典編碼 (`plain-dictionary`)，將每欄中發現的值儲存在字典頁面的每欄區塊中。
+ `DictPageSizeLimit` – 設定為字典頁面大小上限 3 MB。
+ `EnableStatistics` – 停用預設值，以允許收集有關 Parquet 檔案頁面和資料列群組的統計資料。

### 在 S3 目標上包含交易順序之擷取資料變更 (CDC)
<a name="CHAP_Target.S3.EndpointSettings.CdcPath"></a>

根據預設，當 AWS DMS 執行 CDC 任務時，它會將記錄於來源資料庫 （或資料庫） 的所有資料列變更存放在每個資料表的一或多個檔案中。包含相同資料表變更的每個檔案集都位於與該資料表相關聯的單一目標目錄中。 會 AWS DMS 建立與遷移至 Amazon S3 目標端點的資料庫資料表一樣多的目標目錄。檔案將儲存在這些目錄的 S3 目標上，而不考慮交易順序。如需檔案命名慣例、資料內容及格式的詳細資訊，請參閱 [使用 Amazon S3 做為 的目標 AWS Database Migration Service](#CHAP_Target.S3)。

若要以同樣擷取交易順序的方式擷取來源資料庫變更，您可以指定 S3 端點設定， AWS DMS 指示 將所有**資料庫資料表的資料列變更存放在根據交易大小建立的一或多個 .csv 檔案中。對於每個交易中涉及的所有資料表，這些 .csv *交易檔案*包含依交易順序列出的所有資料列變更。這些交易檔案將一起存放於您同樣在 S3 目標上指定的單一*交易目錄*中。在每個交易檔案中，每個資料列變更的交易操作、資料庫及來源資料表的身分，將儲存為資料列資料的一部分，如下所示。

```
operation,table_name,database_schema_name,field_value,...
```

其中 `operation` 是已變更資料列上的交易作業，`table_name` 是已變更資料列的資料庫資料表名稱，`database_schema_name` 是資料表所在資料庫結構描述的名稱，而 `field_value` 是指定資料列資料的一或多個欄位值當中的第一個。

下列交易檔案的範例展示涉及兩個資料表之一或多個交易的已變更資料列。

```
I,Names_03cdcad11a,rdsTempsdb,13,Daniel
U,Names_03cdcad11a,rdsTempsdb,23,Kathy
D,Names_03cdcad11a,rdsTempsdb,13,Cathy
I,Names_6d152ce62d,rdsTempsdb,15,Jane
I,Names_6d152ce62d,rdsTempsdb,24,Chris
I,Names_03cdcad11a,rdsTempsdb,16,Mike
```

在這裡，每列上的交易操作由第一欄的 `I` (插入)、`U` (更新) 或 `D` (刪除) 表示。第二欄的值是資料表名稱 (例如 `Names_03cdcad11a`)。第三欄的值是資料庫結構描述名稱 (例如 `rdsTempsdb`)。剩餘的欄會填入您自己的列資料 (例如 `13,Daniel`)。

此外， 會根據下列命名慣例，使用時間戳記 AWS DMS 來為其在 Amazon S3 目標上建立的交易檔案命名。

```
CDC_TXN-timestamp.csv
```

其中 `timestamp` 是建立交易檔案的時間，如下列範例所示。

```
CDC_TXN-20201117153046033.csv
```

檔案名稱中的這個時間戳記可確保當您在交易目錄中列出交易檔案時，這些檔案會依交易順序建立和列出。

**注意**  
依交易順序擷取資料變更時，無論目標上 `DataFormat` S3 設定的值為何， AWS DMS 一律會將資料列變更儲存在 .csv 檔案中。

若要控制在資料複寫任務期間寫入 Amazon S3 目標的頻率，您可以設定 `CdcMaxBatchInterval` 和 `CdcMinFileSize` 設定。在沒有任何額外負荷操作的情況下分析資料時，此設定可使效能提升。如需詳細資訊，請參閱[使用 Amazon S3 做為 目標時的端點設定 AWS DMS](#CHAP_Target.S3.Configuring) 

**指示 AWS DMS 以交易順序存放所有資料列變更**

1. 將目標上的 `PreserveTransactions` S3 設定設為 `true`。

1. 將目標上的 `CdcPath` S3 設定設為您要 AWS DMS 存放 .csv 交易檔案的相對資料夾路徑。

   AWS DMS 會在預設 S3 目標儲存貯體和工作目錄下，或是您使用目標上的 和 `BucketFolder` S3 設定所指定的儲存貯體`BucketName`和儲存貯體資料夾下建立此路徑。

## 在遷移的 S3 資料中指示來源資料庫操作
<a name="CHAP_Target.S3.Configuring.InsertOps"></a>

當 將記錄 AWS DMS 遷移到 S3 目標時，它可以在每個遷移的記錄中建立額外的欄位。此額外的欄位指示來源資料庫套用到記錄的操作。如何 AWS DMS 建立和設定第一個欄位取決於 `includeOpForFullLoad`、 和 的遷移任務類型`cdcInsertsOnly`和設定`cdcInsertsAndUpdates`。

如果完全載入的 `includeOpForFullLoad` 是 `true`， AWS DMS 一律會在每個 .csv 記錄中額外建立第一個欄位。此欄位包含字母 I (INSERT)，用來指示資料列是插入到來源資料庫。對於 `cdcInsertsOnly` 為 `false`（預設值） 時的 CDC 載入， AWS DMS 也會一律在每個 .csv 或 .parquet 記錄中建立額外的第一個欄位。此欄位包含字母 I (INSERT)、U (UPDATE) 或 D (DELETE)，用來指示來源資料庫的插入、更新或刪除資料列。

在下表中，您可以了解如何 `includeOpForFullLoad` 和 `cdcInsertsOnly` 屬性的設定如何共同運作，影響遷移記錄設定。


| 使用這些參數設定 | DMS 對於 .csv 和 .parquet 輸出的設定目標記錄如下  | includeOpForFullLoad | cdcInsertsOnly | 對於完全載入 | 對於 CDC 載入 | 
| --- | --- | --- | --- | --- | --- | 
| true | true | 新增第一個欄位的值設定為 I | 新增第一個欄位的值設定為 I | 
| false | false | 沒有新增的欄位 | 新增第一個欄位的值設定為 I、U、或 D | 
| false | true | 沒有新增的欄位 | 沒有新增的欄位 | 
| true | false | 新增第一個欄位的值設定為 I | 新增第一個欄位的值設定為 I、U、或 D | 

當 `includeOpForFullLoad` 和 `cdcInsertsOnly` 設定為相同的值，目標記錄會根據控制目前遷移類型設定記錄的屬性設定。這個屬性是 `includeOpForFullLoad` 用於完全載入和 `cdcInsertsOnly` CDC 載入。

當 `includeOpForFullLoad`和 `cdcInsertsOnly` 設定為不同的值時， AWS DMS 會讓 CDC 和完全載入的目標記錄設定一致。藉由任何先前 `includeOpForFullLoad` 指定的完全載入記錄，設定 CDC 載入符合記錄設定。

換言之，假設完全載入設為新增第一個欄位，用來指示插入記錄。在這種情況下，接下來的 CDC 載入設為新增第一個欄位，用來指示插入、更新或刪除記錄作為適當的來源。相反地，假設完全載入設定為 *不* 新增第一個欄位，用來指示插入記錄。在這種情況下，CDC 載入也設定為每個記錄不新增第一個欄位，無論來源對應的記錄操作為何。

同樣地，DMS 建立及設定額外第一個欄位的方式，取決於 `includeOpForFullLoad` 和 `cdcInsertsAndUpdates` 的設定。在下表中，您可以了解如何 `includeOpForFullLoad` 和 `cdcInsertsAndUpdates` 屬性的設定如何共同運作，以影響此格式中的遷移記錄設定。


| 使用這些參數設定 | DMS 對於 .csv 輸出的設定目標記錄如下  | includeOpForFullLoad | cdcInsertsAndUpdates | 對於完全載入 | 對於 CDC 載入 | 
| --- | --- | --- | --- | --- | --- | 
| true | true | 新增第一個欄位的值設定為 I | 新增第一個欄位的值設定為 I 或 U | 
| false | false | 沒有新增的欄位 | 新增第一個欄位的值設定為 I、U、或 D | 
| false | true | 沒有新增的欄位 | 新增第一個欄位的值設定為 I 或 U | 
| true | false | 新增第一個欄位的值設定為 I | 新增第一個欄位的值設定為 I、U、或 D | 

## S3 Parquet 的目標資料類型
<a name="CHAP_Target.S3.DataTypes"></a>

下表顯示使用 時支援的 Parquet 目標資料類型， AWS DMS 以及來自 AWS DMS 資料類型的預設映射。

如需 AWS DMS 資料類型的詳細資訊，請參閱 [AWS Database Migration Service 的資料類型](CHAP_Reference.DataTypes.md)。


|  AWS DMS 資料類型  |  S3 parquet 資料類型   | 
| --- | --- | 
| BYTES | BINARY | 
| DATE | DATE32 | 
| TIME | TIME32 | 
| DATETIME | TIMESTAMP | 
| INT1 | INT8 | 
| INT2 | INT16 | 
| INT4 | INT32 | 
| INT8 | INT64 | 
| NUMERIC | DECIMAL | 
| REAL4 | FLOAT | 
| REAL8 | DOUBLE | 
| STRING | STRING | 
| UINT1 | UINT8 | 
| UINT2 | UINT16 | 
| UINT4 | UINT32 | 
| UINT8 | UINT64 | 
| WSTRING | STRING | 
| BLOB | BINARY | 
| NCLOB | STRING | 
| CLOB | STRING | 
| BOOLEAN | BOOL | 

# 使用 Amazon DynamoDB 資料庫做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.DynamoDB"></a>

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

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

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

當 在 DynamoDB 目標端點上 AWS DMS 建立資料表時，它會建立與來源資料庫端點中一樣多的資料表。 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。使用此設定搭配 `ParallelLoadThreads`；`ParallelLoadBufferSize`，只有在有多個執行緒時才有效。
+ 個別資料表的資料表對應設定：使用 `table-settings` 規則，從來源中識別您想要平行載入的個別資料表。亦可使用這些規則，指定如何將每個資料表的資料列分段，以進行多執行緒載入。如需詳細資訊，請參閱[資料表和集合設定規則與操作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.md)。

**注意**  
當 AWS DMS 設定遷移任務的 DynamoDB 參數值時，預設讀取容量單位 (RCU) 參數值會設為 200。  
也會設定寫入容量單位 (WCU) 參數值，但其值取決於多項其他設定：  
WCU 參數的預設值為 200。
如果 `ParallelLoadThreads` 任務設定的值大於 1 (預設為 0)，則 WCU 參數會設定為 `ParallelLoadThreads` 值的 200 倍。
標準 AWS DMS 用量費用適用於您使用的資源。

## 從關聯式資料庫遷移到 DynamoDB 資料表
<a name="CHAP_Target.DynamoDB.RDBMS2DynamoDB"></a>

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

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

AWS DMS 支援下列 DynamoDB 純量資料類型：
+ String
+ 數字
+ Boolean

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

## 使用 DynamoDB 做為 目標的先決條件 AWS Database Migration Service
<a name="CHAP_Target.DynamoDB.Prerequisites"></a>

在您開始使用 DynamoDB 資料庫做為 的目標之前 AWS DMS，請務必建立 IAM 角色。此 IAM 角色應允許 AWS DMS 擔任並授予要遷移至其中的 DynamoDB 資料表的存取權。以下 IAM 政策顯示最低的存取許可集。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Sid": "",
         "Effect": "Allow",
         "Principal": {
            "Service": "dms.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
      }
   ]
}
```

------

遷移到 DynamoDB 所用的角色必須擁有下列許可。

------
#### [ JSON ]

****  

```
{
    "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:111122223333:table/name1",
                "arn:aws:dynamodb:us-west-2:111122223333:table/OtherName*",
                "arn:aws:dynamodb:us-west-2:111122223333:table/awsdms_apply_exceptions",
                "arn:aws:dynamodb:us-west-2:111122223333:table/awsdms_full_load_exceptions"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:ListTables"
            ],
            "Resource": "*"
        }
    ]
}
```

------

## 使用 DynamoDB 做為 目標的限制 AWS Database Migration Service
<a name="CHAP_Target.DynamoDB.Limitations"></a>

使用 DynamoDB 作為目標時，有下列限制：
+ DynamoDB 將 Number 資料類型的精確度限制到 38 位。將精確度更高的所有資料類型儲存為字串。您需要使用物件映射功能來明確指定此設定。
+ 因為 DynamoDB 沒有 Date 資料類型，所以使用 Date 資料類型的資料會轉換為字串。
+ DynamoDB 不允許更新主索引鍵屬性。此限制在使用變更資料擷取 (CDC) 進行中複寫時十分重要，因為它會導致目標出現不需要的資料。根據您如何映射物件，用於更新主索引鍵的 CDC 操作有兩種用途。它可以使新項目失敗，或隨著更新的主索引鍵和不完整的資料來插入新項目。
+ AWS DMS 僅支援使用非複合主索引鍵複寫資料表。如果您搭配分區索引鍵、排序索引鍵或兩者來指定目標資料表的物件映射，則為例外。
+ AWS DMS 除非是 CLOB，否則 不支援 LOB 資料。在遷移資料時， 會將 CLOB 資料 AWS DMS 轉換為 DynamoDB 字串。
+ 使用 DynamoDB 做為目標時，僅支援套用異常控制資料表 (`dmslogs.awsdms_apply_exceptions`)。如需控制資料表的詳細資訊，請參閱[控制資料表任務設定](CHAP_Tasks.CustomizingTasks.TaskSettings.ControlTable.md)。
+ AWS DMS 不支援 DynamoDB `TargetTablePrepMode=TRUNCATE_BEFORE_LOAD` 的任務設定做為目標。
+ AWS DMS 不支援 DynamoDB `TaskRecoveryTableEnabled` 的任務設定做為目標。
+ `BatchApply` DynamoDB 端點不支援 。
+ AWS DMS 無法遷移名稱符合 DynamoDB 中預留單字的屬性。如需詳細資訊，請參閱《Amazon [ DynamoDB 開發人員指南》中的 DynamoDB 中的預留單字](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html)。 * DynamoDB *

## 使用物件映射將資料遷移到 DynamoDB
<a name="CHAP_Target.DynamoDB.ObjectMapping"></a>

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` 並利用屬性名稱 "\$1doc"，將來源資料欄放到目標上的單一、普通 DynamoDB 對應中。使用 時`map-record-to-document`， 會將資料 AWS DMS 放入來源上的單一、平面、DynamoDB 映射屬性。此屬性稱為 "\$1doc"。此放置適用於來源資料表中未列在 `exclude-columns` 屬性清單的任何欄。

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

![\[範例所用的範例資料庫\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/images/datarep-dynamodb1.png)


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

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

![\[開始使用 AWS DMS\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/images/datarep-dynamodb2.png)


不過，假設您使用相同的規則，但將 `rule-action` 參數變更為 *map-record-to-document*。在本例中，未列在 `exclude-columns` 參數 *NickName* 和 *income* 中的資料行會映射到 *\$1doc* 項目。

![\[開始使用 AWS DMS\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/images/datarep-dynamodb3.png)


### 使用自訂條件表達式與物件映射
<a name="CHAP_Target.DynamoDB.ObjectMapping.ConditionExpression"></a>

您可以使用稱為條件表達式的 DynamoDB 功能，操作要寫入 DynamoDB 資料表的資料。如需 DynamoDB 中條件表達式的詳細資訊，請參閱[條件表達式](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html)。

條件表達式成員包含：
+ 表達式 (必要) 
+ expression 屬性值 （必要）。指定屬性值的 DynamoDB json 結構。這有助於比較屬性與 DynamoDB 中您在執行時間之前可能不知道的值。您可以將表達式屬性值定義為實際值的預留位置。
+ 運算式屬性名稱 （必要）。這有助於避免與任何 DynamoDB 保留字、包含特殊字元的屬性名稱以及類似名稱發生潛在衝突。
+ 何時使用條件表達式的選項 (選用)。預設值是 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\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/images/datarep-Tasks-conditional1.png)


### 使用屬性映射與物件映射
<a name="CHAP_Target.DynamoDB.ObjectMapping.AttributeMapping"></a>

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

以下範例顯示來源資料庫的結構以及 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 | 
| --- | --- | --- | --- | 
| 分割區索引鍵 | 排序索引鍵 | N/A | 
| <pre>Randy,Marsh</pre> | <pre>5</pre> | <pre>{<br />    "Name": "Randy",<br />    "Home": {<br />        "Address": "221B Baker Street",<br />        "Phone": 1234567890<br />    },<br />    "Work": {<br />        "Address": "31 Spooner Street, Quahog",<br />        "Phone": 9876541230<br />    }<br />}</pre> | <pre>02/29/1988</pre> | 

下列 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：使用屬性映射與物件映射
<a name="CHAP_Target.DynamoDB.ColumnMappingExample1"></a>

以下範例會將資料從兩個 MySQL 資料庫資料表 *nfl\$1data* 和 *sport\$1team* 遷移到兩個 DynamoDB 資料表 *NFLTeams* 和 *SportTeams*。將資料從 MySQL 資料庫資料表映射到 DynamoDB 資料表所使用的資料表結構和 JSON，如下所示。

MySQL 資料庫資料表 *nfl\$1data* 的結構如下所示：

```
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\$1team* 的結構如下所示：

```
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 的目標資料類型
<a name="CHAP_Target.DynamoDB.DataTypes"></a>

的 DynamoDB 端點 AWS DMS 支援大多數 DynamoDB 資料類型。下表顯示使用 時支援的 Amazon AWS DMS 目標資料類型， AWS DMS 以及來自 AWS DMS 資料類型的預設映射。

如需 AWS DMS 資料類型的詳細資訊，請參閱 [AWS Database Migration Service 的資料類型](CHAP_Reference.DataTypes.md)。

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


| AWS DMS 資料類型 | DynamoDB 資料類型 | 
| --- | --- | 
|  String  |  String  | 
|  WString  |  String  | 
|  Boolean  |  Boolean  | 
|  日期  |  String  | 
|  DateTime  |  String  | 
|  INT1  |  Number  | 
|  INT2  |  Number  | 
|  INT4  |  Number  | 
|  INT8  |  Number  | 
|  數值  |  Number  | 
|  Real4  |  Number  | 
|  Real8  |  Number  | 
|  UINT1  |  Number  | 
|  UINT2  |  Number  | 
|  UINT4  |  Number  | 
| UINT8 | Number | 
| CLOB | String | 

# 使用 Amazon Kinesis Data Streams 作為 的目標 AWS Database Migration Service
<a name="CHAP_Target.Kinesis"></a>

您可以使用 AWS DMS 將資料遷移至 Amazon Kinesis 資料串流。Amazon Kinesis Data Streams 服務是 Amazon Kinesis Data Streams 服務的一部分。您可以使用 Kinesis 資料串流即時收集並處理大型的資料記錄串流。

Kinesis 資料串流是碎片構成。*碎片*是串流中資料記錄的唯一識別序列。如需 Amazon Kinesis Data Streams 中碎片的詳細資訊，請參閱《Amazon Kinesis Data Streams 開發人員指南》**中的[碎片](https://docs.aws.amazon.com/streams/latest/dev/key-concepts.html#shard)。

AWS Database Migration Service 使用 JSON 將記錄發佈至 Kinesis 資料串流。在轉換過程中， AWS DMS 會將來源資料庫中的每筆記錄序列化為 JSON 格式或 JSON\$1UNFORMATTED 訊息格式的屬性/值對。JSON\$1UNFORMATTED 訊息格式為含新行分隔符號的單行 JSON 字串。它允許 Amazon Data Firehose 將 Kinesis 資料交付至 Amazon S3 目的地，然後使用包括 Amazon Athena 在內的各種查詢引擎進行查詢。

您要使用物件映射將資料從任何受支援的資料來源遷移到目標串流。使用物件映射，您可以決定如何建構串流中的資料記錄。您也可以定義每份資料表的分割區索引鍵，Kinesis Data Stream 會用其將資料分組為碎片。

AWS DMS 也會設定數個 Kinesis Data Streams 參數值。資料表的建立成本取決於要遷移的資料量和資料表數量。

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

**Kinesis Data Streams 端點設定**

當您使用 Kinesis Data Streams 目標端點時，您可以使用 AWS DMS API 中的 `KinesisSettings`選項來取得交易和控制詳細資訊。

您可透過以下任一種方式來設定連線設定：
+ 在 AWS DMS 主控台中，使用端點設定。
+ 在 CLI 中，使用 [CreateEndpoint](https://docs.aws.amazon.com/dms/latest/APIReference/API_CreateEndpoint.html) 命令的 `kinesis-settings` 選項。

在 CLI 中，使用 `kinesis-settings` 選項的以下請求參數：
**注意**  
 AWS DMS 3.4.1 版及更高版本中提供 `IncludeNullAndEmpty` 端點設定的支援。但是， 支援 Kinesis Data Streams 目標的其他下列端點設定 AWS DMS。
+ `MessageFormat` – 在端點建立之記錄的輸出格式。訊息格式為 `JSON` (預設) 或 `JSON_UNFORMATTED` (不含製表符的單行)。
+ `IncludeControlDetails`：在 Kinesis 訊息輸出中，顯示資料表定義、欄位定義以及資料表和欄位變更的詳細控制資訊。預設值為 `false`。
+ `IncludeNullAndEmpty`：包含目標中的 NULL 和空資料欄。預設值為 `false`。
+ `IncludePartitionValue`：除非磁碟分割類型為 `schema-table-type`，否則會在 Kinesis 訊息輸出中顯示磁碟分割值。預設值為 `false`。
+ `IncludeTableAlterOperations` – 包含變更控制資料中資料表的任何資料定義語言 (DDL) 操作，例如 `rename-table`、`drop-table`、`add-column`、`drop-column` 和 `rename-column`。預設值為 `false`。
+ `IncludeTransactionDetails` – 提供來源資料庫的詳細交易資訊。此資訊包括遞交時間戳記、記錄位置，以及 `transaction_id`、`previous_transaction_id`，和 `transaction_record_id ` (交易內的記錄位移) 的值。預設值為 `false`。
+ `PartitionIncludeSchemaTable` – 當磁碟分割類型為 `primary-key-type` 時，將結構描述和資料表名稱作為磁碟分割值的前綴。這樣做會增加 Kinesis 碎片之間的資料分佈。例如，假設 `SysBench` 結構描述有數千個資料表，而每個資料表的主索引鍵只有有限的範圍。在這種情況下，相同的主索引鍵會從數千個資料表發送到相同的碎片，而這將導致調節。預設值為 `false`。
+ `UseLargeIntegerValue` – 使用最多 18 位數的整數，而不是將整數轉換為雙位元，可從 3.5.4 AWS DMS 版取得。預設值為 false。

下列範例顯示使用中的 `kinesis-settings` 選項與使用 AWS CLI發出的範例 `create-endpoint` 命令。

```
aws dms \
  create-endpoint \
    --region <aws-region> \
    --endpoint-identifier <user-endpoint-identifier> \
    --endpoint-type target \
    --engine-name kinesis \
    --kinesis-settings ServiceAccessRoleArn=arn:aws:iam::<account-id>:role/<kinesis-role-name>,StreamArn=arn:aws:kinesis:<aws-region>:<account-id>:stream/<stream-name>,MessageFormat=json-unformatted,
IncludeControlDetails=true,IncludeTransactionDetails=true,IncludePartitionValue=true,PartitionIncludeSchemaTable=true,
IncludeTableAlterOperations=true
```

**多執行緒完全載入任務設定**

為了協助提高傳輸速度， AWS DMS 支援對 Kinesis Data Streams 目標執行個體進行多執行緒完全載入。DMS 使用包括下列項目的任務設定來支援此多執行緒操作：
+ `MaxFullLoadSubTasks`：使用此選項，指出要平行載入的來源資料表數目上限。DMS 會使用專用子任務，將每個資料表載入到其對應的 Kinesis 目標資料表。預設值為 8；最大值為 49。
+ `ParallelLoadThreads` – 使用此選項指定 AWS DMS 用來將每個資料表載入其 Kinesis 目標資料表的執行緒數目。Kinesis Data Streams 目標的最大值為 32。您可以要求提高此上限。
+ `ParallelLoadBufferSize`：使用此選項，指定要在平行載入執行緒用來將資料載入至 Kinesis 目標的緩衝區中儲存的記錄數量上限。預設值為 50。最大值為 1000。使用此設定搭配 `ParallelLoadThreads`；`ParallelLoadBufferSize`，只有在有多個執行緒時才有效。
+ `ParallelLoadQueuesPerThread`：使用此選項指定每個並行執行緒存取的佇列數目，以便將資料記錄從佇列中取出，並為目標產生批次載入。預設為 1。但是，對於各種承載大小的 Kinesis 目標，有效範圍為每個執行緒 5–512 個佇列。

**多執行緒 CDC 載入任務設定**

您可以使用任務設定，提升 Kinesis 等即時資料串流目標端點的變更資料擷取 (CDC) 效能，從而修改 `PutRecords` API 呼叫行為。若要執行此操作，您可以指定並行執行緒數目、每個執行緒的佇列數，以及使用 `ParallelApply*` 任務設定儲存在緩衝區中的記錄數目。例如，假設您要執行 CDC 載入並平行套用 128 個執行緒。您也想要每個執行緒存取 64 個佇列，且每個緩衝區儲存 50 筆記錄。

為了提升 CDC 效能， AWS DMS 支援下列任務設定：
+ `ParallelApplyThreads` – 指定在 CDC 載入期間 AWS DMS 用來將資料記錄推送至 Kinesis 目標端點的並行執行緒數目。預設值為零 (0)，最大值為 32。
+ `ParallelApplyBufferSize`：指定每個緩衝區佇列中儲存的最大記錄數目，以便並行執行緒在 CDC 載入期間推送至 Kinesis 目標端點。預設值為 100，最大值為 1,000。`ParallelApplyThreads` 指定多個執行緒時，請使用此選項。
+ `ParallelApplyQueuesPerThread`：指定每個執行緒存取的佇列數目，以便從佇列中取出資料記錄，並在 CDC 期間產生 Kinesis 端點的批次載入。預設值為 １，最大值為 512。

在使用 `ParallelApply*` 任務設定時，`partition-key-type` 預設是資料表的 `primary-key`，而非 `schema-name.table-name`。

## 使用前映像檢視作為目標之 Kinesis 資料串流的 CDC 列原始值
<a name="CHAP_Target.Kinesis.BeforeImage"></a>

將 CDC 更新寫入至 Kinesis 等資料串流目標時，您可以在更新進行變更前，檢視來源資料庫列的原始值。為了實現這一點， 會根據來源資料庫引擎提供的資料， AWS DMS 填入更新事件*之前的映像*。

不同的來源資料庫引擎可提供不同的前映像資訊量：
+ Oracle 僅提供欄更新 (如果有變更的話)。
+ PostgreSQL 僅提供屬於主索引鍵一部分的欄的資料 (無論是否有變更)。若要提供所有資料欄的資料 (無論是否已變更)，您需要將 `REPLICA_IDENTITY` 設為 `FULL` (而非 `DEFAULT`)。請注意，您應該仔細選擇每個資料表的 `REPLICA_IDENTITY` 設定。如果將 `REPLICA_IDENTITY` 設為 `FULL`，所有的資料欄值都會連續寫入預寫記錄 (WAL)。這可能會對經常更新的資料表造成效能或資源問題。
+ MySQL 一般會提供所有欄的資料，但 BLOB 和 CLOB 資料類型除外 (無論是否有變更)。

若要啟用前映像功能以從來源資料庫將原始值新增至 AWS DMS 輸出，請使用 `BeforeImageSettings` 任務設定或 `add-before-image-columns` 參數。此參數會套用欄轉換規則。

`BeforeImageSettings` 會使用從來源資料庫系統收集到的值，將新的 JSON 屬性新增至所有更新操作，如下所示。

```
"BeforeImageSettings": {
    "EnableBeforeImage": boolean,
    "FieldName": string,  
    "ColumnFilter": pk-only (default) / non-lob / all (but only one)
}
```

**注意**  
僅適用於包含 CDC 元件`BeforeImageSettings` AWS DMS 的任務，例如完全載入加上 CDC 任務 （遷移現有資料並複寫持續變更），或僅適用於 CDC 的任務 （僅複寫資料變更）。請勿將 `BeforeImageSettings` 套用至僅限完全載入的任務。

針對 `BeforeImageSettings` 選項，適用的設定如下：
+ 將 `EnableBeforeImage` 選項設為 `true` 以啟用前映像功能。預設值為 `false`。
+ 使用 `FieldName` 選項，將名稱指派給新的 JSON 屬性。若 `EnableBeforeImage` 為 `true`，`FieldName` 則為必填，且不能留白。
+ `ColumnFilter` 選項會使用前映像來指定要新增的欄。若只要新增屬於資料表主索引鍵一部分的欄，請使用預設值 `pk-only`。若要新增任何具有前映像值的欄，請使用 `all`。請注意，前映像不包含具有 LOB 資料類型的資料欄，例如 CLOB 或 BLOB。

  ```
  "BeforeImageSettings": {
      "EnableBeforeImage": true,
      "FieldName": "before-image",
      "ColumnFilter": "pk-only"
    }
  ```

**注意**  
Amazon S3 目標不支援 `BeforeImageSettings`。針對 S3 目標，請僅使用 `add-before-image-columns` 轉換規則，以在 CDC 期間執行前映像功能。

### 使用前映像轉換規則
<a name="CHAP_Target.Kinesis.BeforeImage.Transform-Rule"></a>

您可使用 `add-before-image-columns` 參數做為任務設定的替代方式，它會套用欄轉換規則。透過此參數，您可以在 Kinesis 等資料串流目標上，在 CDC 期間啟用前映像功能。

只要在轉換規則中使用 `add-before-image-columns`，即可套用前映像結果的更精細的控制。轉換規則可讓您使用物件定位器，以便掌控針對規則選取的資料表。此外，您可以將轉換規則鏈結在一起，讓不同的規則套用至不同的資料表。接著，您可以使用其他規則來操控產生的欄。

**注意**  
請勿在同一個任務內將 `add-before-image-columns` 參數與 `BeforeImageSettings` 任務設定一起搭配使用。請改為將參數或設定 (擇一使用，而非兩者同時使用) 用於單一任務。

具有欄的 `add-before-image-columns` 參數的 `transformation` 規則類型必須提供 `before-image-def` 區段。下列顯示一個範例。

```
    {
      "rule-type": "transformation",
      …
      "rule-target": "column",
      "rule-action": "add-before-image-columns",
      "before-image-def":{
        "column-filter": one-of  (pk-only / non-lob / all),
        "column-prefix": string,
        "column-suffix": string,
      }
    }
```

`column-prefix` 的值會附加至欄名稱前，而`column-prefix` 的預設值為 `BI_`。`column-suffix` 的值會附加至欄名稱，而預設值為空白。請勿將 `column-prefix` 和 `column-suffix` 同時設為空白字串。

為 `column-filter` 選擇一個值。若只要新增屬於資料表主索引鍵一部分的欄，請選擇 `pk-only`。選擇 `non-lob` 以僅新增不屬於 LOB 類型的欄。或者，選擇 `all` 以新增任何具有前映像值的欄。

### 前映像轉換規則範例
<a name="CHAP_Target.Kinesis.BeforeImage.Example"></a>

下列範例中的轉換規則會在目標中新增名為 `BI_emp_no` 的欄。因此，`UPDATE employees SET emp_no = 3 WHERE emp_no = 1;` 等陳述式會以 1 填入 `BI_emp_no` 欄位。當您將 CDC 更新寫入至 Amazon S3 目標時，`BI_emp_no` 資料欄會讓它能夠分辨哪個原始列已更新。

```
{
  "rules": [
    {
      "rule-type": "selection",
      "rule-id": "1",
      "rule-name": "1",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      },
      "rule-action": "include"
    },
    {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "employees"
      },
      "rule-action": "add-before-image-columns",
      "before-image-def": {
        "column-prefix": "BI_",
        "column-suffix": "",
        "column-filter": "pk-only"
      }
    }
  ]
}
```

如需使用 `add-before-image-columns` 規則動作的相關資訊，請參閱[轉換規則與動作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.md)。

## 使用 Kinesis 資料串流做為 目標的先決條件 AWS Database Migration Service
<a name="CHAP_Target.Kinesis.Prerequisites"></a>

### 使用 Kinesis 資料串流做為 目標的 IAM 角色 AWS Database Migration Service
<a name="CHAP_Target.Kinesis.Prerequisites.IAM"></a>

將 Kinesis 資料串流設定為 的目標之前 AWS DMS，請務必建立 IAM 角色。此角色必須允許 AWS DMS 擔任並授予要遷移至其中的 Kinesis 資料串流存取權。以下 IAM 政策顯示最低的存取許可集。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
   {
     "Sid": "1",
     "Effect": "Allow",
     "Principal": {
        "Service": "dms.amazonaws.com"
     },
   "Action": "sts:AssumeRole"
   }
]
}
```

------

遷移到 Kinesis 資料串流所用的角色必須擁有下列許可。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kinesis:DescribeStream",
        "kinesis:PutRecord",
        "kinesis:PutRecords"
      ],
      "Resource": "*"
    }
  ]
}
```

------

### 存取 Kinesis 資料串流做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.Kinesis.Prerequisites.Access"></a>

在 3.4.7 版和更新 AWS DMS 版本中，若要連線至 Kinesis 端點，您必須執行下列其中一項操作：
+ 將 DMS 設定為使用 VPC 端點。如需有關設定 DMS 以使用 VPC 端點的詳細資訊，請參閱 [設定 的 VPC 端點 AWS DMS](CHAP_VPC_Endpoints.md)。
+ 將 DMS 設定為使用公用路由，也就是將您的複寫執行個體設為公用。如需公用複寫執行個體的詳細資訊，請參閱 [公有和私有複寫執行個體](CHAP_ReplicationInstance.PublicPrivate.md)。

## 使用 Kinesis Data Streams 做為 目標的限制 AWS Database Migration Service
<a name="CHAP_Target.Kinesis.Limitations"></a>

使用 Kinesis Data Streams 作為目標時，有下列限制：
+ AWS DMS 會將每個更新發佈至來源資料庫中的單一記錄，做為指定 Kinesis 資料串流中的一個資料記錄，無論交易為何。不過，您可以使用 `KinesisSettings` API 的相關參數來包含每個資料記錄的交易詳細資訊。
+ 不支援完全的 LOB 模式。
+ 支援的 LOB 大小上限是 1 MB。
+ Kinesis Data Streams 不支援刪除重複資料。取用串流資料的應用程式需要處理重複的記錄。如需的詳細資訊，請參閱《Amazon Kinesis Data Streams 開發人員指南》**中的[處理重複的記錄](https://docs.aws.amazon.com/streams/latest/dev/kinesis-record-processor-duplicates.html)。
+ AWS DMS 支援下列四種形式的分割區索引鍵：
  + `SchemaName.TableName`：結構描述和資料表名稱的組合。
  + `${AttributeName}`：JSON 其中一個欄位的值，或來源資料庫資料表的主索引鍵。
  + `transaction-id`：CDC 交易 ID。相同交易中的所有記錄都會移至相同的分割區。
  + `constant`：無論資料表或資料為何，每個記錄的固定常值。所有記錄都會傳送至相同的分割區索引鍵值「常數」，在所有資料表中提供嚴格的全域排序。

  ```
  {
      "rule-type": "object-mapping",
      "rule-id": "2",
      "rule-name": "PartitionKeyTypeExample",
      "rule-action": "map-record-to-document",
      "object-locator": {
          "schema-name": "onprem",
          "table-name": "it_system"
      },
      "mapping-parameters": {
          "partition-key-type": "transaction-id | constant | attribute-name | schema-table"
      }
  }
  ```
+ 如需在 Kinesis Data Streams 中加密靜態資料的相關資訊，請參閱《AWS Key Management Service 開發人員指南》**中的 [Kinesis Data Streams 中的資料保護](https://docs.aws.amazon.com/streams/latest/dev/server-side-encryption.html.html)。
+ 只有在來源`IncludeTransactionDetails`端點為 Oracle、SQL Server、PostgreSQL 或 MySQL 時，才支援端點設定。對於其他來源端點類型，不會包含交易詳細資訊。
+ Kinesis 端點不支援 `BatchApply`。針對 Kinesis 目標使用批次套用 （例如，`BatchApplyEnabled`目標中繼資料任務設定） 會導致任務失敗和資料遺失。使用 Kinesis 做為目標端點`BatchApply`時，請勿啟用 。
+ Kinesis 目標僅支援相同 AWS 帳戶中與複寫執行個體相同的 AWS 區域 Kinesis 資料串流。
+ 從 MySQL 來源遷移時，BeforeImage 資料不包括 CLOB 和 BLOB 資料類型。如需詳細資訊，請參閱[使用前映像檢視作為目標之 Kinesis 資料串流的 CDC 列原始值](#CHAP_Target.Kinesis.BeforeImage)。
+ AWS DMS 不支援遷移超過 16 位數的`BigInt`資料類型值。若要解決此限制，您可以使用下列轉換規則將 `BigInt` 資料欄轉換為字串。如需轉換規則的詳細資訊，請參閱 [轉換規則與動作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.md)。

  ```
  {
      "rule-type": "transformation",
      "rule-id": "id",
      "rule-name": "name",
      "rule-target": "column",
      "object-locator": {
          "schema-name": "valid object-mapping rule action",
          "table-name": "",
          "column-name": ""
      },
      "rule-action": "change-data-type",
      "data-type": {
          "type": "string",
          "length": 20
      }
  }
  ```
+ 當單一交易中的多個 DML 操作修改來源資料庫上的大型物件 (LOB) 資料欄時，目標資料庫只會保留該交易中最後一個操作的最終 LOB 值。相同交易中先前操作所設定的中繼 LOB 值會被覆寫，這可能會導致潛在的資料遺失或不一致。由於複寫期間處理 LOB 資料的方式，因此會發生此行為。
+ AWS DMS 使用 Kinesis 做為目標端點時， 不支援包含內嵌`'\0'`字元的來源資料。包含內嵌`'\0'`字元的資料會在第一個`'\0'`字元被截斷。

## 使用物件映射將資料遷移到 Kinesis 資料串流
<a name="CHAP_Target.Kinesis.ObjectMapping"></a>

AWS DMS 使用資料表映射規則，將資料從來源映射到目標 Kinesis 資料串流。若要將資料映射到目標串流，您要使用一種稱為物件映射的資料表映射規則。您使用物件映射定義如何將來源資料記錄映射到發佈在 Kinesis 資料串流的資料記錄。

除了擁有分割區索引鍵外，Kinesis 資料串流沒有預設結構。在物件映射規則中，資料記錄 `partition-key-type` 的可能值為 `schema-table`、`transaction-id`、`primary-key`、`constant` 和 `attribute-name`。

若要建立物件映射規則，請將 `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": ""
            }
        }
    ]
}
```

AWS DMS 目前支援 `map-record-to-record`和 `map-record-to-document`做為 `rule-action` 參數的唯一有效值。這些設定會影響 `exclude-columns` 屬性清單中未排除的值。`map-record-to-record` 和 `map-record-to-document`值預設會指定 AWS DMS 如何處理這些記錄。這些值反正不會影響屬性映射。

從關聯式資料庫遷移到 Kinesis 資料串流時，請使用 `map-record-to-record`。此規則類型使用關聯式資料庫的 `taskResourceId.schemaName.tableName` 值作為 Kinesis 資料串流的分割區索引鍵，並為來源資料庫中的每一資料行建立一個屬性。

使用 `map-record-to-record` 時，請注意下列事項：
+ 此設定只會影響 `exclude-columns` 清單中排除的欄。
+ 對於每個這類資料欄， 會在目標主題中 AWS DMS 建立對應的屬性。
+ AWS DMS 無論屬性映射中是否使用來源資料欄， 都會建立此對應的屬性。

使用 `map-record-to-document` 將來源資料欄放入使用屬性名稱「\$1doc」的適當目標串流中的單一固定文件。 AWS DMS 將資料放置在名為 "`_doc`" 之來源上的單一固定對應中。此放置適用於來源資料表中未列在 `exclude-columns` 屬性清單的任何欄。

了解 `map-record-to-record` 的一種方法是查看它運作時的狀態。在本範例中，假設您開始使用之關聯式資料庫資料表資料列的結構和資料如下。


| FirstName | LastName | StoreId | HomeAddress | HomePhone | WorkAddress | WorkPhone | DateofBirth | 
| --- | --- | --- | --- | --- | --- | --- | --- | 
| Randy | Marsh | 5 | 221B Baker Street | 1234567890 | 31 Spooner Street, Quahog  | 9876543210 | 1988/02/29 | 

若要將此資訊從名為 `Test` 的結構描述遷移到 Kinesis 資料串流，您要建立規則，以將資料映射到目標串流。以下規則說明映射。

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "rule-action": "include",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            }
        },
        {
            "rule-type": "object-mapping",
            "rule-id": "2",
            "rule-name": "DefaultMapToKinesis",
            "rule-action": "map-record-to-record",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "Customers"
            }
        }
    ]
}
```

以下說明在 Kinesis 資料串流中產生的記錄格式：
+ StreamName：XXX
+ PartitionKey：Test.Customers //schmaName.tableName
+ Data：//以下 JSON 訊息

  ```
    {
       "FirstName": "Randy",
       "LastName": "Marsh",
       "StoreId":  "5",
       "HomeAddress": "221B Baker Street",
       "HomePhone": "1234567890",
       "WorkAddress": "31 Spooner Street, Quahog",
       "WorkPhone": "9876543210",
       "DateOfBirth": "02/29/1988"
    }
  ```

但是，假設您使用相同的規則，但將 `rule-action` 參數變更為 `map-record-to-document` 並排除某些資料欄。以下規則說明映射。

```
{
	"rules": [
	   {
			"rule-type": "selection",
			"rule-id": "1",
			"rule-name": "1",
			"rule-action": "include",
			"object-locator": {
				"schema-name": "Test",
				"table-name": "%"
			}
		},
		{
			"rule-type": "object-mapping",
			"rule-id": "2",
			"rule-name": "DefaultMapToKinesis",
			"rule-action": "map-record-to-document",
			"object-locator": {
				"schema-name": "Test",
				"table-name": "Customers"
			},
			"mapping-parameters": {
				"exclude-columns": [
					"homeaddress",
					"homephone",
					"workaddress",
					"workphone"
				]
			}
		}
	]
}
```

在本例中，未列在 `exclude-columns` 參數 `FirstName`、`LastName`、`StoreId` 和 `DateOfBirth` 中的資料欄會對應到 `_doc`。以下說明產生的記錄格式。

```
       {
            "data":{
                "_doc":{
                    "FirstName": "Randy",
                    "LastName": "Marsh",
                    "StoreId":  "5",
                    "DateOfBirth": "02/29/1988"
                }
            }
        }
```

### 使用屬性映射重組資料
<a name="CHAP_Target.Kinesis.AttributeMapping"></a>

您可以在使用屬性映射將資料遷移到 Kinesis 資料串流的同時，重組資料。例如，您可能想要將來源的幾個欄位合併為目標的單一欄位。以下屬性映射說明如何重組資料。

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "rule-action": "include",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            }
        },
        {
            "rule-type": "object-mapping",
            "rule-id": "2",
            "rule-name": "TransformToKinesis",
            "rule-action": "map-record-to-record",
            "target-table-name": "CustomerData",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "Customers"
            },
            "mapping-parameters": {
                "partition-key-type": "attribute-name",
                "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": "${lastname}, ${firstname}"
                    },
                    {
                        "target-attribute-name": "ContactDetails",
                        "attribute-type": "document",
                        "attribute-sub-type": "json",
                        "value": {
                            "Home": {
                                "Address": "${homeaddress}",
                                "Phone": "${homephone}"
                            },
                            "Work": {
                                "Address": "${workaddress}",
                                "Phone": "${workphone}"
                            }
                        }
                    }
                ]
            }
        }
    ]
}
```

若要設定 的常數值`partition-key`，請指定 `"partition-key-type: "constant"`，這會將分割區值設定為 `constant`。例如，您可以執行此操作，將所有資料強制儲存在單一碎片中。以下映射說明此方法。

```
{
    "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": "TransformToKinesis",
            "rule-action": "map-record-to-document",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "Customer"
            },
            "mapping-parameters": {
                "partition-key-type": "constant",
                "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": "scalar",
                        "attribute-sub-type": "string",
                        "value": {
                            "Home": {
                                "Address": "${HomeAddress}",
                                "Phone": "${HomePhone}"
                            },
                            "Work": {
                                "Address": "${WorkAddress}",
                                "Phone": "${WorkPhone}"
                            }
                        }
                    },
                    {
                        "target-attribute-name": "DateOfBirth",
                        "attribute-type": "scalar",
                        "attribute-sub-type": "string",
                        "value": "${DateOfBirth}"
                    }
                ]
            }
        }
    ]
}
```

**注意**  
用於特定資料表的控制記錄 `partition-key` 值是 `TaskId.SchemaName.TableName`。用於特定任務的控制記錄 `partition-key` 值是該記錄的 `TaskId`。在物件映射中指定 `partition-key` 值對控制記錄的 `partition-key` 沒有影響。  
 在資料表映射規則`attribute-name`中`partition-key-type`將 設定為 時，您必須指定 `partition-key-name`，其必須參考來源資料表中的資料欄或映射中定義的自訂資料欄。此外，`attribute-mappings`必須提供 來定義來源資料欄如何對應至目標 Kinesis Stream。

### Kinesis Data Streams 的訊息格式
<a name="CHAP_Target.Kinesis.Messageformat"></a>

JSON 輸出僅是索引鍵/值對的清單。JSON\$1UNFORMATTED 訊息格式為含新行分隔符號的單行 JSON 字串。

AWS DMS 提供下列預留欄位，讓您更輕鬆地使用 Kinesis Data Streams 中的資料：

**RecordType**  
記錄類型可以是資料或控制。*資料記錄*代表來源的實際資料列。*控制記錄*用於串流的重要事件，例如重新啟動任務。

**作業**  
針對資料記錄，操作可以是 `load`、`insert`、`update` 或 `delete`。  
針對控制記錄，操作可以是 `create-table`、`rename-table`、`drop-table`、`change-columns`、`add-column`、`drop-column`、`rename-column` 或 `column-type-change`。

**SchemaName**  
記錄的來源結構描述。控制記錄的此欄位可以為空。

**TableName**  
記錄的來源資料表。控制記錄的此欄位可以為空。

**時間戳記**  
JSON 訊息建構時間的時間戳記。此欄位格式為 ISO 8601 格式。

# 使用 Apache Kafka 做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.Kafka"></a>

您可以使用 AWS DMS 將資料遷移至 Apache Kafka 叢集。Apache Kafka 是一個分散式串流平台。您可以使用 Apache Kafka 來即時擷取和處理串流資料。

AWS 也提供 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 做為 AWS DMS 目標。Amazon MSK 是一個完全受管的 Apache Kafka 串流服務，用於簡化 Apache Kafka 執行個體的實作和管理。它適用於開放原始碼 Apache Kafka 版本，而且您可以像任何 Apache Kafka 執行個體一樣存取 Amazon MSK 執行個體做為 AWS DMS 目標。如需詳細資訊，請參閱《Amazon Managed Streaming for Apache Kafka 開發人員指南》**中的[什麼是 Amazon MSK](https://docs.aws.amazon.com/msk/latest/developerguide/what-is-msk.html)。

Kafka 叢集會記錄串流儲存在稱為主題的類別裡，其中具有分割區。*分割區*是主題中資料記錄 (訊息) 的唯一識別序列。分割區可以分佈在叢集中的多個中介裝置，以啟用主題記錄的平行處理。如需有關主題和分割區及其在 Apache Kafka 中分佈的詳細資訊，請參閱[主題和日誌](https://kafka.apache.org/documentation/#intro_topics)以及[分佈](https://kafka.apache.org/documentation/#intro_distribution)。

Kafka 叢集可以是 Amazon MSK 執行個體、Amazon EC2 執行個體上執行的叢集，或是內部部署叢集。Amazon MSK 執行個體或 Amazon EC2 執行個體上的叢集可以位於相同或不同的 VPC。如果您的叢集為內部部署，您可以針對複寫執行個體使用自己的內部部署名稱伺服器來解析叢集的主機名稱。如需為複寫執行個體設定名稱伺服器的相關資訊，請參閱 [使用自己的內部部署名稱伺服器](CHAP_BestPractices.md#CHAP_BestPractices.Rte53DNSResolver)。如需設定網路的詳細資訊，請參閱 [設定複寫執行個體的網路](CHAP_ReplicationInstance.VPC.md)。

使用 Amazon MSK 叢集時，請確定其安全群組允許來自複寫執行個體的存取。如需變更 Amazon MSK 叢集安全群組的相關資訊，請參閱[變更 Amazon MSK 叢集的安全群組](https://docs.aws.amazon.com/msk/latest/developerguide/change-security-group.html)。

AWS Database Migration Service 使用 JSON 將記錄發佈至 Kafka 主題。在轉換過程中， AWS DMS 會將來源資料庫中的每筆記錄序列化為 JSON 格式的屬性值對。

若要將資料從任何受支援的資料來源遷移到目標 Kafka 叢集，可以使用物件對應。您可以使用物件映射來決定如何建構目標主題中的資料記錄。您也可以定義每份資料表的分割區索引鍵，Apache Kafka 用它將資料分組為分割區。

目前， AWS DMS 支援每個任務的單一主題。對於具有多個資料表的單一任務，所有訊息都會傳送至同一主題。每個訊息都包含中繼資料區段，可識別目標結構描述和 table. AWS DMS versions 3.4.6 和更新版本，支援使用物件映射的多主題複寫。如需詳細資訊，請參閱[使用物件映射的多主題複製](#CHAP_Target.Kafka.MultiTopic)。

**Apache Kafka 端點設定**

您可以透過 AWS DMS 主控台中的端點設定或 CLI 中的 `--kafka-settings`選項來指定連線詳細資訊。每個設定的需求如下：
+ `Broker` — 以逗號分隔清單的形式指定 Kafka 叢集中一個或多個代理程式的位置。`broker-hostname:port`例如，`"ec2-12-345-678-901.compute-1.amazonaws.com:2345,ec2-10-987-654-321.compute-1.amazonaws.com:9876"`。此設定可以指定叢集中任意或所有代理程式的位置。叢集中介裝置全部都會進行通訊，以處理遷移到主題的資料記錄分割。
+  `Topic` – (選擇性) 指定主題名稱，長度上限為 255 個字母和符號。您可以使用句號 (.)、底線 (\$1) 和減號 (-)。具有句點 (.) 或底線 (\$1) 的主題名稱可能會在內部資料結構中發生衝突。在主題名稱中使用其中一個符號，不要同時使用這兩個符號。如果您未指定主題名稱， AWS DMS 會使用 `"kafka-default-topic"`做為遷移主題。
**注意**  
若要讓 AWS DMS 建立您指定的遷移主題或預設主題，請將 `auto.create.topics.enable = true`設定為 Kafka 叢集組態的一部分。如需詳細資訊，請參閱[使用 Apache Kafka 做為 目標的限制 AWS Database Migration Service](#CHAP_Target.Kafka.Limitations)
+ `MessageFormat` – 在端點建立之記錄的輸出格式。訊息格式為 `JSON` (預設) 或 `JSON_UNFORMATTED` (不含製表符的單行)。
+ `MessageMaxBytes` – 在端點上建立之記錄的大小上限 (以位元組為單位)。預設值為 1,000,000。
**注意**  
您只能使用 AWS CLI/SDK `MessageMaxBytes`變更為非預設值。例如，若要修改現有的 Kafka 端點並變更 `MessageMaxBytes`，請使用以下命令。  

  ```
  aws dms modify-endpoint --endpoint-arn your-endpoint 
  --kafka-settings Broker="broker1-server:broker1-port,broker2-server:broker2-port,...",
  Topic=topic-name,MessageMaxBytes=integer-of-max-message-size-in-bytes
  ```
+ `IncludeTransactionDetails` – 提供來源資料庫的詳細交易資訊。此資訊包括遞交時間戳記、記錄位置，以及 `transaction_id`、`previous_transaction_id`，和 `transaction_record_id` (交易內的記錄位移) 的值。預設值為 `false`。
+ `IncludePartitionValue` – 在 Kafka 訊息輸出中顯示分割區值，除非分割區類型為 `schema-table-type`。預設值為 `false`。
+ `PartitionIncludeSchemaTable` – 當磁碟分割類型為 `primary-key-type` 時，將結構描述和資料表名稱作為磁碟分割值的前綴。這樣做會增加 Kafka 分割區之間的資料分佈。例如，假設 `SysBench` 結構描述有數千個資料表，而每個資料表的主索引鍵只有有限的範圍。在這種情況下，相同的主金鑰會從數千個資料表發送到相同的分割區，而這將導致調節。預設值為 `false`。
+ `IncludeTableAlterOperations` – 包含變更控制資料中資料表的任何資料定義語言 (DDL) 操作，例如 `rename-table`、`drop-table`、`add-column`、`drop-column` 和 `rename-column`。預設值為 `false`。
+ `IncludeControlDetails` – 在 Kafka 訊息輸出中顯示資料表定義、欄位定義以及資料表和欄位變更的詳細控制資訊。預設值為 `false`。
+ `IncludeNullAndEmpty`：包含目標中的 NULL 和空資料欄。預設值為 `false`。
+ `SecurityProtocol` – 使用 Transport Layer Security (TLS) 設定與 Kafka 目標端點的安全連線。選項包括 `ssl-authentication`、`ssl-encryption` 和 `sasl-ssl`。使用 `sasl-ssl` 將需要 `SaslUsername` 和 `SaslPassword`。
+ `SslEndpointIdentificationAlgorithm` – 設定憑證的主機名稱驗證。3.5.1 版和更新版本支援 AWS DMS 此設定。選項包括下列項目：
  + `NONE`：在用戶端連線中停用代理程式的主機名稱驗證。
  + `HTTPS`：在用戶端連線中啟用代理程式的主機名稱驗證。
+ `useLargeIntegerValue` – 使用最多 18 位數的整數，而不是將整數轉換為雙位元，可從 3.5.4 AWS DMS 版取得。預設值為 false。

您可以使用設定來協助提高傳輸速度。由於要執行此操作， AWS DMS 要支援對一個 Apache Kafka 目標叢集執行多執行緒完全載入。 AWS DMS 透過包含下列項目的任務設定以支援此多執行緒：
+ `MaxFullLoadSubTasks` – 使用此選項來指出要平行載入的來源資料表數量上限。 會使用專用子任務，將每個資料表 AWS DMS 載入其對應的 Kafka 目標資料表。預設值為 8；最大值為 49。
+ `ParallelLoadThreads` – 使用此選項指定 AWS DMS 用於將每個資料表載入其 Kafka 目標資料表的執行緒數目。Apache Kafka 目標的最大值為 32。您可以要求提高此上限。
+ `ParallelLoadBufferSize` – 使用此選項指定平行載入執行緒將資料載入至 Kafka 目標時，緩衝區中存放的記錄數量上限。預設值為 50。最大值為 1000。使用此設定搭配 `ParallelLoadThreads`；`ParallelLoadBufferSize`，只有在有多個執行緒時才有效。
+ `ParallelLoadQueuesPerThread`：使用此選項指定每個並行執行緒存取的佇列數目，以便將資料記錄從佇列中取出，並為目標產生批次載入。預設為 1。最多 512 個。

您可以透過調整平行執行緒和大量操作的任務設定，改善 Kafka 端點的變更資料擷取 (CDC) 效能。若要執行此操作，您可以指定並行執行緒數目、每個執行緒的佇列數，以及使用 `ParallelApply*` 任務設定儲存在緩衝區中的記錄數目。例如，假設您要執行 CDC 載入並平行套用 128 個執行緒。您也想要每個執行緒存取 64 個佇列，且每個緩衝區儲存 50 筆記錄。

為了提升 CDC 效能， AWS DMS 支援下列任務設定：
+ `ParallelApplyThreads` – 指定在 CDC 載入期間 AWS DMS 用來將資料記錄推送至 Kafka 目標端點的並行執行緒數目。預設值為零 (0)，最大值為 32。
+ `ParallelApplyBufferSize` – 指定每個緩衝區佇列中存放的最大記錄數目，以便並行執行緒在 CDC 載入期間推送至 Kafka 目標端點。預設值為 100，最大值為 1,000。`ParallelApplyThreads` 指定多個執行緒時，請使用此選項。
+ `ParallelApplyQueuesPerThread` – 指定每個執行緒存取的佇列數目，以便從佇列中取出資料記錄，並在 CDC 期間產生 Kafka 端點的批次載入。預設為 1。最多 512 個。

在使用 `ParallelApply*` 任務設定時，`partition-key-type` 預設是資料表的 `primary-key`，而非 `schema-name.table-name`。

## 使用 Transport Layer Security (TLS) 連線到 Kafka
<a name="CHAP_Target.Kafka.TLS"></a>

Kafka 叢集只接受使用 Transport Layer Security (TLS) 的安全連線。透過 DMS，您可以使用以下三個安全通訊協定選項中的任一個來保護 Kafka 端點連線。

**SSL 加密 (`server-encryption`)**  
用戶端會透過伺服器的憑證來驗證伺服器身分。接著在伺服器和用戶端之間建立加密連線。

**SSL 驗證 (`mutual-authentication`)**  
伺服器和用戶端透過自己的憑證互相驗證身分。接著在伺服器和用戶端之間建立加密連線。

**SASL-SSL (`mutual-authentication`)**  
簡單驗證和安全層 (SASL) 方法會以使用者名稱和密碼取代用戶端的憑證，用以驗證用戶端的身分。具體來說，您需要提供伺服器已註冊的使用者名稱和密碼，讓伺服器驗證用戶端的身分。接著在伺服器和用戶端之間建立加密連線。

**重要**  
Apache Kafka 和 Amazon MSK 會接受已解析的憑證。這是 Kafka 和 Amazon MSK 的已知限制。如需詳細資訊，請參閱 [Apache Kafka 問題，KAFKA-3700](https://issues.apache.org/jira/browse/KAFKA-3700)。  
如果您使用 Amazon MSK，請考慮使用存取控制清單 (ACL) 作為這項已知限制的解決方案。如需使用 ACL 的詳細資訊，請參閱《*Amazon Managed Streaming for Apache Kafka 開發人員指南*》的「[Apache Kafka ACL](https://docs.aws.amazon.com//msk/latest/developerguide/msk-acls.html)」一節。  
如果您使用的是自我管理的 Kafka 叢集，請參閱 [2018 年 10 月 21 日的註解](https://issues.apache.org/jira/browse/KAFKA-3700?focusedCommentId=16658376)，以取得設定叢集的相關資訊。

### 使用 SSL 加密搭配 Amazon MSK 或自我管理 Kafka 叢集
<a name="CHAP_Target.Kafka.TLS.SSLencryption"></a>

您可以使用 SSL 加密來保護與 Amazon MSK 或自我管理 Kafka 叢集的端點連線。當您使用 SSL 加密驗證方法時，用戶端會透過伺服器憑證來驗證伺服器的身分。接著在伺服器和用戶端之間建立加密連線。

**使用 SSL 加密連線到 Amazon MSK**
+ 建立目標 Kafka 端點時，請使用 `ssl-encryption` 選項設定安全通訊協定端點設定 (`SecurityProtocol`)。

  下列 JSON 範例會將安全協議設為 SSL 加密。

```
"KafkaSettings": {
    "SecurityProtocol": "ssl-encryption", 
}
```

**若要針對自我管理 Kafka 叢集使用 SSL 加密**

1. 如果您在內部部署 Kafka 叢集中使用私有憑證授權機構 (CA)，請上傳您的私有 CA 憑證並取得 Amazon Resource Name (ARN)。

1. 建立目標 Kafka 端點時，請使用 `ssl-encryption` 選項設定安全通訊協定端點設定 (`SecurityProtocol`)。下列 JSON 範例會將安全通訊協議設為 `ssl-encryption`。

   ```
   "KafkaSettings": {
       "SecurityProtocol": "ssl-encryption", 
   }
   ```

1. 如果您使用的是私有 CA，請在上述第一步取得的 ARN 中設定 `SslCaCertificateArn`。

### 使用 SSL 身分驗證
<a name="CHAP_Target.Kafka.TLS.SSLauthentication"></a>

您可以使用 SSL 身分驗證來保護與 Amazon MSK 或自我管理 Kafka 叢集的端點連線。

若要在連線到 Amazon MSK 時使用 SSL 身份驗證進行用戶端身份驗證和加密，請執行下列動作：
+ 準備 Kafka 的私有金鑰和公有憑證。
+ 將憑證上傳到 DMS 憑證管理員：
+ 使用 Kafka 端點設定中指定的對應憑證 ARN 建立 Kafka 目標端點。

**若要準備 Amazon MSK 的私有金鑰和公有憑證**

1. 建立 EC2 執行個體並設定用戶端以使用身份驗證，如《*Amazon Managed Streaming for Apache Kafka 開發人員指南*》中「[用戶端身份驗證](https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html)」一節中的步驟 1 到 9 所述。

   完成這些步驟之後，您將擁有憑證-ARN (儲存在 ACM 中的公用憑證 ARN)，以及 `kafka.client.keystore.jks` 檔案中包含的私有金鑰。

1. 使用下列命令取得公用憑證，並將憑證複製到 `signed-certificate-from-acm.pem` 檔案中：

   ```
   aws acm-pca get-certificate --certificate-authority-arn Private_CA_ARN --certificate-arn Certificate_ARN
   ```

   該命令會傳回類似於以下範例的資訊。

   ```
   {"Certificate": "123", "CertificateChain": "456"}
   ```

   然後，請將與 `"123"` 相等的項目複製到 `signed-certificate-from-acm.pem` 文件中。

1. 從 `kafka.client.keystore.jks to keystore.p12` 中匯入 `msk-rsa` 金鑰以取得私有金鑰，如下列範例所示。

   ```
   keytool -importkeystore \
   -srckeystore kafka.client.keystore.jks \
   -destkeystore keystore.p12 \
   -deststoretype PKCS12 \
   -srcalias msk-rsa-client \
   -deststorepass test1234 \
   -destkeypass test1234
   ```

1. 使用以下命令將 `.pem` 匯出為 `keystore.p12` 格式。

   ```
   Openssl pkcs12 -in keystore.p12 -out encrypted-private-client-key.pem –nocerts
   ```

   **輸入 PEM 密碼短語**訊息隨即出現，並識別用於加密憑證的金鑰。

1. 從 `.pem` 檔案中移除 bag 屬性和 key 屬性，以確定第一行的開頭字串如下。

   ```
                                   ---BEGIN ENCRYPTED PRIVATE KEY---
   ```

**若要將公用憑證和私有金鑰上傳到 DMS 憑證管理員，並測試與 Amazon MSK 的連線**

1. 使用下列命令上傳至 DMS 憑證管理員。

   ```
   aws dms import-certificate --certificate-identifier signed-cert --certificate-pem file://path to signed cert
   aws dms import-certificate --certificate-identifier private-key —certificate-pem file://path to private key
   ```

1. 建立 Amazon MSK 目標端點並測試連線，以確保 TLS 身份驗證可正常運作。

   ```
   aws dms create-endpoint --endpoint-identifier $endpoint-identifier --engine-name kafka --endpoint-type target --kafka-settings 
   '{"Broker": "b-0.kafka260.aaaaa1.a99.kafka.us-east-1.amazonaws.com:0000", "SecurityProtocol":"ssl-authentication", 
   "SslClientCertificateArn": "arn:aws:dms:us-east-1:012346789012:cert:",
   "SslClientKeyArn": "arn:aws:dms:us-east-1:0123456789012:cert:","SslClientKeyPassword":"test1234"}'
   aws dms test-connection -replication-instance-arn=$rep_inst_arn —endpoint-arn=$kafka_tar_arn_msk
   ```

**重要**  
您可以使用 SSL 驗證來保護與自我管理 Kafka 叢集的連線。在某些情況下，您可能會在內部部署 Kafka 叢集中使用私有憑證授權機構 (CA)。若是如此，請將您的 CA 鏈結、公用憑證和私有金鑰上傳至 DMS 憑證管理員。接著，在建立內部部署 Kafka 目標端點時，在端點設定中使用對應的 Amazon Resource Name (ARN)。

**若要準備自我管理 Kafka 叢集的私有金鑰和簽署憑證**

1. 產生金鑰對，如下列範例所示。

   ```
   keytool -genkey -keystore kafka.server.keystore.jks -validity 300 -storepass your-keystore-password 
   -keypass your-key-passphrase -dname "CN=your-cn-name" 
   -alias alias-of-key-pair -storetype pkcs12 -keyalg RSA
   ```

1. 產生憑證簽署請求 (CSR)。

   ```
   keytool -keystore kafka.server.keystore.jks -certreq -file server-cert-sign-request-rsa -alias on-premise-rsa -storepass your-key-store-password 
   -keypass your-key-password
   ```

1. 使用叢集信任存放區中的 CA 來簽署 CSR。如果您沒有 CA，則可以建立自己的私有 CA。

   ```
   openssl req -new -x509 -keyout ca-key -out ca-cert -days validate-days                            
   ```

1. 將 `ca-cert` 匯入至伺服器信任存放區和金鑰存放區。如果您沒有信任存放區，請使用下列命令建立信任存放區，並將 `ca-cert ` 匯入其中。

   ```
   keytool -keystore kafka.server.truststore.jks -alias CARoot -import -file ca-cert
   keytool -keystore kafka.server.keystore.jks -alias CARoot -import -file ca-cert
   ```

1. 簽署憑證。

   ```
   openssl x509 -req -CA ca-cert -CAkey ca-key -in server-cert-sign-request-rsa -out signed-server-certificate.pem 
   -days validate-days -CAcreateserial -passin pass:ca-password
   ```

1. 將簽署的憑證匯入金鑰存放區。

   ```
   keytool -keystore kafka.server.keystore.jks -import -file signed-certificate.pem -alias on-premise-rsa -storepass your-keystore-password 
   -keypass your-key-password
   ```

1. 使用以下命令將 `on-premise-rsa` 金鑰從 `kafka.server.keystore.jks` 匯入至 `keystore.p12`。

   ```
   keytool -importkeystore \
   -srckeystore kafka.server.keystore.jks \
   -destkeystore keystore.p12 \
   -deststoretype PKCS12 \
   -srcalias on-premise-rsa \
   -deststorepass your-truststore-password \
   -destkeypass your-key-password
   ```

1. 使用以下命令將 `.pem` 匯出為 `keystore.p12` 格式。

   ```
   Openssl pkcs12 -in keystore.p12 -out encrypted-private-server-key.pem –nocerts
   ```

1. 將 `encrypted-private-server-key.pem`、`signed-certificate.pem` 和 `ca-cert` 上傳至 DMS 憑證管理員。

1. 使用傳回的 ARN 建立端點。

   ```
   aws dms create-endpoint --endpoint-identifier $endpoint-identifier --engine-name kafka --endpoint-type target --kafka-settings 
   '{"Broker": "b-0.kafka260.aaaaa1.a99.kafka.us-east-1.amazonaws.com:9092", "SecurityProtocol":"ssl-authentication", 
   "SslClientCertificateArn": "your-client-cert-arn","SslClientKeyArn": "your-client-key-arn","SslClientKeyPassword":"your-client-key-password", 
   "SslCaCertificateArn": "your-ca-certificate-arn"}'
                               
   aws dms test-connection -replication-instance-arn=$rep_inst_arn —endpoint-arn=$kafka_tar_arn_msk
   ```

### 使用 SASL-SSL 驗證連線到 Amazon MSK
<a name="CHAP_Target.Kafka.TLS.SSL-SASL"></a>

簡單身分驗證和安全層 (SASL) 方法會透過使用者名稱和密碼來驗證用戶端身分，並在伺服器和用戶端之間建立加密連線。

若要使用 SASL，請先在設定 Amazon MSK 叢集時建立安全的使用者名稱和密碼。如需為 Amazon MSK 叢集設定安全使用者名稱和密碼的說明，請參閱《*Amazon Managed Streaming for Apache Kafka 開發人員指南*》中的「[為 Amazon MSK 叢集設定 SASL/SCRAM 驗證](https://docs.aws.amazon.com/msk/latest/developerguide/msk-password.html#msk-password-tutorial)」。

接著，當您建立 Kafka 目標端點時，請使用 `sasl-ssl` 選項設定安全通訊協定端點設定 (`SecurityProtocol`)。您還可以設定 `SaslUsername` 和 `SaslPassword` 選項。請確定這些欄位與您第一次設定 Amazon MSK 叢集時建立的安全使用者名稱和密碼一致，如以下 JSON 範例所示。

```
                   
"KafkaSettings": {
    "SecurityProtocol": "sasl-ssl",
    "SaslUsername":"Amazon MSK cluster secure user name",
    "SaslPassword":"Amazon MSK cluster secure password"                    
}
```

**注意**  
目前， 僅 AWS DMS 支援公有 CA 支援的 SASL-SSL。DMS 不支援 SASL-SSL 搭配由私有 CA 支援的自我管理 Kafka 使用。
對於 SASL-SSL 身分驗證， 預設 AWS DMS 支援 SCRAM-SHA-512 機制。 AWS DMS 3.5.0 版和更新版本也支援純機制。若要支援 Plain 機制，請將 `KafkaSettings` API 資料類型的 `SaslMechanism` 參數設定為 `PLAIN`。Kafka `PLAIN`支援此資料類型，但 Amazon Kafka (MSK) 不支援。

## 使用前映像檢視做為目標之 Apache Kafka 的 CDC 列原始值
<a name="CHAP_Target.Kafka.BeforeImage"></a>

將 CDC 更新寫入至 Kafka 等資料串流目標時，您可以在更新進行變更前，檢視來源資料庫列的原始值。為了實現這一點， 會根據來源資料庫引擎提供的資料， AWS DMS 填入更新事件*之前的映像*。

不同的來源資料庫引擎可提供不同的前映像資訊量：
+ Oracle 僅提供欄更新 (如果有變更的話)。
+ PostgreSQL 僅提供屬於主索引鍵一部分的欄的資料 (無論是否有變更)。如果邏輯複寫正在使用中，且為來源資料表設定 REPLACY IDENTITY FULL，您可以取得列寫入 WALS 前後的完整資訊，並可在此處取得。
+ MySQL 一般會提供所有欄的資料 (無論是否有變更)。

若要啟用前映像功能以從來源資料庫將原始值新增至 AWS DMS 輸出，請使用 `BeforeImageSettings` 任務設定或 `add-before-image-columns` 參數。此參數會套用欄轉換規則。

`BeforeImageSettings` 會使用從來源資料庫系統收集到的值，將新的 JSON 屬性新增至所有更新操作，如下所示。

```
"BeforeImageSettings": {
    "EnableBeforeImage": boolean,
    "FieldName": string,  
    "ColumnFilter": pk-only (default) / non-lob / all (but only one)
}
```

**注意**  
將 `BeforeImageSettings` 套用至完全載入以及 CDC 任務 (會遷移現有資料並複寫持續變更)，或僅套用至 CDC 任務 (只會複寫資料變更)。請勿將 `BeforeImageSettings` 套用至僅限完全載入的任務。

針對 `BeforeImageSettings` 選項，適用的設定如下：
+ 將 `EnableBeforeImage` 選項設為 `true` 以啟用前映像功能。預設值為 `false`。
+ 使用 `FieldName` 選項，將名稱指派給新的 JSON 屬性。若 `EnableBeforeImage` 為 `true`，`FieldName` 則為必填，且不能留白。
+ `ColumnFilter` 選項會使用前映像來指定要新增的欄。若只要新增屬於資料表主索引鍵一部分的欄，請使用預設值 `pk-only`。若只要新增不屬於 LOB 類型的欄，請使用 `non-lob`。若要新增任何具有前映像值的欄，請使用 `all`。

  ```
  "BeforeImageSettings": {
      "EnableBeforeImage": true,
      "FieldName": "before-image",
      "ColumnFilter": "pk-only"
    }
  ```

### 使用前映像轉換規則
<a name="CHAP_Target.Kafka.BeforeImage.Transform-Rule"></a>

您可使用 `add-before-image-columns` 參數做為任務設定的替代方式，它會套用欄轉換規則。透過此參數，您可以在 Kafka 等資料串流目標上，在 CDC 期間啟用前映像功能。

只要在轉換規則中使用 `add-before-image-columns`，即可套用前映像結果的更精細的控制。轉換規則可讓您使用物件定位器，以便掌控針對規則選取的資料表。此外，您可以將轉換規則鏈結在一起，讓不同的規則套用至不同的資料表。接著，您可以使用其他規則來操控產生的欄。

**注意**  
請勿在同一個任務內將 `add-before-image-columns` 參數與 `BeforeImageSettings` 任務設定一起搭配使用。請改為將參數或設定 (擇一使用，而非兩者同時使用) 用於單一任務。

具有欄的 `add-before-image-columns` 參數的 `transformation` 規則類型必須提供 `before-image-def` 區段。下列顯示一個範例。

```
    {
      "rule-type": "transformation",
      …
      "rule-target": "column",
      "rule-action": "add-before-image-columns",
      "before-image-def":{
        "column-filter": one-of  (pk-only / non-lob / all),
        "column-prefix": string,
        "column-suffix": string,
      }
    }
```

`column-prefix` 的值會附加至欄名稱前，而`column-prefix` 的預設值為 `BI_`。`column-suffix` 的值會附加至欄名稱，而預設值為空白。請勿將 `column-prefix` 和 `column-suffix` 同時設為空白字串。

為 `column-filter` 選擇一個值。若只要新增屬於資料表主索引鍵一部分的欄，請選擇 `pk-only`。選擇 `non-lob` 以僅新增不屬於 LOB 類型的欄。或者，選擇 `all` 以新增任何具有前映像值的欄。

### 前映像轉換規則範例
<a name="CHAP_Target.Kafka.BeforeImage.Example"></a>

下列範例中的轉換規則會在目標中新增名為 `BI_emp_no` 的欄。因此，`UPDATE employees SET emp_no = 3 WHERE emp_no = 1;` 等陳述式會以 1 填入 `BI_emp_no` 欄位。當您將 CDC 更新寫入至 Amazon S3 目標時，`BI_emp_no` 資料欄會讓它能夠分辨哪個原始列已更新。

```
{
  "rules": [
    {
      "rule-type": "selection",
      "rule-id": "1",
      "rule-name": "1",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      },
      "rule-action": "include"
    },
    {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "employees"
      },
      "rule-action": "add-before-image-columns",
      "before-image-def": {
        "column-prefix": "BI_",
        "column-suffix": "",
        "column-filter": "pk-only"
      }
    }
  ]
}
```

如需使用 `add-before-image-columns` 規則動作的相關資訊，請參閱[轉換規則與動作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.md)。

## 使用 Apache Kafka 做為 目標的限制 AWS Database Migration Service
<a name="CHAP_Target.Kafka.Limitations"></a>

使用 Apache Kafka 做為目標時，有下列限制：
+ AWS DMS Kafka 目標端點不支援 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 的 IAM 存取控制。
+ 不支援完全的 LOB 模式。
+ 為您的叢集指定 Kafka 組態檔案，其中包含允許 AWS DMS 自動建立新主題的屬性。包括設定，`auto.create.topics.enable = true`。如果您正在使用 Amazon MSK，您可以在建立 Kafka 叢集時指定預設組態，然後將 `auto.create.topics.enable` 設定變更為 `true`。如需預設組態設定的詳細資訊，請參閱《[Amazon Managed Streaming for Apache Kafka 開發人員指南](https://docs.aws.amazon.com/msk/latest/developerguide/msk-default-configuration.html)》中的「*Amazon MSK 預設組態*」。如果您需要修改使用 Amazon MSK 建立的現有 Kafka 叢集，請執行 AWS CLI 命令`aws kafka create-configuration`來更新您的 Kafka 組態，如下列範例所示：

  ```
  14:38:41 $ aws kafka create-configuration --name "kafka-configuration" --kafka-versions "2.2.1" --server-properties file://~/kafka_configuration
  {
      "LatestRevision": {
          "Revision": 1,
          "CreationTime": "2019-09-06T14:39:37.708Z"
      },
      "CreationTime": "2019-09-06T14:39:37.708Z",
      "Name": "kafka-configuration",
      "Arn": "arn:aws:kafka:us-east-1:111122223333:configuration/kafka-configuration/7e008070-6a08-445f-9fe5-36ccf630ecfd-3"
  }
  ```

  在此，`//~/kafka_configuration` 是您以必要屬性設定所建立的組態檔案。

  如果您使用安裝在 Amazon EC2 上的自己的 Kafka 執行個體，請使用 `auto.create.topics.enable = true`設定修改 Kafka 叢集組態， AWS DMS 以允許 使用執行個體隨附的選項自動建立新主題。
+ AWS DMS 會將每個更新發佈至來源資料庫中的單一記錄，做為指定 Kafka 主題中的一個資料記錄 （訊息），無論交易為何。
+ AWS DMS 支援下列四種形式的分割區索引鍵：
  + `SchemaName.TableName`：結構描述和資料表名稱的組合。
  + `${AttributeName}`：JSON 其中一個欄位的值，或來源資料庫資料表的主索引鍵。
  + `transaction-id`：CDC 交易 ID。相同交易中的所有記錄都會移至相同的分割區。
  + `constant`：無論資料表或資料為何，每個記錄的固定常值。所有記錄都會傳送至相同的分割區索引鍵值「常數」，在所有資料表中提供嚴格的全域排序。

  ```
  {
      "rule-type": "object-mapping",
      "rule-id": "2",
      "rule-name": "TransactionIdPartitionKey",
      "rule-action": "map-record-to-document",
      "object-locator": {
          "schema-name": "onprem",
          "table-name": "it_system"
      },
      "mapping-parameters": {
          "partition-key-type": "transaction-id | constant | attribute-name | schema-table"
      }
  }
  ```
+ 只有在來源`IncludeTransactionDetails`端點為 Oracle、SQL Server、PostgreSQL 或 MySQL 時，才支援端點設定。對於其他來源端點類型，不會包含交易詳細資訊。
+ Kafka 端點不支援 `BatchApply`。對 Kafka 目標使用批次套用 (例如 `BatchApplyEnabled` 目標中繼資料任務設定) 可能會導致資料遺失。
+ AWS DMS 不支援遷移超過 16 位數的`BigInt`資料類型值。若要解決此限制，您可以使用下列轉換規則將 `BigInt` 資料欄轉換為字串。如需轉換規則的詳細資訊，請參閱 [轉換規則與動作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.md)。

  ```
  {
      "rule-type": "transformation",
      "rule-id": "id",
      "rule-name": "name",
      "rule-target": "column",
      "object-locator": {
          "schema-name": "valid object-mapping rule action",
          "table-name": "",
          "column-name": ""
      },
      "rule-action": "change-data-type",
      "data-type": {
          "type": "string",
          "length": 20
      }
  }
  ```
+ AWS DMS Kafka 目標端點不支援 Amazon MSK servless。
+ 定義映射規則時，不支援同時具有物件映射規則和轉換規則。您必須只設定一個規則。
+ AWS DMS 支援最高 3.8 版的 Apache Kafka 的 SASL 身分驗證。如果您使用的是 Kafka 4.0 或更新版本，則只能在沒有 SASL 身分驗證的情況下連線。
+ AWS DMS 使用 Kafka 做為目標端點時， 不支援包含內嵌`'\0'`字元的來源資料。包含內嵌`'\0'`字元的資料會在第一個`'\0'`字元被截斷。

## 使用物件映射將資料遷移到 Kafka 主題
<a name="CHAP_Target.Kafka.ObjectMapping"></a>

AWS DMS 使用資料表映射規則，將資料從來源映射到目標 Kafka 主題。若要將資料映射到目標主題，請使用一種稱為物件映射的資料表映射規則。您可以使用物件映射定義如何將來源中的資料記錄映射到發佈到 Kafka 主題的資料記錄。

除了擁有分割區索引鍵外，Kafka 主題沒有預設結構。

**注意**  
您不一定要使用物件映射。您可以針對各種轉換使用一般資料表映射。不過，分割區索引鍵類型會遵循下列預設行為：  
主索引鍵會作為「完全載入」的分割區索引鍵。
如果未使用平行套用任務設定，則 `schema.table` 會做為 CDC 的分割區索引鍵。
如果使用平行套用任務設定，則主索引鍵會做為 CDC 的分割區索引鍵。

若要建立物件映射規則，請將 `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": ""
            }
        }
    ]
}
```

AWS DMS 目前支援 `map-record-to-record`和 `map-record-to-document`做為 `rule-action` 參數的唯一有效值。這些設定會影響 `exclude-columns` 屬性清單中未排除的值。`map-record-to-record` 和 `map-record-to-document`值預設會指定 AWS DMS 如何處理這些記錄。這些值反正不會影響屬性映射。

從關聯式資料庫遷移到 Kafka 主題時，請使用 `map-record-to-record`。此規則類型使用關聯式資料庫的 `taskResourceId.schemaName.tableName` 值做為 Kafka 主題的分割區索引鍵，並會為來源資料庫中的每一欄建立一個屬性。

使用 `map-record-to-record` 時，請注意下列事項：
+ 此設定只會影響 `exclude-columns` 清單中排除的欄。
+ 對於每個這類資料欄， 會在目標主題中 AWS DMS 建立對應的屬性。
+ AWS DMS 無論屬性映射中是否使用來源資料欄， 都會建立此對應的屬性。

了解 `map-record-to-record` 的一種方法是查看它運作時的狀態。在本範例中，假設您開始使用之關聯式資料庫資料表資料列的結構和資料如下。


| FirstName | LastName | StoreId | HomeAddress | HomePhone | WorkAddress | WorkPhone | DateofBirth | 
| --- | --- | --- | --- | --- | --- | --- | --- | 
| Randy | Marsh | 5 | 221B Baker Street | 1234567890 | 31 Spooner Street, Quahog  | 9876543210 | 1988/02/29 | 

若要將此資訊從名為 `Test` 的結構描述遷移至 Kafka 主題，您可以建立規則以將資料映射至目標主題。以下規則說明映射。

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "rule-action": "include",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            }
        },
        {
            "rule-type": "object-mapping",
            "rule-id": "2",
            "rule-name": "DefaultMapToKafka",
            "rule-action": "map-record-to-record",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "Customers"
            }
        }
    ]
}
```

指定 Kafka 主題和分割區索引鍵 (在本例中為 `taskResourceId.schemaName.tableName`)，下列說明使用我們在 Kafka 目標主題中的範例資料所產生的記錄格式：

```
  {
     "FirstName": "Randy",
     "LastName": "Marsh",
     "StoreId":  "5",
     "HomeAddress": "221B Baker Street",
     "HomePhone": "1234567890",
     "WorkAddress": "31 Spooner Street, Quahog",
     "WorkPhone": "9876543210",
     "DateOfBirth": "02/29/1988"
  }
```

**Topics**
+ [使用屬性映射重組資料](#CHAP_Target.Kafka.AttributeMapping)
+ [使用物件映射的多主題複製](#CHAP_Target.Kafka.MultiTopic)
+ [Apache Kafka 訊息格式](#CHAP_Target.Kafka.Messageformat)

### 使用屬性映射重組資料
<a name="CHAP_Target.Kafka.AttributeMapping"></a>

您可以在使用屬性映射將資料遷移到 Kafka 主題的同時重組資料。例如，您可能想要將來源的幾個欄位合併為目標的單一欄位。以下屬性映射說明如何重組資料。

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "rule-action": "include",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            }
        },
        {
            "rule-type": "object-mapping",
            "rule-id": "2",
            "rule-name": "TransformToKafka",
            "rule-action": "map-record-to-record",
            "target-table-name": "CustomerData",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "Customers"
            },
            "mapping-parameters": {
                "partition-key-type": "attribute-name",
                "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": "${lastname}, ${firstname}"
                    },
                    {
                        "target-attribute-name": "ContactDetails",
                        "attribute-type": "document",
                        "attribute-sub-type": "json",
                        "value": {
                            "Home": {
                                "Address": "${homeaddress}",
                                "Phone": "${homephone}"
                            },
                            "Work": {
                                "Address": "${workaddress}",
                                "Phone": "${workphone}"
                            }
                        }
                    }
                ]
            }
        }
    ]
}
```

若要設定 的常數值`partition-key`，請指定 `"partition-key-type: "constant"`，這會將分割區值設定為 `constant`。例如，您可以執行此操作，將所有資料強制儲存在單一分割區中。以下映射說明此方法。

```
{
    "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": "1",
            "rule-name": "TransformToKafka",
            "rule-action": "map-record-to-document",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "Customer"
            },
            "mapping-parameters": {
                "partition-key-type": "constant",
                "exclude-columns": [
                    "FirstName",
                    "LastName",
                    "HomeAddress",
                    "HomePhone",
                    "WorkAddress",
                    "WorkPhone"
                ],
                "attribute-mappings": [
                    {
                        "attribute-name": "CustomerName",
                        "value": "${FirstName},${LastName}"
                    },
                    {
                        "attribute-name": "ContactDetails",
                        "value": {
                            "Home": {
                                "Address": "${HomeAddress}",
                                "Phone": "${HomePhone}"
                            },
                            "Work": {
                                "Address": "${WorkAddress}",
                                "Phone": "${WorkPhone}"
                            }
                        }
                    },
                    {
                        "attribute-name": "DateOfBirth",
                        "value": "${DateOfBirth}"
                    }
                ]
            }
        }
    ]
}
```

**注意**  
用於特定資料表的控制記錄 `partition-key` 值是 `TaskId.SchemaName.TableName`。用於特定任務的控制記錄 `partition-key` 值是該記錄的 `TaskId`。在物件映射中指定 `partition-key` 值對控制記錄的 `partition-key` 沒有影響。  
 在資料表映射規則`attribute-name`中`partition-key-type`將 設定為 時，您必須指定 `partition-key-name`，其必須參考來源資料表中的資料欄或映射中定義的自訂資料欄。此外，`attribute-mappings`必須提供 來定義來源資料欄如何對應至目標 Kafka 主題。

### 使用物件映射的多主題複製
<a name="CHAP_Target.Kafka.MultiTopic"></a>

根據預設， AWS DMS 任務會將所有來源資料遷移至下列其中一個 Kafka 主題：
+ 如 AWS DMS 目標端點**的主題**欄位中所指定。
+ 如果目標端點的**主題**欄位未填寫，且 Kafka `auto.create.topics.enable` 設定為 `true`，則為 `kafka-default-topic` 指定的主題。

透過 AWS DMS 引擎 3.4.6 版和更新版本，您可以使用 `kafka-target-topic` 屬性，將每個遷移的來源資料表對應至個別主題。例如，物件映射規則隨後會將來源資料表 `Customer` 和 `Address` 分別遷移至 Kafka 主題 `customer_topic` 及 `address_topic`。同時， 會將所有其他來源資料表 AWS DMS 遷移至目標端點中指定的主題，包括`Test`結構描述中的`Bills`資料表。

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "rule-action": "include",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            }
        },
        {
            "rule-type": "object-mapping",
            "rule-id": "2",
            "rule-name": "MapToKafka1",
            "rule-action": "map-record-to-record",
            "kafka-target-topic": "customer_topic",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "Customer" 
            },
            "partition-key-type": "constant"
        },
        {
            "rule-type": "object-mapping",
            "rule-id": "3",
            "rule-name": "MapToKafka2",
            "rule-action": "map-record-to-record",
            "kafka-target-topic": "address_topic",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "Address"
            },
            "partition-key-type": "constant"
        },
        {
            "rule-type": "object-mapping",
            "rule-id": "4",
            "rule-name": "DefaultMapToKafka",
            "rule-action": "map-record-to-record",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "Bills"
            }
        }
    ]
}
```

透過使用 Kafka 多主題複寫，您可以使用單一複寫任務將來源資料表來分組和遷移至個別 Kafka 主題。

### Apache Kafka 訊息格式
<a name="CHAP_Target.Kafka.Messageformat"></a>

JSON 輸出僅是索引鍵/值對的清單。

**RecordType**  
記錄類型可以是資料或控制。*資料記錄*代表來源的實際資料列。*控制記錄*用於串流的重要事件，例如重新啟動任務。

**作業**  
針對資料記錄，操作可以是 `load`、`insert`、`update` 或 `delete`。  
針對控制記錄，操作可以是 `create-table`、`rename-table`、`drop-table`、`change-columns`、`add-column`、`drop-column`、`rename-column` 或 `column-type-change`。

**SchemaName**  
記錄的來源結構描述。控制記錄的此欄位可以為空。

**TableName**  
記錄的來源資料表。控制記錄的此欄位可以為空。

**時間戳記**  
JSON 訊息建構時間的時間戳記。此欄位格式為 ISO 8601 格式。

下列 JSON 訊息範例展示包含所有其他中繼資料的資料類型訊息。

```
{ 
   "data":{ 
      "id":100000161,
      "fname":"val61s",
      "lname":"val61s",
      "REGION":"val61s"
   },
   "metadata":{ 
      "timestamp":"2019-10-31T22:53:59.721201Z",
      "record-type":"data",
      "operation":"insert",
      "partition-key-type":"primary-key",
      "partition-key-value":"sbtest.sbtest_x.100000161",
      "schema-name":"sbtest",
      "table-name":"sbtest_x",
      "transaction-id":9324410911751,
      "transaction-record-id":1,
      "prev-transaction-id":9324410910341,
      "prev-transaction-record-id":10,
      "commit-timestamp":"2019-10-31T22:53:55.000000Z",
      "stream-position":"mysql-bin-changelog.002171:36912271:0:36912333:9324410911751:mysql-bin-changelog.002171:36912209"
   }
}
```

下列 JSON 訊息範例展示控制類型訊息。

```
{ 
   "control":{ 
      "table-def":{ 
         "columns":{ 
            "id":{ 
               "type":"WSTRING",
               "length":512,
               "nullable":false
            },
            "fname":{ 
               "type":"WSTRING",
               "length":255,
               "nullable":true
            },
            "lname":{ 
               "type":"WSTRING",
               "length":255,
               "nullable":true
            },
            "REGION":{ 
               "type":"WSTRING",
               "length":1000,
               "nullable":true
            }
         },
         "primary-key":[ 
            "id"
         ],
         "collation-name":"latin1_swedish_ci"
      }
   },
   "metadata":{ 
      "timestamp":"2019-11-21T19:14:22.223792Z",
      "record-type":"control",
      "operation":"create-table",
      "partition-key-type":"task-id",
      "schema-name":"sbtest",
      "table-name":"sbtest_t1"
   }
}
```

# 使用 Amazon OpenSearch Service 叢集做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.Elasticsearch"></a>

您可以使用 AWS DMS 將資料遷移至 Amazon OpenSearch Service (OpenSearch Service)。OpenSearch Service 是一項受管服務，可讓您輕鬆地部署、操作和擴展 OpenSearch Service 叢集。

在 OpenSearch Service 中，您可以使用索引和文件。*索引*是文件的集合，而*文件*是包含純量值、陣列和其他物件的 JSON 物件。 OpenSearch 提供以 JSON 為基礎的查詢語言，讓您可以查詢索引中的資料並擷取對應的文件。

當 為 OpenSearch Service 的目標端點 AWS DMS 建立索引時，它會從來源端點為每個資料表建立一個索引。建立 OpenSearch Service 索引的成本因數項因素而異。這些是建立的索引數量、這些索引中的資料總量，以及為每個文件 OpenSearch 存放的少量中繼資料。

以適用於您遷移範圍的運算和儲存資源設定 OpenSearch Service 叢集。建議您考慮以下因素，視您想要使用的複寫任務而定：
+ 若為完全資料載入，請考慮您希望遷移的總資料量，以及傳輸速度。
+ 若為複寫持續的變更，請考慮更新頻率，以及您的端對端延遲要求。

此外，進行 OpenSearch 叢集的索引設定，密切注意文件計數。

**多執行緒完全載入任務設定**

為了協助提高傳輸速度， AWS DMS 支援對 OpenSearch Service 目標叢集的多執行緒完全載入。 AWS DMS 支援此多執行緒的任務設定包括下列項目：
+ `MaxFullLoadSubTasks`：使用此選項，指出要平行載入的來源資料表數目上限。DMS 會使用專用子任務，將每個資料表載入到其對應的 OpenSearch Service 目標索引。預設值為 8；最大值為 49。
+ `ParallelLoadThreads` – 使用此選項來指定 AWS DMS 用來將每個資料表載入其 OpenSearch Service 目標索引的執行緒數目。OpenSearch Service 目標的最大值為 32。您可以要求提高此上限。
**注意**  
如果您未將 `ParallelLoadThreads` 變更為預設值 (0) 以外的值，則 AWS DMS 一次傳送單一記錄。此方法可將過度的載入放置在 OpenSearch Service 叢集上。確定您將此選項設定為 1 或以上。
+ `ParallelLoadBufferSize`：使用此選項指定平行載入執行緒，將資料載入至 OpenSearch Service 目標時，緩衝區中儲存的記錄數量上限。預設值為 50。最大值為 1000。使用此設定搭配 `ParallelLoadThreads`；`ParallelLoadBufferSize`，只有在有多個執行緒時才有效。

如需 DMS 如何使用多執行緒載入 OpenSearch Service 叢集的詳細資訊，請參閱 AWS 部落格文章 [Scale Amazon OpenSearch Service for AWS Database Migration Service migrations](https://aws.amazon.com/blogs/database/scale-amazon-elasticsearch-service-for-aws-database-migration-service-migrations/)。

**多執行緒 CDC 載入任務設定**

您可以使用任務設定來修改 `PutRecords` API 呼叫行為，改善 OpenSearch Service 目標叢集的變更資料擷取 (CDC) 效能。若要執行此操作，您可以指定並行執行緒數目、每個執行緒的佇列數，以及使用 `ParallelApply*` 任務設定儲存在緩衝區中的記錄數目。例如，假設您要執行 CDC 載入並平行套用 32 個執行緒。您也想要每個執行緒存取 64 個佇列，且每個緩衝區儲存 50 筆記錄。
**注意**  
在 CDC 到 Amazon OpenSearch Service 目標端點期間使用`ParallelApply*`任務設定的支援可在 3.4.0 版和更高 AWS DMS 版本中使用。

為了提升 CDC 效能， AWS DMS 支援下列任務設定：
+ `ParallelApplyThreads` – 指定在 CDC 載入期間 AWS DMS 用來將資料記錄推送至 OpenSearch Service 目標端點的並行執行緒數目。預設值為零 (0)，最大值為 32。
+ `ParallelApplyBufferSize`：指定每個緩衝區佇列中儲存的最大記錄數目，以便並行執行緒在 CDC 載入期間推送至 OpenSearch Service 目標端點。預設值為 100，最大值為 1,000。`ParallelApplyThreads` 指定多個執行緒時，請使用此選項。
+ `ParallelApplyQueuesPerThread`：指定每個執行緒存取的佇列數目，以便從佇列中取出資料記錄，並在 CDC 期間產生 OpenSearch Service 端點的批次載入。

在使用 `ParallelApply*` 任務設定時，`partition-key-type` 預設是資料表的 `primary-key`，而非 `schema-name.table-name`。

## 從關聯式資料庫資料表遷移到 OpenSearch Service 索引
<a name="CHAP_Target.Elasticsearch.RDBMS2Elasticsearch"></a>

AWS DMS 支援將資料遷移至 OpenSearch Service 的純量資料類型。從 Oracle 或 MySQL 等關聯式資料庫遷移到 OpenSearch Service 時，您可能想要重組此資料的儲存方式。

AWS DMS 支援下列 OpenSearch Service 純量資料類型：
+ Boolean 
+ Date
+ Float
+ Int
+ String

AWS DMS 將 Date 類型的資料轉換為 String 類型。您可以指定自訂映射解譯這些日期。

AWS DMS 不支援遷移 LOB 資料類型。

## 使用 Amazon OpenSearch Service 做為 目標的先決條件 AWS Database Migration Service
<a name="CHAP_Target.Elasticsearch.Prerequisites"></a>

開始使用 OpenSearch Service 資料庫做為 的目標之前 AWS DMS，請務必建立 AWS Identity and Access Management (IAM) 角色。此角色應可讓 AWS DMS 存取目標端點上的 OpenSearch Service 索引。以下 IAM 政策顯示最低的存取許可集。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "Service": "dms.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
        }
    ]
}
```

------

遷移到 OpenSearch Service 所用的角色必須擁有下列許可。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "es:ESHttpDelete",
        "es:ESHttpGet",
        "es:ESHttpHead",
        "es:ESHttpPost",
        "es:ESHttpPut"
      ],
      "Resource": "*"
    }
  ]
}
```

------

在上述範例中，將 取代`region`為 AWS 區域識別符、*`account-id`*將 取代為 AWS 您的帳戶 ID，並將 `domain-name`取代為 Amazon OpenSearch Service 網域名稱。範例為 `arn:aws:es:us-west-2:123456789012:domain/my-es-domain`

## 使用 OpenSearch Service 做為 目標時的端點設定 AWS DMS
<a name="CHAP_Target.Elasticsearch.Configuration"></a>

您可以使用端點設定來設定 OpenSearch Service 目標資料庫，類似於使用額外的連線屬性。當您使用 AWS DMS 主控台或使用 中的 `create-endpoint`命令搭配 `--elasticsearch-settings '{"EndpointSetting": "value", ...}'` JSON 語法來建立目標端點時[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)，您可以指定設定。

下列資料表顯示您可以將 OpenSearch Service 作為目標使用的端點設定。


| 屬性名稱 | 有效值 | 預設值和描述 | 
| --- | --- | --- | 
|  `FullLoadErrorPercentage`   |  正整數大於 0，但不超過 100。  |  10 – 針對完全載入任務，此屬性決定判定任務失敗的錯誤閾值。例如，假設來源端點有 1,500 個資料列，而此參數設為 10。然後，如果寫入目標端點時 AWS DMS 遇到超過 150 個錯誤 （列計數的 10%)，任務會失敗。  | 
|   `ErrorRetryDuration`   |  正整數大於 0。  |  300 – 如果目標端點發生錯誤， 會 AWS DMS 重試這幾秒鐘。否則，任務失敗。  | 
|  `UseNewMappingType`  | true 或 false |  `false`，但若要使用 opensearch v2.x，應設定為 。 `true`  | 

## 使用 Amazon OpenSearch Service 做為 目標的限制 AWS Database Migration Service
<a name="CHAP_Target.Elasticsearch.Limitations"></a>

使用 Amazon OpenSearch Service 作為目標時，有下列限制：
+ OpenSearch Service 使用動態對應 (自動猜測)，以決定遷移資料所用的資料類型。
+ OpenSearch Service 會以不重複的 ID 儲存每個文件。以下是範例 ID。

  ```
  "_id": "D359F8B537F1888BC71FE20B3D79EAE6674BE7ACA9B645B0279C7015F6FF19FD"
  ```

  每個文件 ID 是都 64 位元組長，所以這預計為儲存需求。例如，如果您從 AWS DMS 來源遷移 100，000 個資料列，則產生的 OpenSearch Service 索引需要額外 6，400，000 個位元組的儲存空間。
+ 使用 OpenSearch Service 時，您無法更新主索引鍵屬性。此限制在使用變更資料擷取 (CDC) 進行中複寫時十分重要，因為它會導致目標出現不需要的資料。在 CDC 模式下，主索引鍵會映射到 SHA256 值，這有 32 位元組長。這些都會轉換成人類可讀的 64 位元組字串，作為 OpenSearch Service 文件 ID 使用。
+ 如果 AWS DMS 遇到任何無法遷移的項目，它會將錯誤訊息寫入 Amazon CloudWatch Logs。此行為與其他 AWS DMS 目標端點的行為不同，其會將錯誤寫入例外狀況資料表。
+ AWS DMS 不支援連線至使用主要使用者和密碼啟用精細存取控制的 Amazon ES 叢集。
+ AWS DMS 不支援 OpenSearch Service Serverless。
+ OpenSearch Service 不支援將資料寫入預先存在的索引。
+ 複寫任務設定`TargetTablePrepMode:TRUNCATE_BEFORE_LOAD`不支援與 OpenSearch 目標端點搭配使用。
+ 使用 將資料遷移至 Amazon Elasticsearch 時 AWS DMS，來源資料必須具有主索引鍵或唯一識別符欄。如果來源資料沒有主索引鍵或唯一識別符，您需要使用 define-primary-key 轉換規則來定義。

## Amazon OpenSearch Service 的目標資料類型
<a name="CHAP_Target.Elasticsearch.DataTypes"></a>

當 從異質資料庫 AWS DMS 遷移資料時，服務會將資料類型從來源資料庫映射到稱為 AWS DMS 資料類型的中繼資料類型。然後，此服務會將中繼資料類型映射到目標資料類型。下表顯示每個 AWS DMS 資料類型及其在 OpenSearch Service 中映射到的資料類型。


| AWS DMS 資料類型 | OpenSearch Service 資料類型 | 
| --- | --- | 
|  Boolean  |  boolean  | 
|  日期  |  string  | 
|  時間  |  date  | 
|  時間戳記  |  date  | 
|  INT4  |  integer  | 
|  Real4  |  float  | 
|  UINT4  |  integer  | 

如需 AWS DMS 資料類型的詳細資訊，請參閱 [AWS Database Migration Service 的資料類型](CHAP_Reference.DataTypes.md)。

# 使用 Amazon DocumentDB 做為 AWS Database Migration Service 的目標
<a name="CHAP_Target.DocumentDB"></a>

 如需 AWS DMS 支援的 Amazon DocumentDB 版本 （具有 MongoDB 相容性） 的相關資訊，請參閱 [的目標 AWS DMS](CHAP_Introduction.Targets.md)。您可以從 AWS DMS 支援的任何來源資料引擎，使用 AWS DMS 將資料遷移到 Amazon DocumentDB (with MongoDB compatibility)。來源引擎可以在 AWS 受管服務上，例如 Amazon RDS、Aurora 或 Amazon S3。或者，引擎可以在自我管理資料庫中，例如在 Amazon EC2 或內部部署上執行的 MongoDB。

您可以使用 AWS DMS 將來源資料複寫至 Amazon DocumentDB 資料庫、集合或文件。

**注意**  
如果來源端點是 MongoDB 或 Amazon DocumentDB，請以**文件模式**執行遷移。

MongoDB 以二進位 JSON 格式 (BSON) 存放資料。 AWS DMS 支援 Amazon DocumentDB 支援的所有 BSON 資料類型。如需這些資料類型的清單，請參閱《Amazon DocumentDB 開發人員指南》**中[支援的 MongoDB API、操作和資料類型](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html)。

如果來源端點是關聯式資料庫，請將資料庫物件 AWS DMS 映射至 Amazon DocumentDB，如下所示：
+ 關聯式資料庫或資料庫結構描述，會對應到 Amazon DocumentDB 資料庫**。
+ 關聯式資料庫中的資料表會對應至 Amazon DocumentDB 中的集合**。
+ 關聯式資料表中的記錄會對應至 Amazon DocumentDB 中的文件**。每個文件是從來源記錄中的資料建構而來。

如果來源端點是 Amazon S3，則產生的 Amazon DocumentDB 物件會對應到 Amazon S3 的 AWS DMS 對應規則。例如，請參閱下列 URI。

```
s3://amzn-s3-demo-bucket/hr/employee
```

在此情況下， 會將 中的物件 AWS DMS 映射`amzn-s3-demo-bucket`至 Amazon DocumentDB，如下所示：
+ 最上層 URI 部分 (`hr`) 會對應到 Amazon DocumentDB 資料庫。
+ 下一個 URI 部分 (`employee`) 會對應到 Amazon DocumentDB 集合。
+ `employee` 中的每個物件會對應到 Amazon DocumentDB 中的文件。

如需 Amazon S3 對應規則的詳細資訊，請參閱[使用 Amazon S3 做為 的來源 AWS DMS](CHAP_Source.S3.md)。

**Amazon DocumentDB 端點設定**

在 3.5.0 版及更高 AWS DMS 版本中，您可以透過調校平行執行緒和大量操作的任務設定，來改善 Amazon DocumentDB 端點的變更資料擷取 (CDC) 效能。若要執行此操作，您可以指定並行執行緒數目、每個執行緒的佇列數，以及使用 `ParallelApply*` 任務設定儲存在緩衝區中的記錄數目。例如，假設您要執行 CDC 載入並平行套用 128 個執行緒。您也想要每個執行緒存取 64 個佇列，且每個緩衝區儲存 50 筆記錄。

為了提升 CDC 效能， AWS DMS 支援下列任務設定：
+ `ParallelApplyThreads` – 指定在 CDC 載入期間 AWS DMS 用來將資料記錄推送至 Amazon DocumentDB 目標端點的並行執行緒數目。預設值為零 (0)，最大值為 32。
+ `ParallelApplyBufferSize`：指定每個緩衝區佇列中儲存的最大記錄數目，以便並行執行緒在 CDC 載入期間推送至 Amazon DocumentDB 目標端點。預設值為 100，最大值為 1,000。`ParallelApplyThreads` 指定多個執行緒時，請使用此選項。
+ `ParallelApplyQueuesPerThread`：指定每個執行緒存取的佇列數目，以便從佇列中取出資料記錄，並在 CDC 期間產生 Amazon DocumentDB 端點的批次載入。預設為 1。最多 512 個。

**注意**  
 對於 Amazon DocumentDB 目標，套用平行 CDC 可能會導致重複的金鑰錯誤，或套用停滯的 CDC 適用於使用次要唯一索引或需要嚴格排序變更的工作負載。使用這些工作負載的預設單執行緒 CDC 套用組態。

如需使用 Amazon DocumentDB 做為目標的其他詳細資訊 AWS DMS，請參閱下列章節：

**Topics**
+ [將資料從來源對應到 Amazon DocumentDB 目標](#CHAP_Target.DocumentDB.data-mapping)
+ [連線到 Amazon DocumentDB 彈性叢集作為目標](#CHAP_Target.DocumentDB.data-mapping.elastic-cluster-connect)
+ [以 Amazon DocumentDB 作為目標的進行中複寫](#CHAP_Target.DocumentDB.data-mapping.ongoing-replication)
+ [使用 Amazon DocumentDB 作為目標的限制](#CHAP_Target.DocumentDB.limitations)
+ [將端點設定與作為目標的 Amazon DocumentDB 搭配使用](#CHAP_Target.DocumentDB.ECAs)
+ [Amazon DocumentDB 的目標資料類型](#CHAP_Target.DocumentDB.datatypes)

**注意**  
如需遷移程序的step-by-step演練，請參閱 AWS Database Migration Service Step-by-Step遷移指南中的[從 MongoDB 遷移至 Amazon DocumentDB](https://docs.aws.amazon.com/dms/latest/sbs/CHAP_MongoDB2DocumentDB.html)。

## 將資料從來源對應到 Amazon DocumentDB 目標
<a name="CHAP_Target.DocumentDB.data-mapping"></a>

AWS DMS 從來源端點讀取記錄，並根據讀取的資料建構 JSON 文件。對於每個 JSON 文件， AWS DMS 必須決定要做為唯一識別符`_id`的欄位。接著會使用 `_id` 欄位作為主索引鍵，將 JSON 文件寫入 Amazon DocumentDB 集合。

### 單一資料行的來源資料
<a name="CHAP_Target.DocumentDB.data-mapping.single-column"></a>

如果來源資料包含單一欄，則資料必須是字串類型。（視來源引擎而定，實際資料類型可能是 VARCHAR、NVARCHAR、TEXT、LOB、CLOB 或類似類型。) AWS DMS 假設資料是有效的 JSON 文件，並依原樣將資料複寫至 Amazon DocumentDB。

如果產生的 JSON 文件包含名為 `_id` 的欄位，則該欄位會用作 Amazon DocumentDB 中的唯一 `_id`。

如果 JSON 不包含 `_id` 欄位，則 Amazon DocumentDB 會自動產生 `_id` 值。

### 多個資料行的來源資料
<a name="CHAP_Target.DocumentDB.data-mapping.multiple-columns"></a>

如果來源資料包含多個資料欄，則 AWS DMS 會從所有這些資料欄建構 JSON 文件。若要判斷文件`_id`的欄位， AWS DMS 請執行下列操作：
+ 如果其中一欄名為 `_id`，則該欄中的資料會用做為目標 `_id`。
+ 如果沒有資料`_id`欄，但來源資料具有主索引鍵或唯一索引，則 AWS DMS 會使用該索引鍵或索引值做為`_id`值。主索引鍵或唯一索引的資料也會顯示為 JSON 文件中的明確欄位。
+ 如果沒有 `_id` 資料欄，也沒有主索引鍵或唯一索引，則 Amazon DocumentDB 會自動產生 `_id` 值。

### 在目標端點上強制轉換資料類型
<a name="CHAP_Target.DocumentDB.coercing-datatype"></a>

AWS DMS 可以在寫入 Amazon DocumentDB 目標端點時修改資料結構。您可以藉由在來源端點重新命名欄和資料表，或在執行任務時提供套用的轉換規則，來請求這些變更。

#### 用巢狀 JSON 文件 (json\$1 prefix)
<a name="CHAP_Target.DocumentDB.coercing-datatype.json"></a>

若要強制轉換資料類型，您可以透過手動方式或使用轉換，將 `json_` 加到來源欄名稱的字首 (也就是 `json_columnName`)。在這種情況下，該欄會建立為目標文件內的巢狀 JSON 文件，而非字串欄位。

例如，假設您希望從 MongoDB 來源端點遷移下列文件。

```
{
    "_id": "1", 
    "FirstName": "John", 
    "LastName": "Doe",
    "ContactDetails": "{"Home": {"Address": "Boston","Phone": "1111111"},"Work": { "Address": "Boston", "Phone": "2222222222"}}"
}
```

如果您不強制轉換任何來源資料類型，會以字串的形式將內嵌的 `ContactDetails` 文件加以遷移。

```
{
    "_id": "1", 
    "FirstName": "John", 
    "LastName": "Doe",
    "ContactDetails": "{\"Home\": {\"Address\": \"Boston\",\"Phone\": \"1111111\"},\"Work\": { \"Address\": \"Boston\", \"Phone\": \"2222222222\"}}"
}
```

不過，您可以新增轉換規則，以強制轉換 `ContactDetails` 為 JSON 物件。例如，假設原始的來源欄名稱為 `ContactDetails`。若要將資料類型強制設定為巢狀 JSON，必須將來源端點的資料欄重新命名為 json\$1ContactDetails”，方法是手動或透過轉換規則在來源上新增 “\$1json\$1\$1“ 前綴。例如，您可以使用下面的轉換規則：

```
{
    "rules": [
    {
    "rule-type": "transformation",
    "rule-id": "1",
    "rule-name": "1",
    "rule-target": "column",
    "object-locator": {
    "schema-name": "%",
    "table-name": "%",
    "column-name": "ContactDetails"
     },
    "rule-action": "rename",
    "value": "json_ContactDetails",
    "old-value": null
    }
    ]
}
```

AWS DMS 會將 ContactDetails 欄位複寫為巢狀 JSON，如下所示。

```
{
    "_id": "1",
    "FirstName": "John",
    "LastName": "Doe",
    "ContactDetails": {
        "Home": {
            "Address": "Boston",
            "Phone": "1111111111"
        },
        "Work": {
            "Address": "Boston",
            "Phone": "2222222222"
        }
    }
}
```

#### 使用 JSON 陣列 (array\$1 prefix)
<a name="CHAP_Target.DocumentDB.coercing-datatype.array"></a>

若要強制轉換資料類型，您可以透過手動方式或使用轉換，將 `array_` 加到欄名稱的字首 (也就是 `array_columnName`)。在此情況下， 會將資料欄 AWS DMS 視為 JSON 陣列，並在目標文件中以此方式建立資料欄。

假設您希望從 MongoDB 來源端點遷移下列文件。

```
{
    "_id" : "1",
    "FirstName": "John",
    "LastName": "Doe", 
    "ContactAddresses": ["Boston", "New York"],             
    "ContactPhoneNumbers": ["1111111111", "2222222222"]
}
```

如果您不強制轉換任何來源資料類型，會以字串的形式將內嵌的 `ContactDetails` 文件加以遷移。

```
{
    "_id": "1",
    "FirstName": "John",
    "LastName": "Doe", 
    "ContactAddresses": "[\"Boston\", \"New York\"]",             
    "ContactPhoneNumbers": "[\"1111111111\", \"2222222222\"]" 
}
```

 不過，您可以新增轉換規則，以將 `ContactAddress` 和 `ContactPhoneNumbers` 強制轉換為 JSON 陣列，如下表所示。


****  

| 原始的來源資料行名稱 | 重新命名的來源資料行 | 
| --- | --- | 
| ContactAddress | array\$1ContactAddress | 
| ContactPhoneNumbers | array\$1ContactPhoneNumbers | 

AWS DMS 會複寫 `ContactAddress`和 `ContactPhoneNumbers`，如下所示。

```
{
    "_id": "1",
    "FirstName": "John",
    "LastName": "Doe",
    "ContactAddresses": [
        "Boston",
        "New York"
    ],
    "ContactPhoneNumbers": [
        "1111111111",
        "2222222222"
    ]
}
```

### 使用 TLS 連接到 Amazon DocumentDB
<a name="CHAP_Target.DocumentDB.tls"></a>

依預設，新建立的 Amazon DocumentDB 叢集僅接受使用 Transport Layer Security (TLS) 的安全連線。啟用 TLS 時，每個 Amazon DocumentDB 連線都需要公有金鑰。

您可以從 AWS 託管的 Amazon S3 儲存貯體下載 檔案 ，以擷取 Amazon DocumentDB 的公有金鑰。 `rds-combined-ca-bundle.pem` Amazon S3 如需下載此檔案的相關資訊，請參閱《Amazon DocumentDB 開發人員指南》**中的[使用 TLS 加密連線](https://docs.aws.amazon.com/documentdb/latest/developerguide/security.encryption.ssl.html)

下載此 .pem 檔案後，您可以將其包含的公有金鑰匯入 AWS DMS ，如下所述。

#### AWS 管理主控台
<a name="CHAP_Target.DocumentDB.tls.con"></a>

**匯入公有金鑰 (.pem) 檔案**

1. 在 https：//[https://console.aws.amazon.com/dms](https://console.aws.amazon.com/dms) 開啟 AWS DMS 主控台。

1. 在導覽窗格中，選擇 **Certificates (憑證)**。

1. 選擇 **Import certificate (匯入憑證)** 並執行下列作業：
   + 針對 **Certificate identifier (憑證 ID)**，輸入憑證的唯一名稱，例如 `docdb-cert`。
   + 針對 **Import file (匯入檔案)**，導覽至 .pem 檔案的儲存位置。

   當您滿意設定後，選擇 **Add new CA certificate (新增 CA 憑證)**。

#### AWS CLI
<a name="CHAP_Target.DocumentDB.tls.cli"></a>

使用 `aws dms import-certificate` 命令，如下列範例所示。

```
aws dms import-certificate \
    --certificate-identifier docdb-cert \
    --certificate-pem file://./rds-combined-ca-bundle.pem
```

當您建立 AWS DMS 目標端點時，請提供憑證識別符 （例如 `docdb-cert`)。另外，將 SSL 模式參數設為 `verify-full`。

## 連線到 Amazon DocumentDB 彈性叢集作為目標
<a name="CHAP_Target.DocumentDB.data-mapping.elastic-cluster-connect"></a>

在 3.4.7 版和更新 AWS DMS 版本中，您可以將 Amazon DocumentDB 目標端點建立為彈性叢集。如果您將目標端點建立為彈性叢集，則需要將新的 SSL 憑證連接到 Amazon DocumentDB 彈性叢集端點，因為現有的 SSL 憑證無法運作。

**將新的 SSL 憑證連接到 Amazon DocumentDB 彈性叢集端點**

1. 例如，在瀏覽器中開啟 [https://www.amazontrust.com/repository/SFSRootCAG2.pem](https://www.amazontrust.com/repository/SFSRootCAG2.pem)，並將內容儲存到具有唯一檔案名稱的 `.pem` 檔案中，例如 `SFSRootCAG2.pem`。這是您在後續步驟中需要匯入的憑證檔案。

1. 建立 Elastic Clusters 端點並設定下列選項：

   1. 在**端點組態**下，選擇**新增 CA 憑證**。

   1. 然後，對於**憑證識別碼**，輸入 **SFSRootCAG2.pem**。

   1. 對於**匯入憑證檔案**，選擇**選擇檔案**，然後瀏覽至您先前下載的 `SFSRootCAG2.pem` 檔案。

   1. 選取檔案，然後開啟已下載的 `SFSRootCAG2.pem` 檔案。

   1. 選擇 **Import certificate (匯入憑證)**。

   1. 從**選擇憑證**下拉式清單中，選擇 **SFSRootCAG2.pem**。

下載 `SFSRootCAG2.pem` 檔案中的新 SSL 憑證現在會連接至 Amazon DocumentDB 彈性叢集端點。

## 以 Amazon DocumentDB 作為目標的進行中複寫
<a name="CHAP_Target.DocumentDB.data-mapping.ongoing-replication"></a>

如果針對作為目標 Amazon DocumentDB 啟用進行中複寫 (變更資料擷取，CDC)，則 AWS DMS 3.5.0 版及更高版本的效能提升是舊版的二十倍。在先前的版本中， 每秒 AWS DMS 處理多達 250 筆記錄， AWS DMS 現在可有效率地每秒處理超過 5000 筆記錄。 AWS DMS 也確保 Amazon DocumentDB 中的文件與來源保持同步。建立或更新來源記錄時， AWS DMS 必須先執行下列動作來判斷哪些 Amazon DocumentDB 記錄受到影響：
+ 如果來源記錄的資料欄名為 `_id`，該資料欄的值可決定 Amazon DocumentDB 集合中對應的 `_id`。
+ 如果沒有資料`_id`欄，但來源資料具有主索引鍵或唯一索引，則 AWS DMS 會使用該索引鍵或索引值做為 Amazon DocumentDB 集合`_id`的 。
+ 如果來源記錄沒有資料`_id`欄、主索引鍵或唯一索引，則 會將所有來源資料欄 AWS DMS 比對至 Amazon DocumentDB 集合中的對應欄位。

建立新的來源記錄時， 會將對應的文件 AWS DMS 寫入 Amazon DocumentDB。如果現有來源記錄已更新， 會 AWS DMS 更新 Amazon DocumentDB 中目標文件中的對應欄位。存在於目標文件，但不在來源記錄中的任何欄位，會保持不變。

刪除來源記錄時， 會從 Amazon DocumentDB AWS DMS 刪除對應的文件。

### 來源的結構變更 (DDL)
<a name="CHAP_Target.DocumentDB.data-mapping.ongoing-replication.ddl"></a>

使用進行中複寫時，對來源資料結構 (如資料表、資料欄等) 的任何變更會傳播到 Amazon DocumentDB 中的對應部分。在關聯式資料庫中，會使用資料定義語言 (DDL) 陳述式來初始化這些變更。您可以在下表中查看 如何將這些變更 AWS DMS 傳播至 Amazon DocumentDB。


****  

| 來源的 DDL | 在 Amazon DocumentDB 目標的影響 | 
| --- | --- | 
| CREATE TABLE | 建立空集合。 | 
| 重新命名資料表 (RENAME TABLE、ALTER TABLE...RENAME 等) 的陳述式 | 重新命名集合。 | 
| TRUNCATE TABLE | 只有 HandleSourceTableTruncated 為 true 時，才會從集合中移除所有文件。如需詳細資訊，請參閱[變更處理 DDL 處理的任務設定](CHAP_Tasks.CustomizingTasks.TaskSettings.DDLHandling.md)。 | 
| DROP TABLE | 只有 HandleSourceTableDropped 為 true 時，才會刪除集合。如需詳細資訊，請參閱[變更處理 DDL 處理的任務設定](CHAP_Tasks.CustomizingTasks.TaskSettings.DDLHandling.md)。 | 
| 將欄新增到資料表 (ALTER TABLE...ADD 等) 的陳述式 | DDL 陳述式被忽略，並發出警告。當第一個 INSERT 在來源中執行，新欄位會新增到目標文件。 | 
| ALTER TABLE...RENAME COLUMN | DDL 陳述式被忽略，並發出警告。當第一個 INSERT 在來源中執行，新命名的欄位會新增到目標文件。 | 
| ALTER TABLE...DROP COLUMN | DDL 陳述式被忽略，並發出警告。 | 
| 變更欄資料類型 (ALTER COLUMN...MODIFY 等) 的陳述式 | DDL 陳述式被忽略，並發出警告。當第一個 INSERT 與新的資料類型在來源中執行時，會使用該新資料類型的欄位來建立目標文件。 | 

## 使用 Amazon DocumentDB 作為目標的限制
<a name="CHAP_Target.DocumentDB.limitations"></a>

使用 Amazon DocumentDB 做為 的目標時，適用下列限制 AWS DMS：
+ 在 Amazon DocumentDB 中，集合名稱不能包含金錢符號 (\$1)。此外，資料庫名稱不能包含任何 Unicode 字元。
+ AWS DMS 不支援將多個來源資料表合併為單一 Amazon DocumentDB 集合。
+ 當 AWS DMS 程序從沒有主索引鍵的來源資料表變更時，該資料表中的任何 LOB 資料欄都會遭到忽略。
+ 如果 **Change table (變更資料表)** 選項已啟用，且 AWS DMS 遇到名為「*\$1id*」的來源欄，該欄會在變更資料表中顯示為「*\$1\$1id*」(兩個底線)。
+ 如果您選擇 Oracle 做為來源端點，則 Oracle 來源必須啟用完整的補充記錄。否則，如果來源中有未變更的資料欄，則資料會載入 Amazon DocumentDB 作為 Null 值。
+ 不支援將複寫任務設定 `TargetTablePrepMode:TRUNCATE_BEFORE_LOAD` 與 DocumentDB 目標端點搭配使用。
+ Amazon DocumentDB 不支援 MongoDB 上限集合。不過， AWS DMS 會自動遷移這類物件，例如目標 DocumentDB 上的無上限集合。
+ 平行 CDC 適用於 Amazon DocumentDB 目標可能會導致重複的金鑰錯誤或停滯的 CDC 適用於使用次要唯一索引或需要嚴格排序變更的工作負載。對於此類工作負載，請使用預設的單執行緒 CDC 套用組態。

## 將端點設定與作為目標的 Amazon DocumentDB 搭配使用
<a name="CHAP_Target.DocumentDB.ECAs"></a>

您可以使用端點設定來設定 Amazon DocumentDB 目標資料庫，類似於使用額外的連線屬性。當您使用 AWS DMS 主控台或使用 中的 `create-endpoint`命令搭配 `--doc-db-settings '{"EndpointSetting": "value", ...}'` JSON 語法來建立目標端點時[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)，您可以指定設定。

下列資料表顯示您可以在將 Amazon DocumentDB 作為目標搭配使用的端點設定。


| 屬性名稱 | 有效值 | 預設值和描述 | 
| --- | --- | --- | 
|   `replicateShardCollections`   |  boolean `true` `false`  |  `true` 時，此端點設定會產生下列影響，並會施加下列限制： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.DocumentDB.html)  | 

## Amazon DocumentDB 的目標資料類型
<a name="CHAP_Target.DocumentDB.datatypes"></a>

在下表中，您可以找到使用 DMS 時支援的 Amazon DocumentDB AWS 目標資料類型，以及來自 DMS AWS 資料類型的預設映射。如需 AWS DMS 資料類型的詳細資訊，請參閱 [AWS Database Migration Service 的資料類型](CHAP_Reference.DataTypes.md)。


|  AWS DMS 資料類型  |  Amazon DocumentDB 資料類型  | 
| --- | --- | 
|  BOOLEAN  |  Boolean  | 
|  BYTES  |  二進位資料  | 
|  DATE  | Date | 
|  TIME  | 字串 (UTF8) | 
|  DATETIME  | Date | 
|  INT1  | 32 位元整數 | 
|  INT2  |  32 位元整數  | 
|  INT4  | 32 位元整數 | 
|  INT8  |  64 位元整數  | 
|  NUMERIC  | 字串 (UTF8) | 
|  REAL4  |  Double  | 
|  REAL8  | Double | 
|  STRING  |  如果資料辨識為 JSON，則 會將資料 AWS DMS 遷移至 Amazon DocumentDB 做為文件。否則，資料會映射到字串 (UTF8)。  | 
|  UINT1  | 32 位元整數 | 
|  UINT2  | 32 位元整數 | 
|  UINT4  | 64 位元整數 | 
|  UINT8  |  字串 (UTF8)  | 
|  WSTRING  | 如果資料辨識為 JSON，則 會將資料 AWS DMS 遷移至 Amazon DocumentDB 做為文件。否則，資料會映射到字串 (UTF8)。 | 
|  BLOB  | 二進位 | 
|  CLOB  | 如果資料辨識為 JSON，則 會將資料 AWS DMS 遷移至 Amazon DocumentDB 做為文件。否則，資料會映射到字串 (UTF8)。 | 
|  NCLOB  | 如果資料辨識為 JSON，則 會將資料 AWS DMS 遷移至 Amazon DocumentDB 做為文件。否則，資料會映射到字串 (UTF8)。 | 

# 使用 Amazon Neptune 做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.Neptune"></a>

Amazon Neptune 是快速、可靠、全受管的圖形資料庫服務，可讓您輕鬆建置和執行搭配高度連線資料集使用的應用程式。Neptune 的核心是專門打造的高效能圖形資料庫引擎。此引擎的專屬設計可儲存數十億筆關係，且查詢圖形時只會有數毫秒的延遲。Neptune 支援熱門圖形查詢語言 Apache TinkerPop Gremlin 和 W3C 的 SPARQL。如需有關 Amazon Neptune 的詳細資訊，請參閱《*Amazon Neptune 使用者指南*》中的「[什麼是 Amazon Neptune？](https://docs.aws.amazon.com/neptune/latest/userguide/intro.html) 」。

如果沒有 Neptune 這種圖形資料庫，您可能會在關聯式資料庫中模擬高度連線的資料。因為資料具有潛在的動態連線，所以使用這類資料來源的應用程式必須在 SQL 中模擬連線的資料查詢。此方法要求您編寫一個額外的圖層並將圖表查詢轉換為 SQL。此外，關聯式資料庫具有結構描述的剛性。結構描述中的任何變更以模擬變更連線，都需要停機時間和查詢轉換的額外維護，以支援新的結構描述。查詢性能也是在設計應用程式時要考慮的另一大限制。

圖形資料庫可以大幅簡化此情況。不含結構描述，豐富的圖形查詢層 (Gremlin 或 SPARQL) 和針對圖形查詢最佳化的索引提高了靈活性和性能。Amazon Neptune 圖形資料庫也具有企業功能，例如，靜態加密、安全授權層、預設備份、異地同步備份支援、僅供讀取複本支援等。

使用 AWS DMS，您可以將關聯式資料從任何支援的 SQL 資料庫的 DMS 來源端點，將高度連線圖形模型化至 Neptune 目標端點。

如需詳細資訊，請參閱下列內容。

**Topics**
+ [以 Amazon Neptune 為目標的遷移概觀](#CHAP_Target.Neptune.MigrationOverview)
+ [指定 Amazon Neptune 做為目標的端點設定](#CHAP_Target.Neptune.EndpointSettings)
+ [建立 IAM 服務角色以存取做為目標的 Amazon Neptune](#CHAP_Target.Neptune.ServiceRole)
+ [使用 Gremlin 和 R2RML 以 Amazon Neptune 做為目標指定圖形映射規則](#CHAP_Target.Neptune.GraphMapping)
+ [Amazon Neptune 做為目標遷移的 Gremlin 和 R2RML 資料類型](#CHAP_Target.Neptune.DataTypes)
+ [使用 Amazon Neptune 做為目標的限制](#CHAP_Target.Neptune.Limitations)

## 以 Amazon Neptune 為目標的遷移概觀
<a name="CHAP_Target.Neptune.MigrationOverview"></a>

開始遷移至 Neptune 目標之前，請在 AWS 您的帳戶中建立下列資源：
+ 目標端點的 Neptune 叢集。
+ 來源端點支援的 SQL AWS DMS 關聯式資料庫。
+ 目標端點的 Amazon S3 儲存貯體。在與 Neptune 叢集相同的 AWS 區域中建立此 S3 儲存貯體。 會將 AWS DMS 此 S3 儲存貯體用作其大量載入至 Neptune 資料庫的目標資料的中繼檔案儲存體。如需有關建立 S3 儲存貯體的詳細資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的「[建立儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html)」。
+ 與 Neptune 叢集位於相同 VPC 中的 S3 虛擬私有雲端 (VPC) 端點。
+ 包含 IAM 政策的 AWS Identity and Access Management (IAM) 角色。此政策應為您的目標端點指定 S3 儲存貯體的`GetObject`、`PutObject`、`DeleteObject` 和 `ListObject` 權限。此角色由具有目標 S3 儲存貯體 AWS DMS 和 Neptune 資料庫之 IAM 存取權的 和 Neptune 擔任。如需詳細資訊，請參閱[建立 IAM 服務角色以存取做為目標的 Amazon Neptune](#CHAP_Target.Neptune.ServiceRole)。

擁有這些資源後，設定和啟動 Neptune 目標遷移與使用主控台或 DMS API 的任何完全載入遷移類似。不過，遷移至 Neptune 目標需要一些獨特的步驟。

**將 AWS DMS 關聯式資料庫遷移至 Neptune**

1. 如 [建立複寫執行個體](CHAP_ReplicationInstance.Creating.md) 所述，建立複寫執行個體。

1. 針對 AWS DMS 來源端點建立和測試 支援的 SQL 關聯式資料庫。

1. 為您的 Neptune 資料庫建立目標端點並進行測試。

   若要將目標端點連接至 Neptune 資料庫，請指定 Neptune 叢集端點或 Neptune 寫入器執行個體端點的伺服器名稱。此外，請指定 的 S3 儲存貯體資料夾 AWS DMS ，以存放其中繼檔案，以便大量載入 Neptune 資料庫。

   在遷移期間， 會將此 S3 儲存貯體資料夾中所有遷移的目標資料 AWS DMS 儲存到您指定的檔案大小上限。當此檔案儲存體達到此大小上限時， 會將儲存的 S3 資料 AWS DMS 大量載入目標資料庫。它會清除資料夾以啟用儲存任何其他目標資料，以便後續載入目標資料庫。如需指定這些設定的詳細資訊，請參閱 [指定 Amazon Neptune 做為目標的端點設定](#CHAP_Target.Neptune.EndpointSettings)。

1. 在步驟 1-3 中建立的資源建立完全載入複寫工作，並執行下列動作：

   1. 像往常一樣使用任務資料表映射，以識別使用適當的選取項目和轉換規則從關聯式資料庫遷移的特定來源結構描述、資料表和檢視表。如需詳細資訊，請參閱[使用資料表映射指定任務設定](CHAP_Tasks.CustomizingTasks.TableMapping.md)。

   1. 透過選擇以下選項之一指定目標映射，以指定來源資料表和檢視表到 Neptune 目標資料庫圖形的映射規則：
      + Gremlin JSON — 如需使用 Gemlin JSON 載入 Neptune 資料庫的相關資訊，請參閱《*Amazon Neptune 使用者指南*》中的「[Gemlin 載入資料格式](https://docs.aws.amazon.com/neptune/latest/userguide/bulk-load-tutorial-format-gremlin.html)」。
      + SPARQL RDB 到資源描述架構映射語言 (R2RML) 如需有關使用 SPARQL R2RML 的詳細資訊，請參閱《[W3C 規格 R2RML：RDB 到 RDF 映射語言](https://www.w3.org/TR/r2rml/)》。

   1. 執行以下任意一項：
      + 使用 AWS DMS 主控台，在**建立資料庫遷移任務**頁面上使用圖形**映射規則指定圖形**映射選項。
      + 使用 AWS DMS API，使用 `CreateReplicationTask` API 呼叫的`TaskData`請求參數指定這些選項。

      如需有關使用 Gremlin JSON 和 SPARQL R2RML 指定圖形映射規則的詳細資訊和範例，請參閱 [使用 Gremlin 和 R2RML 以 Amazon Neptune 做為目標指定圖形映射規則](#CHAP_Target.Neptune.GraphMapping)。

1. 啟動遷移任務的複寫。

## 指定 Amazon Neptune 做為目標的端點設定
<a name="CHAP_Target.Neptune.EndpointSettings"></a>

若要建立或修改目標端點，您可以使用主控台或 `CreateEndpoint` 或 `ModifyEndpoint` API 作業。

對於 AWS DMS 主控台中的 Neptune 目標，請在**建立端點**或修改**端點**主控台頁面上指定**端點特定設定**。對於 `CreateEndpoint` 和 `ModifyEndpoint`，指定 `NeptuneSettings` 選項的請求參數。下列範例將示範如何使用 CLI 來做到這一點。

```
dms create-endpoint --endpoint-identifier my-neptune-target-endpoint
--endpoint-type target --engine-name neptune 
--server-name my-neptune-db.cluster-cspckvklbvgf.us-east-1.neptune.amazonaws.com 
--port 8192
--neptune-settings 
     '{"ServiceAccessRoleArn":"arn:aws:iam::123456789012:role/myNeptuneRole",
       "S3BucketName":"amzn-s3-demo-bucket",
       "S3BucketFolder":"amzn-s3-demo-bucket-folder",
       "ErrorRetryDuration":57,
       "MaxFileSize":100, 
       "MaxRetryCount": 10, 
       "IAMAuthEnabled":false}‘
```

在這裡，CLI `--server-name` 選項會指定 Neptune 叢集寫入器端點的服務器名稱。或者，您可以指定 Neptune 寫入器執行個體端點的伺服器名稱。

`--neptune-settings` 選項請求參數如下：
+ `ServiceAccessRoleArn` – (必要) 您為 Neptune 目標端點建立的服務角色的 Amazon Resource Name (ARN)。如需詳細資訊，請參閱[建立 IAM 服務角色以存取做為目標的 Amazon Neptune](#CHAP_Target.Neptune.ServiceRole)。
+ `S3BucketName` – (必要) S3 儲存貯體的名稱，此儲存貯體為 DMS 可以在將資料大量載入至 Neptune 目標資料庫之前，將遷移的圖形資料暫時儲存在 .csv 檔案的位置。DMS 會將 SQL 來源資料映射至圖形資料，然後再將其存放在這些 .csv 檔案中。
+ `S3BucketFolder` – (必要) 資料夾路徑，也就是您希望 DMS 將遷移的圖形資料儲存在 `S3BucketName` 指定的 S3 儲存貯體位置。
+ `ErrorRetryDuration` – (選用) 在引發錯誤前，DMS 等待重試將遷移圖形資料大量載入到 Neptune 目標資料庫的毫秒數。預設值為 250。
+ `MaxFileSize` – (選用) DMS 將資料大量載入到 Neptune 目標資料庫之前，儲存在 .csv 檔案中的遷移圖形資料大小上限 (以 KB 為單位)。預設值為 1,048,576 KB (1 GB)。如果成功，DMS 會清除儲存貯體，準備儲存下一批遷移的圖形資料。
+ `MaxRetryCount` – (選用) DMS 在重試將遷移圖形資料大量載入到 Neptune 目標資料庫後發生錯誤的毫秒數。預設值為 5。
+ `IAMAuthEnabled` – (選用) 如果您希望為此端點啟用 IAM 授權，請將此參數設定為 `true` 並將適當的 IAM 政策文件附加至 `ServiceAccessRoleArn` 指定的服務角色。預設值為 `false`。

## 建立 IAM 服務角色以存取做為目標的 Amazon Neptune
<a name="CHAP_Target.Neptune.ServiceRole"></a>

若要將 Neptune 作為目標存取，請使用 IAM 建立服務角色。根據您的 Neptune 端點組態，將下列部分或全部 IAM 政策和信任文件附加至此角色。建立 Neptune 端點時，您會提供此服務角色的 ARN。這樣做可讓 AWS DMS 和 Amazon Neptune 同時取得存取 Neptune 及其相關聯 Amazon S3 儲存貯體的許可。

如果您在 Neptune 端點組態將 `NeptuneSettings` 中的 `IAMAuthEnabled` 參數設定為 `true`，請將如下所示的 IAM 政策附加到您的服務角色。如果您設定 `IAMAuthEnabled` 為 `false`，則可以忽略此政策。

```
// Policy to access Neptune

    {
        "Version": "2012-10-17",		 	 	 
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": "neptune-db:*",
                "Resource": "arn:aws:neptune-db:us-east-1:123456789012:cluster-CLG7H7FHK54AZGHEH6MNS55JKM/*"
            }
        ]
    }
```

上述 IAM 政策允許完整存取由 `Resource` 指定的 Neptune 目標叢集。

將如下所示的 IAM 政策附加到您的服務角色。此政策可以讓 DMS 暫時將遷移的圖形資料儲存在您為大量載入至 Neptune 目標資料庫而建立的 S3 儲存貯體中。

```
//Policy to access S3 bucket

{
	"Version": "2012-10-17",		 	 	 
	"Statement": [{
			"Sid": "ListObjectsInBucket0",
			"Effect": "Allow",
			"Action": "s3:ListBucket",
			"Resource": [
				"arn:aws:s3:::amzn-s3-demo-bucket"
			]
		},
		{
			"Sid": "AllObjectActions",
			"Effect": "Allow",
			"Action": ["s3:GetObject",
				"s3:PutObject",
				"s3:DeleteObject"
			],

			"Resource": [
				"arn:aws:s3:::amzn-s3-demo-bucket/"
			]
		},
		{
			"Sid": "ListObjectsInBucket1",
			"Effect": "Allow",
			"Action": "s3:ListBucket",
			"Resource": [
				"arn:aws:s3:::amzn-s3-demo-bucket",
				"arn:aws:s3:::amzn-s3-demo-bucket/"
			]
		}
	]
}
```

上述 IAM 政策允許您的帳戶查詢為 Neptune 目標建立的 S3 儲存貯體 (`arn:aws:s3:::amzn-s3-demo-bucket`) 內容。也允許您的帳戶完全操作所有儲存貯體檔案和文件夾（`arn:aws:s3:::amzn-s3-demo-bucket/`）的內容。

編輯信任關係，並將下列 IAM 角色連接至您的服務角色，以允許 AWS DMS 和 Amazon Neptune 資料庫服務擔任該角色。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "dms.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Sid": "neptune",
      "Effect": "Allow",
      "Principal": {
        "Service": "rds.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

如需為 Neptune 目標端點指定此服務角色的相關資訊，請參閱 [指定 Amazon Neptune 做為目標的端點設定](#CHAP_Target.Neptune.EndpointSettings)。

## 使用 Gremlin 和 R2RML 以 Amazon Neptune 做為目標指定圖形映射規則
<a name="CHAP_Target.Neptune.GraphMapping"></a>

您建立的圖形映射規則會指定如何將從 SQL 關聯式資料庫來源擷取的資料載入至 Neptune 資料庫叢集目標。這些映射規則的格式取決於，此規則是否使用 Apache TinkerPop Gremlin 載入屬性圖形或使用 R2RML 載入資源描述框架 (RDF) 資料。接下來，您可以尋找這些格式的相關資訊，以及在何處進一步了解。

當您使用主控台或 DMS API 建立遷移任務時，可以指定這些映射規則。

使用主控台，使用**建立資料庫遷移任務**頁面上的**圖形對應規則**來指定這些對應規則。在 **Graph mapping rules (圖形映射規則)** 中，您可以使用提供的編輯器直接輸入和編輯映射規則。或者，您可以瀏覽以適當的圖形映射格式包含映射規則的檔案。

使用 API，並使用 `CreateReplicationTask` API 呼叫的 `TaskData` 要求參數指定此選項。將檔案路徑設定為 `TaskData` 並以適當的圖形映射格式包含映射規則。

### 使用 Gremlin 產生屬性圖形資料的圖形映射規則
<a name="CHAP_Target.Neptune.GraphMapping.Gremlin"></a>

使用 Gremlin 產生屬性圖形資料，為即將根據來源資料產生的每個圖形實體提供映射規則指定一個 JSON 物件。此 JSON 的格式是專門針對大量載入 Amazon Neptune 所定義。下列範本顯示此物件中每個規則的外觀。

```
{
    "rules": [
        {
            "rule_id": "(an identifier for this rule)",
            "rule_name": "(a name for this rule)",
            "table_name": "(the name of the table or view being loaded)",
            "vertex_definitions": [
                {
                    "vertex_id_template": "{col1}",
                    "vertex_label": "(the vertex to create)",
                    "vertex_definition_id": "(an identifier for this vertex)",
                    "vertex_properties": [
                        {
                            "property_name": "(name of the property)",
                            "property_value_template": "{col2} or text",
                            "property_value_type": "(data type of the property)"
                        }
                    ]
                }
            ]
        },
        {
            "rule_id": "(an identifier for this rule)",
            "rule_name": "(a name for this rule)",
            "table_name": "(the name of the table or view being loaded)",
            "edge_definitions": [
                {
                    "from_vertex": {
                        "vertex_id_template": "{col1}",
                        "vertex_definition_id": "(an identifier for the vertex referenced above)"
                    },
                    "to_vertex": {
                        "vertex_id_template": "{col3}",
                        "vertex_definition_id": "(an identifier for the vertex referenced above)"
                    },
                    "edge_id_template": {
                        "label": "(the edge label to add)",
                        "template": "{col1}_{col3}"
                    },
                    "edge_properties":[
                        {
                            "property_name": "(the property to add)",
                            "property_value_template": "{col4} or text",
                            "property_value_type": "(data type like String, int, double)"
                        }
                    ]
                }
            ]
        }
    ]
}
```

頂點標籤的存在意味著正在此處建立頂點。它的缺席意味著頂點是由不同的來源建立，並且這個定義只是新增頂點屬性。根據需要指定任意數目的頂點和邊緣定義，以指定整個關聯式資料庫來源的映射。

`employee` 資料表的範例規則如下。

```
{
    "rules": [
        {
            "rule_id": "1",
            "rule_name": "vertex_mapping_rule_from_nodes",
            "table_name": "nodes",
            "vertex_definitions": [
                {
                    "vertex_id_template": "{emp_id}",
                    "vertex_label": "employee",
                    "vertex_definition_id": "1",
                    "vertex_properties": [
                        {
                            "property_name": "name",
                            "property_value_template": "{emp_name}",
                            "property_value_type": "String"
                        }
                    ]
                }
            ]
        },
        {
            "rule_id": "2",
            "rule_name": "edge_mapping_rule_from_emp",
            "table_name": "nodes",
            "edge_definitions": [
                {
                    "from_vertex": {
                        "vertex_id_template": "{emp_id}",
                        "vertex_definition_id": "1"
                    },
                    "to_vertex": {
                        "vertex_id_template": "{mgr_id}",
                        "vertex_definition_id": "1"
                    },
                    "edge_id_template": {
                        "label": "reportsTo",
                        "template": "{emp_id}_{mgr_id}"
                    },
                    "edge_properties":[
                        {
                            "property_name": "team",
                            "property_value_template": "{team}",
                            "property_value_type": "String"
                        }
                    ]
                }
            ]
        }
    ]
}
```

在這裡，頂點和邊緣定義映射從員工 ID (`EmpID`) 的 `employee` 節點和經理 ID (`managerId`) 的 `employee` 節點映射報告關係。

如需有關使用 Gemlin JSON 建立圖形映射規則的詳細資訊，請參閱《*Amazon Neptune 使用者指南*》中的「[Gemlin 載入資料格式](https://docs.aws.amazon.com/neptune/latest/userguide/bulk-load-tutorial-format-gremlin.html)」。

### 用於產生 RDF/SPARQL 資料的圖形映射規則
<a name="CHAP_Target.Neptune.GraphMapping.R2RML"></a>

如果您要載入使用 SPARQL 查詢的 RDF 資料，請在 R2RML 編寫圖形映射規則。R2RML 是用於關係資料映射到 RDF 標準的 W3C 語言。在 R2RML 檔案中，*三倍映射* (例如，以下 `<#TriplesMap1>`) 指定用於將邏輯資料表中的每一行轉換為零或多個 RDF 三倍的規則。*主題映射* (例如，以下任何`rr:subjectMap`) 指定用於產生由三倍映射產生的 RDF 三倍物件的規則。*述詞物件映射* (例如，以下任何 `rr:predicateObjectMap`) 是為邏輯資料表的每個邏輯資料表行建立一個或多個述詞物件組。

`nodes` 資料表的簡單範例如下。

```
@prefix rr: <http://www.w3.org/ns/r2rml#>.
@prefix ex: <http://example.com/ns#>.

<#TriplesMap1>
    rr:logicalTable [ rr:tableName "nodes" ];
    rr:subjectMap [
        rr:template "http://data.example.com/employee/{id}";
        rr:class ex:Employee;
    ];
    rr:predicateObjectMap [
        rr:predicate ex:name;
        rr:objectMap [ rr:column "label" ];
    ]
```

在前面的例子中，映射定義了從員工資料表映射的圖形節點。

`Student` 資料表的另一個簡單示例如下。

```
@prefix rr: <http://www.w3.org/ns/r2rml#>.
@prefix ex: <http://example.com/#>.
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.

<#TriplesMap2>
    rr:logicalTable [ rr:tableName "Student" ];
    rr:subjectMap   [ rr:template "http://example.com/{ID}{Name}";
                      rr:class foaf:Person ];
    rr:predicateObjectMap [
        rr:predicate ex:id ;
        rr:objectMap  [ rr:column "ID";
                        rr:datatype xsd:integer ]
    ];
    rr:predicateObjectMap [
        rr:predicate foaf:name ;
        rr:objectMap  [ rr:column "Name" ]
    ].
```

在前面的例子中，映射定義圖形節點映射 `Student` 資料表中的人與人之間的朋友關係。

如需有關使用 SPARQL R2RML 建立圖形映射規則的詳細資訊，請參閱 W3C 規格 [R2RML：RDB 至 RDF 映射語言](https://www.w3.org/TR/r2rml/)。

## Amazon Neptune 做為目標遷移的 Gremlin 和 R2RML 資料類型
<a name="CHAP_Target.Neptune.DataTypes"></a>

AWS DMS 會以兩種方式之一，執行從 SQL 來源端點到 Neptune 目標的資料類型映射。您使用哪種方式取決於您用來載入 Neptune 資料庫的圖形映射格式：
+ Apache TinkerPop Gremlin，使用遷移資料的 JSON 表示形式。
+ W3C 的 SPARQL，使用遷移資料的 R2RML 表示形式。

如需這兩種圖形映射格式的詳細資訊，請參閱 [使用 Gremlin 和 R2RML 以 Amazon Neptune 做為目標指定圖形映射規則](#CHAP_Target.Neptune.GraphMapping)。

接下來，您可以找到每種格式的資料類型映射的描述。

### SQL 來源到 Gremlin 目標資料類型映射
<a name="CHAP_Target.Neptune.DataTypes.Gremlin"></a>

以下資料表顯示從 SQL 來源到 Gremlin 格式化目標的資料類型映射。

AWS DMS 會將任何未列出的 SQL 來源資料類型映射至 Gremlin `String`。



[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.Neptune.html)

如需用於載入 Neptune 的 Gemlin 資料類型的詳細資訊，請參閱《*Neptune 使用者指南*》中的《[Gemlin 資料類型](https://docs.aws.amazon.com//neptune/latest/userguide/bulk-load-tutorial-format-gremlin.html#bulk-load-tutorial-format-gremlin-datatypes)》。

### SQL 來源到 R2RML (RDF) 目標資料類型映射
<a name="CHAP_Target.Neptune.DataTypes.R2RML"></a>

以下資料表顯示從 SQL 來源到 R2RML 格式化目標的資料類型映射。

所有列出的 RDF 資料類型都區分大小寫，但 RDF literal. AWS DMS maps 任何未列出的 SQL 來源資料類型到 RDF 常值。

 *RDF 常值*是多種常值語彙形式和資料類型之一。如需詳細資訊，請參閱 W3C 規格*資源描述架構 (RDF)：概念和抽象語法*中的「[RDF 常值](https://www.w3.org/TR/2004/REC-rdf-concepts-20040210/#section-Graph-Literal)」。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.Neptune.html)

如需有關載入 Neptune 的 RDF 資料類型，及其對應至 SQL 來源資料類型的詳細資訊，請參閱 W3C 規格 *R2RML：RDB 至 RDF 對應語言*的「[資料類型轉換](https://www.w3.org/TR/r2rml/#datatype-conversions)」。

## 使用 Amazon Neptune 做為目標的限制
<a name="CHAP_Target.Neptune.Limitations"></a>

使用 Neptune 做為目標時，有下列限制：
+ AWS DMS 目前僅支援將完全載入任務遷移至 Neptune 目標。未支援變更資料擷取 (CDC) 遷移至 Neptune 目標。
+ 在啟動遷移任務之前，請確定您的目標 Neptune 資料庫已手動清除所有資料，如以下範例所示。

  若要刪除圖形中的所有資料 (頂點和邊緣)，需運行以下 Gremlin 命令。

  ```
  gremlin> g.V().drop().iterate()
  ```

  若要刪除具有標籤 `'customer'` 的頂點，需運行以下 Gremlin 命令。

  ```
  gremlin> g.V().hasLabel('customer').drop()
  ```
**注意**  
需要一些時間來刪除大型資料集。您可能想要逐一查看 `drop()` 的一個限制，例如，`limit(1000)`。

  若要刪除具有標籤 `'rated'` 的邊緣，需運行以下 Gremlin 命令。

  ```
  gremlin> g.E().hasLabel('rated').drop()
  ```
**注意**  
需要一些時間來刪除大型資料集。您可能想要逐一查看 `drop()` 的一個限制，例如，`limit(1000)`。
+ DMS API 作業 `DescribeTableStatistics` 可能會傳回有關給予資料表的不正確結果，因為 Neptune 圖形資料結構的性質。

  在遷移期間， AWS DMS 會掃描每個來源資料表，並使用圖形映射將來源資料轉換為 Neptune 圖形。轉換後的資料會先儲存在為目標端點指定的 S3 儲存貯體資料夾中。如果掃描來源並成功產生此中繼 S3 資料，則 `DescribeTableStatistics` 會假設資料已成功載入至 Neptune 目標資料庫。但這並不是都是正確的。若要驗證給予資料表的資料已正確載入，請比較該資料表遷移兩端的 `count()` 傳回值。

  在下列範例中， AWS DMS 已從來源資料庫載入`customer`資料表，並在目標 Neptune 資料庫圖表`'customer'`中指派標籤。您可以確認此標籤已寫入目標資料庫。若要執行此動作，請將來源資料庫中的可用 `customer` 列數與任務完成後載入 Neptune 目標資料庫中的 `'customer'` 標籤列數進行比較。

  若要使用 SQL 從來源資料庫取得可用的客戶資料列數，請執行下列動作。

  ```
  select count(*) from customer;
  ```

  使用 Gremlin 載入至目標資料庫圖形中的 `'customer'` 標籤列數，請運行以下命令。

  ```
  gremlin> g.V().hasLabel('customer').count()
  ```
+ 目前，如果任何單一資料表載入失敗，整個任務就會失敗。與關聯式資料庫目標不同，Neptune 中的資料是高度連線的，這使得在許多情況下無法繼續任務。如果因為這種類型的資料載入失敗而無法順利繼續任務，請建立新的任務以載入無法載入的資料表。在執行新任務之前，請從 Neptune 目標手動清除部分載入的資料表。
**注意**  
如果失敗可復原 (例如，網路傳輸錯誤)，您可以繼續無法遷移至 Neptune 目標的任務。
+ AWS DMS 支援大多數 R2RML 標準。不過， AWS DMS 不支援某些 R2RML 標準，包括反向表達式、聯結和檢視。R2RML 檢視表的解決方法是在來源資料庫中建立對應的自訂 SQL 檢視表。在遷移任務中，使用資料表映射選擇檢視表做為輸入。然後將檢視表對應到 R2RML 消耗的資料表，以產生圖形資料。
+ 當您使用不支援的 SQL 資料類型遷移來源資料時，產生的目標資料可能會遺失精確度。如需詳細資訊，請參閱[Amazon Neptune 做為目標遷移的 Gremlin 和 R2RML 資料類型](#CHAP_Target.Neptune.DataTypes)。
+ AWS DMS 不支援將 LOB 資料遷移至 Neptune 目標。

# 使用 Redis OSS 做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.Redis"></a>

Redis OSS 是開放原始碼的記憶體內資料結構存放區，用作資料庫、快取和訊息中介裝置。在記憶體內管理資料可讓讀取或寫入操作僅需不到一毫秒的時間，而且每秒能執行數億個操作。作為記憶體內資料存放區，Redis OSS 支援需要低於毫秒回應時間的最嚴苛應用程式。

使用 AWS DMS，您可以將資料從任何支援的來源資料庫遷移到目標 Redis OSS 資料存放區，並將停機時間降至最低。如需 Redis OSS 的詳細資訊，請參閱 [Redis OSS 文件](https://redis.io/documentation)。

除了現場部署 Redis OSS 之外， AWS Database Migration Service 還支援下列項目：
+ [Amazon ElastiCache (Redis OSS)](https://aws.amazon.com/elasticache/redis/) 做為目標資料存放區。ElastiCache (Redis OSS) 可與 Redis OSS 用戶端搭配使用，並使用開啟的 Redis OSS 資料格式來存放您的資料。
+ [Amazon MemoryDB](https://aws.amazon.com/memorydb/) 做為目標資料存放區。MemoryDB 與 Redis OSS 相容，可讓您使用目前使用的所有 Redis OSS 資料結構、APIs和命令來建置應用程式。

如需使用 Redis OSS 做為 目標的其他資訊 AWS DMS，請參閱下列章節：

**Topics**
+ [使用 Redis OSS 叢集做為 目標的先決條件 AWS DMS](#CHAP_Target.Redis.Prerequisites)
+ [使用 Redis 做為 目標的限制 AWS Database Migration Service](#CHAP_Target.Redis.Limitations)
+ [從關聯式或非關聯式資料庫將資料遷移至 Redis OSS 目標](#CHAP_Target.Redis.Migrating)
+ [將 Redis OSS 的端點設定指定為目標](#CHAP_Target.Redis.EndpointSettings)

## 使用 Redis OSS 叢集做為 目標的先決條件 AWS DMS
<a name="CHAP_Target.Redis.Prerequisites"></a>

DMS 支援獨立組態中的內部部署 Redis OSS 目標，或做為 Redis OSS 叢集，其中資料會自動*分片*到多個節點。碎片化是將資料分成較小區塊 (稱為碎片) 的過程，這些區塊會分散在多個服務器或節點上。實際上，碎片是一個資料分割區，其中包含總資料集的子集，並負責整體工作負載的一部分。

由於 Redis OSS 是 NoSQL 資料存放區的鍵值，因此當您的來源是關聯式資料庫時，要使用的 Redis OSS 金鑰命名慣例為 **schema-name.table-name.primary-key**。在 Redis OSS 中，索引鍵和值不得包含特殊字元 %。否則，DMS 會略過該記錄。

**注意**  
如果您使用 ElastiCache (Redis OSS) 做為目標，DMS 僅支援*啟用叢集模式*的組態。如需使用 ElastiCache (Redis OSS) 6.x 版或更新版本來建立啟用叢集模式的目標資料存放區的詳細資訊，請參閱《*Amazon ElastiCache (Redis OSS) 使用者指南*》中的[入門](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/GettingStarted.html)。

開始資料庫遷移之前，請使用下列條件啟動 Redis OSS 叢集。
+ 您的叢集有一個或多個碎片。
+ 如果您使用的是 ElastiCache (Redis OSS) 目標，請確定您的叢集未使用 IAM 角色型存取控制。反之，請使用 Redis OSS 身分驗證來驗證使用者。
+ 啟用異地同步備份 (可用區域)。
+ 請確定叢集有足夠的記憶體容量，可儲存從資料庫遷移過來的資料。
+ 在開始初始遷移任務之前，請確定您的目標 Redis OSS 叢集沒有所有資料。

在建立叢集組態之前，您應該先決定資料遷移的安全性需求。DMS 支援遷移至目標複寫群組，無論其加密組態為何。但是，您只能在建立叢集組態時啟用或停用加密。

## 使用 Redis 做為 目標的限制 AWS Database Migration Service
<a name="CHAP_Target.Redis.Limitations"></a>

使用 Redis OSS 做為目標時，適用下列限制：
+ 由於 Redis OSS 是金鑰值 no-sql 資料存放區，因此當您的來源是關聯式資料庫時，要使用的 Redis OSS 金鑰命名慣例為 `schema-name.table-name.primary-key`。
+ 在 Redis OSS 中，索引鍵值不能包含特殊字元 `%`。否則，DMS 會略過該記錄。
+ DMS 不會遷移包含 `%` 字元的資料列。
+ DMS 不會遷移包含欄位名稱中`%`字元的欄位。
+ 不支援完全的 LOB 模式。
+  使用 ElastiCache (Redis OSS) 做為目標時，不支援私有憑證授權機構 (CA)。
+ AWS DMS 使用 Redis 做為目標端點時， 不支援包含內嵌`'\0'`字元的來源資料。包含內嵌`'\0'`字元的資料會在第一個`'\0'`字元被截斷。

## 從關聯式或非關聯式資料庫將資料遷移至 Redis OSS 目標
<a name="CHAP_Target.Redis.Migrating"></a>

您可以將資料從任何來源 SQL 或 NoSQL 資料存放區直接遷移至 Redis OSS 目標。設定和開始遷移至 Redis OSS 目標類似於使用 DMS 主控台或 API 的任何完全載入和變更資料擷取遷移。若要執行資料庫遷移至 Redis OSS 目標，請執行下列動作。
+ 建立複寫執行個體，以執行遷移的所有程序。如需詳細資訊，請參閱[建立複寫執行個體](CHAP_ReplicationInstance.Creating.md)。
+ 指定來源端點。如需詳細資訊，請參閱[來源與目標端點](CHAP_Endpoints.Creating.md)。
+ 尋找叢集的 DNS 名稱和連接埠號碼。
+ 下載憑證套件，可用其來驗證 SSL 連線。
+ 指定目標端點，如下所述。
+ 建立單一任務或一組任務來定義您希望使用的資料表和複寫程序。如需詳細資訊，請參閱[建立任務](CHAP_Tasks.Creating.md)。
+ 將來源資料庫中的資料遷移至目標叢集。

開始資料庫遷移的方法有兩種：

1. 您可以選擇 AWS DMS 主控台，並在其中執行每個步驟。

1. 您可以使用 AWS Command Line Interface (AWS CLI)。如需搭配 使用 CLI 的詳細資訊 AWS DMS，請參閱 [AWS CLI for AWS DMS](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)。

**若要尋找叢集的 DNS 名稱和連接埠號碼**
+ 使用以下 AWS CLI 命令為 提供複寫群組`replication-group-id`的名稱。

  ```
  aws elasticache describe-replication-groups --replication-group-id myreplgroup
  ```

  此處的輸出會顯示 `Address` 屬性中的 DNS 名稱，以及叢集中主節點 `Port` 屬性中的連接埠號碼。

  ```
   ...
  "ReadEndpoint": {
  "Port": 6379,
  "Address": "myreplgroup-
  111.1abc1d.1111.uuu1.cache.example.com"
  }
  ...
  ```

  如果您使用 MemoryDB 做為目標，請使用下列 AWS CLI 命令將端點地址提供給 Redis OSS 叢集。

  ```
  aws memorydb describe-clusters --clusterid clusterid
  ```

**下載憑證套件以用於驗證 SSL 連線**
+ 在命令列輸入下列 `wget` 命令。Wget 是一個免費的 GNU 命令行公用程式工具，用於從網路下載文件。

  ```
  wget https://s3.aws-api-domain/rds-downloads/rds-combined-ca-bundle.pem
  ```

  在此， 會`aws-api-domain`完成您 AWS 區域中存取指定 S3 儲存貯體所需的 Amazon S3 網域，以及其提供的 rds-combined-ca-bundle.pem 檔案。

**使用 AWS DMS 主控台建立目標端點**

此端點適用於已在執行的 Redis OSS 目標。
+ 在主控台中，在導覽窗格中選擇**端點**，然後選擇**建立端點**。下表說明相關設定。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.Redis.html)

當您完成提供端點的所有資訊時， AWS DMS 會建立您的 Redis OSS 目標端點，以便在資料庫遷移期間使用。

如需建立遷移任務和開始資料庫遷移的相關資訊，請參閱 [建立任務](CHAP_Tasks.Creating.md)。

## 將 Redis OSS 的端點設定指定為目標
<a name="CHAP_Target.Redis.EndpointSettings"></a>

若要建立或修改目標端點，您可以使用主控台或 `CreateEndpoint` 或 `ModifyEndpoint` API 作業。

對於 AWS DMS 主控台中的 Redis OSS 目標，請在**建立端點**或修改**端點**主控台頁面上指定**端點特定設定**。

使用 `CreateEndpoint` 和 `ModifyEndpoint` API 操作時，請指定 `RedisSettings` 選項的要求參數。以下的範例示範如何使用 AWS CLI進行此設定。

```
aws dms create-endpoint --endpoint-identifier my-redis-target
--endpoint-type target --engine-name redis --redis-settings 
'{"ServerName":"sample-test-sample.zz012zz.cluster.eee1.cache.bbbxxx.com","Port":6379,"AuthType":"auth-token", 
 "SslSecurityProtocol":"ssl-encryption", "AuthPassword":"notanactualpassword"}'

{
    "Endpoint": {
        "EndpointIdentifier": "my-redis-target",
        "EndpointType": "TARGET",
        "EngineName": "redis",
        "EngineDisplayName": "Redis",
        "TransferFiles": false,
        "ReceiveTransferredFiles": false,
        "Status": "active",
        "KmsKeyId": "arn:aws:kms:us-east-1:999999999999:key/x-b188188x",
        "EndpointArn": "arn:aws:dms:us-east-1:555555555555:endpoint:ABCDEFGHIJKLMONOPQRSTUVWXYZ",
        "SslMode": "none",
        "RedisSettings": {
            "ServerName": "sample-test-sample.zz012zz.cluster.eee1.cache.bbbxxx.com",
            "Port": 6379,
            "SslSecurityProtocol": "ssl-encryption",
            "AuthType": "auth-token"
        }
    }
}
```

`--redis-settings` 參數如下：
+ `ServerName`–（必要） 在類型 中`string`，指定資料將遷移到的 Redis OSS 叢集，並位於相同的 VPC 中。
+ `Port`–(必要) 類型為 `number`，用於存取端點的連接埠值。
+ `SslSecurityProtocol`–(選用) 有效值包括 `plaintext` 和 `ssl-encryption`。預設值為 `ssl-encryption`。

  `plaintext` 選項不為端點和資料庫之間的流量提供 Transport Layer Security (TLS) 加密。

  使用 `ssl-encryption` 建立加密連線。 `ssl-encryption` 不需要 SSL 憑證授權機構 (CA) ARN 來驗證伺服器的憑證，但可以選擇使用 `SslCaCertificateArn` 設定進行身分識別。如果未提供憑證授權機構 ARN，DMS 會使用 Amazon 根 CA。

  使用內部部署 Redis OSS 目標時，您可以使用 `SslCaCertificateArn` 將公有或私有憑證授權機構 (CA) 匯入 DMS，並提供該 ARN 進行伺服器身分驗證。使用 ElastiCache (Redis OSS) 做為目標時，不支援私有 CA。
+ `AuthType`–（必要） 指出連線至 Redis OSS 時要執行的身分驗證類型。有效值包括 `none`、`auth-token` 與 `auth-role`。

  `auth-token` 選項需要提供「*AuthPassword*」，而 `auth-role` 選項需要提供「*AuthUserName*」和「*AuthPassword*」。

# 使用 Babelfish 做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.Babelfish"></a>

您可以使用 將資料從 Microsoft SQL Server 來源資料庫遷移至 Babelfish 目標 AWS Database Migration Service。

Babelfish for Aurora PostgreSQL 會擴展您的 Amazon Aurora PostgreSQL 相容版本，使其能夠接受來自 Microsoft SQL Server 用戶端的資料庫連線。這樣做可讓原本為 SQL Server 建置的應用程式直接使用 Aurora PostgreSQL，相較於傳統遷移，程式碼只需稍微變更，不需要變更資料庫驅動程式。

如需 AWS DMS 支援做為目標的 Babelfish 版本資訊，請參閱 [的目標 AWS DMS](CHAP_Introduction.Targets.md)。在 Aurora PostgreSQL 上使用舊版的 Babelfish 需要升級，然後才能使用 Babelfish 端點。

**注意**  
Aurora PostgreSQL 目標端點是將資料遷移至 Babelfish 的慣用方式。如需詳細資訊，請參閱[使用 Babelfish for Aurora PostgreSQL 作為目標](CHAP_Target.PostgreSQL.md#CHAP_Target.PostgreSQL.Babelfish)。

如需使用 Babelfish 作為資料庫端點的相關資訊，請參閱《適用於 Aurora 的 Amazon Aurora 使用者指南》**中的 [Babelfish for Aurora PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html) 

## 使用 Babelfish 做為 目標的先決條件 AWS DMS
<a name="CHAP_Target.Babelfish.Prerequisites"></a>

您必須在遷移資料之前建立資料表，以確保 AWS DMS 使用正確的資料類型和資料表中繼資料。如果您在執行遷移之前未在目標上建立資料表， AWS DMS 可能會建立具有不正確資料類型和許可的資料表。例如， 會改為將時間戳記欄 AWS DMS 建立為二進位 (8)，且 不提供預期的時間戳記/rowversion 功能。

**在遷移前準備和建立資料表**

1. 執行包含任何唯一限制、主索引鍵或預設限制的建立資料表 DDL 陳述式。

   請勿包含外部索引鍵限制，或是檢視、預存程序、函數或觸發程序等物件的任何 DDL 陳述式。您可以在遷移來源資料庫之後套用這些項目。

1. 識別任何身分識別資料欄、計算的資料欄或內含資料表之資料列版本或時間戳記資料類型的資料欄。然後，建立必要的轉換規則，以處理執行遷移任務時的已知問題。如需更多詳細資訊，請參閱[轉換規則與動作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.md)。

1. 識別具有 Babelfish 不支援之資料類型的資料欄。然後，變更目標資料表中受影響的資料欄，以使用支援的資料類型，或建立轉換規則以在遷移任務期間移除這些資料欄。如需更多詳細資訊，請參閱[轉換規則與動作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.md)。

   下表列出 Babelfish 不支援的來源資料類型，以及要使用的對應建議目標資料類型。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.Babelfish.html)

**為 Aurora PostgreSQL Serverless V2 來源資料庫設定 Aurora 容量單位 (ACU)**

您可以透過設定最小 ACU 值，在執行 AWS DMS 遷移任務之前改善遷移任務的效能。
+ 在 **Serverless v2 容量設定**視窗中，將**最小 ACU** 設定為 **2**，或為 Aurora 資料庫叢集設定合理層級。

  如需設定 Aurora 容量單位的詳細資訊，請參閱《Amazon Aurora 使用者指南》**中的[選擇 Aurora 叢集的 Aurora Serverless v2 容量範圍](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.setting-capacity.html) 

執行 AWS DMS 遷移任務後，您可以將 ACUs的最小值重設為 Aurora PostgreSQL Serverless V2 來源資料庫的合理層級。

## 使用 Babelfish 做為 目標時的安全需求 AWS Database Migration Service
<a name="CHAP_Target.Babelfish.Security"></a>

以下說明 AWS DMS 搭配 Babelfish 目標使用 的安全需求：
+ 用來建立資料庫的管理員使用者名稱 (管理員使用者)。
+ PSQL 登入和具有充足 SELECT、INSERT、UPDATE、DELETE 和 REFERENCES 許可的使用者。

## 使用 Babelfish 做為 目標的使用者許可 AWS DMS
<a name="CHAP_Target.Babelfish.Permissions"></a>

**重要**  
基於安全考量，用於資料遷移的使用者帳戶必須是您作為目標使用之任何 Babelfish 資料庫的註冊使用者。

Babelfish 目標端點需要最基本使用者許可才能執行 AWS DMS 遷移。

**若要建立登入和低權限 Transact-SQL (T-SQL) 使用者**

1. 建立連線至伺服器時要使用的登入和密碼。

   ```
   CREATE LOGIN dms_user WITH PASSWORD = 'password';
   GO
   ```

1. 為 Babelfish 叢集建立虛擬資料庫。

   ```
   CREATE DATABASE my_database;
   GO
   ```

1. 建立目標資料庫的 T-SQL 使用者。

   ```
   USE my_database
   GO
   CREATE USER dms_user FOR LOGIN dms_user;
   GO
   ```

1. 對於 Babelfish 資料庫中的每個資料表，對這些資料表的 GRANT 許可。

   ```
   GRANT SELECT, DELETE, INSERT, REFERENCES, UPDATE ON [dbo].[Categories] TO dms_user;  
   ```

## 使用 Babelfish 做為 目標的限制 AWS Database Migration Service
<a name="CHAP_Target.Babelfish.Limitations"></a>

使用 Babelfish 資料庫作為 AWS DMS目標時有下列限制：
+ 僅支援資料表準備模式「**不執行任何操作**」。
+ ROWVERSION 資料類型需要資料表對應規則，該規則會在遷移任務期間將資料欄名稱從資料表中移除。
+ 不支援 sql\$1variant 資料類型。
+ 不支援完整 LOB 模式。使用 SQL Server 作為來源端點時，必須設定 SQL Server 端點連線屬性設定 `ForceFullLob=True`，才能將 LOB 遷移至目標端點。
+ 複寫任務設定具有下列限制：

  ```
  {
     "FullLoadSettings": {
        "TargetTablePrepMode": "DO_NOTHING",
        "CreatePkAfterFullLoad": false,
        }.
      
  }
  ```
+ Babelfish 中的 TIME(7)、DATETIME2(7) 和 DATETIMEOFFSET(7) 資料類型會將時間秒部分的精確度值限制為 6 位數。使用這些資料類型時，請考慮為目標資料表使用精確度值 6。對於 Babelfish 2.2.0 版及更高版本，當使用 TIME(7) 和 DATETIME2(7) 時，精確度的第七位數字始終為零。
+ 在 DO\$1NOTHING 模式下，DMS 會檢查資料表是否已存在。如果資料表不存在於目標結構描述中，DMS 會根據來源資料表定義建立資料表，並將任何使用者定義的資料類型對應至其基底資料類型。
+ Babelfish 目標的 AWS DMS 遷移任務不支援具有使用 ROWVERSION 或 TIMESTAMP 資料類型之資料欄的資料表。您可以使用資料表對應規則，在轉移過程中將資料欄名稱從資料表中移除。以下轉換規則範例中，會轉換來源中名為 `Actor` 的資料表，以將所有開頭為 `col` 字元的資料欄從目標中的 `Actor` 資料表中移除。

  ```
  {
   	"rules": [{
  		"rule-type": "selection",is 
  		"rule-id": "1",
  		"rule-name": "1",
  		"object-locator": {
  			"schema-name": "test",
  			"table-name": "%"
  		},
  		"rule-action": "include"
  	}, {
  		"rule-type": "transformation",
  		"rule-id": "2",
  		"rule-name": "2",
  		"rule-action": "remove-column",
  		"rule-target": "column",
  		"object-locator": {
  			"schema-name": "test",
  			"table-name": "Actor",
  			"column-name": "col%"
  		}
  	}]
   }
  ```
+ 對於具有身分識別或計算資料欄的資料表，其中目標資料表使用混合大小寫名稱 (例如類別)，您必須建立轉換規則動作，將 DMS 任務的資料表名稱轉換為小寫。下列範例示範如何建立轉換規則動作，使用 AWS DMS 主控台**進行小寫**。如需詳細資訊，請參閱[轉換規則與動作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.md)。  
![\[Babelfish 轉換規則\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/images/datarep-babelfish-transform-1.png)
+ 在 Babelfish 版本 2.2.0 之前，DMS 會將您可複製到 Babelfish 目標端點的資料欄數量限制為二十 (20) 個資料欄。使用 Babelfish 2.2.0 時，上限提高到 100 個資料欄。但是在 Babelfish 2.4.0 版及更高版本中，您可以複寫的資料欄數再次提高。您可以針對 SQL Server 資料庫執行下列程式碼範例，以判斷哪些資料表太長。

  ```
  USE myDB;
  GO
  DECLARE @Babelfish_version_string_limit INT = 8000; -- Use 380 for Babelfish versions before 2.2.0
  WITH bfendpoint
  AS (
  SELECT 
  	[TABLE_SCHEMA]
        ,[TABLE_NAME]
  	  , COUNT( [COLUMN_NAME] ) AS NumberColumns
  	  , ( SUM( LEN( [COLUMN_NAME] ) + 3)  
  		+ SUM( LEN( FORMAT(ORDINAL_POSITION, 'N0') ) + 3 )  
  	    + LEN( TABLE_SCHEMA ) + 3
  		+ 12 -- INSERT INTO string
  		+ 12)  AS InsertIntoCommandLength -- values string
        , CASE WHEN ( SUM( LEN( [COLUMN_NAME] ) + 3)  
  		+ SUM( LEN( FORMAT(ORDINAL_POSITION, 'N0') ) + 3 )  
  	    + LEN( TABLE_SCHEMA ) + 3
  		+ 12 -- INSERT INTO string
  		+ 12)  -- values string
  			>= @Babelfish_version_string_limit
  			THEN 1
  			ELSE 0
  		END AS IsTooLong
  FROM [INFORMATION_SCHEMA].[COLUMNS]
  GROUP BY [TABLE_SCHEMA], [TABLE_NAME]
  )
  SELECT * 
  FROM bfendpoint
  WHERE IsTooLong = 1
  ORDER BY TABLE_SCHEMA, InsertIntoCommandLength DESC, TABLE_NAME
  ;
  ```

## Babelfish 的目標資料類型
<a name="CHAP_Target.Babelfish.DataTypes"></a>

下表顯示使用 時支援的 Babelfish 目標資料類型， AWS DMS 以及來自 AWS DMS 資料類型的預設映射。

如需 AWS DMS 資料類型的詳細資訊，請參閱 [AWS Database Migration Service 的資料類型](CHAP_Reference.DataTypes.md)。


|  AWS DMS 資料類型  |  Babelfish 資料類型   | 
| --- | --- | 
|  BOOLEAN  |  TINYINT  | 
|  BYTES  |  VARBINARY (長度)  | 
|  DATE  |  DATE  | 
|  TIME  |  TIME  | 
|  INT1  |  SMALLINT  | 
|  INT2  |  SMALLINT  | 
|  INT4  |  INT  | 
|  INT8  |  BIGINT  | 
|  NUMERIC   |  NUMERIC(p,s)  | 
|  REAL4  |  REAL  | 
|  REAL8  |  FLOAT  | 
|  STRING  |  如果資料行是日期或時間資料行，請執行下列動作： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.Babelfish.html) 如果資料行不是日期或時間資料行，請使用 VARCHAR (長度)。  | 
|  UINT1  |  TINYINT  | 
|  UINT2  |  SMALLINT  | 
|  UINT4  |  INT  | 
|  UINT8  |  BIGINT  | 
|  WSTRING  |  NVARCHAR(length)  | 
|  BLOB  |  VARBINARY(max) 若要在 DMS 使用此資料類型，您必須針對特定任務使用 BLOB。DMS 只在有主索引鍵的資料表中支援 BLOB 資料類型。  | 
|  CLOB  |  VARCHAR(max) 若要在 DMS 使用此資料類型，您必須針對特定任務使用 CLOB。  | 
|  NCLOB  |  NVARCHAR(max) 若要在 DMS 使用此資料類型，您必須針對特定任務使用 NCLOB。在 CDC 期間，DMS 只在包含主索引鍵的資料表中支援 NCLOB 資料類型。  | 

# 使用 Amazon Timestream 做為 的目標 AWS Database Migration Service
<a name="CHAP_Target.Timestream"></a>

您可以使用 AWS Database Migration Service 將資料從來源資料庫遷移至 Amazon Timestream 目標端點，並支援完全載入和 CDC 資料遷移。

Amazon Timestream 是一項專為大量資料擷取而建置之快速、可擴展且無伺服器的時間序列資料庫服務。時間序列資料是在一段時間間隔內收集的資料點序列，用於測量隨時間變更的事件。它可用來收集、儲存和分析來自 IoT 應用程式、DevOps 應用程式和分析應用程式的指標。在 Timestream 中取得資料後，您可以近乎即時地視覺化並識別資料中的趨勢和模式。如需 Amazon Timestream 的相關資訊，請參閱《Amazon Timestream 開發人員指南》**中的[什麼是 Amazon Timestream？](https://docs.aws.amazon.com/timestream/latest/developerguide/what-is-timestream.html)。

**Topics**
+ [使用 Amazon Timestream 做為 目標的先決條件 AWS Database Migration Service](#CHAP_Target.Timestream.Prerequisites)
+ [多執行緒完全載入任務設定](#CHAP_Target.Timestream.FLTaskSettings)
+ [多執行緒 CDC 載入任務設定](#CHAP_Target.Timestream.CDCTaskSettings)
+ [使用 Timestream 做為 目標時的端點設定 AWS DMS](#CHAP_Target.Timestream.ConnectionAttrib)
+ [建立和修改 Amazon Timestream 目標端點](#CHAP_Target.Timestream.CreateModifyEndpoint)
+ [使用物件映射將資料遷移到 Timestream 主題](#CHAP_Target.Timestream.ObjectMapping)
+ [使用 Amazon Timestream 做為 目標的限制 AWS Database Migration Service](#CHAP_Target.Timestream.Limitations)

## 使用 Amazon Timestream 做為 目標的先決條件 AWS Database Migration Service
<a name="CHAP_Target.Timestream.Prerequisites"></a>

將 Amazon Timestream 設定為 的目標之前 AWS DMS，請務必建立 IAM 角色。此角色必須允許 AWS DMS 存取要遷移至 Amazon Timestream 的資料。下列 IAM 政策顯示您用來遷移至 Timestream 之角色的最低存取權限集。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowDescribeEndpoints",
      "Effect": "Allow",
      "Action": [
        "timestream:DescribeEndpoints"
      ],
      "Resource": "*"
    },
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "timestream:ListTables",
        "timestream:DescribeDatabase"
      ],
      "Resource": "arn:aws:timestream:us-east-1:123456789012:database/DATABASE_NAME"
    },
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": [
        "timestream:DeleteTable",
        "timestream:WriteRecords",
        "timestream:UpdateTable",
        "timestream:CreateTable"
      ],
      "Resource": "arn:aws:timestream:us-east-1:123456789012:database/DATABASE_NAME/table/TABLE_NAME"
    }
  ]
}
```

------

如果您要遷移所有資料表，請在上述範例中使用 `*` 做為 *TABLE\$1NAME*。

請注意以下有關使用 Timestream 做為目標的事項：
+ 如果您想要擷取時間戳記超過 1 年的歷史資料，建議使用 AWS DMS 並以逗號分隔值 (csv) 格式將資料寫入 Amazon S3。然後，使用 Timestream 的批次載入將資料擷取至 Timestream。如需詳細資訊，請參閱《Amazon Timestream 開發人員指南》[https://docs.aws.amazon.com/timestream/latest/developerguide/what-is-timestream.html](https://docs.aws.amazon.com/timestream/latest/developerguide/what-is-timestream.html)中的[在 Timestream 中使用批次載入](https://docs.aws.amazon.com/timestream/latest/developerguide/batch-load.html)。
+ 對於 1 年以內資料的完全載入資料遷移，我們建議將 Timestream 資料表的記憶體存放區保留期設定為大於或等於最舊的時間戳記。然後，當完成遷移後，將資料表的記憶體存放區保留編輯為所需的值。例如，若要遷移最舊時間戳記為 2 個月的資料，請執行下列動作：
  + 將 Timestream 目標資料表的記憶體存放區保留時間設定為 2 個月。
  + 使用 開始資料遷移 AWS DMS。
  + 完成資料遷移後，請將目標 Timestream 資料表的保留期變更為所需的值。

   建議您使用下列頁面上的資訊，在遷移之前先預估記憶體存放區成本：
  + [Amazon Timestream 定價](https://aws.amazon.com/timestream/pricing)
  + [AWS 定價計算器](https://calculator.aws/#/addService) 
+ 對於 CDC 資料遷移，建議您設定目標資料表的記憶體存放區保留期，使擷取的資料處於記憶體存放區保留限制內。如需詳細資訊，請參閱《Amazon Timestream 開發人員指南》[https://docs.aws.amazon.com/timestream/latest/developerguide/what-is-timestream.html](https://docs.aws.amazon.com/timestream/latest/developerguide/what-is-timestream.html)中的[寫入最佳實務](https://docs.aws.amazon.com/timestream/latest/developerguide/data-ingest.html)。

## 多執行緒完全載入任務設定
<a name="CHAP_Target.Timestream.FLTaskSettings"></a>

為了協助提高資料傳輸速度， AWS DMS 使用以下任務設定，支援多執行緒完全載入遷移任務到 Timestream 目標端點：
+ `MaxFullLoadSubTasks`：使用此選項，指出要平行載入的來源資料表數目上限。DMS 會使用專用子任務，將每個資料表載入到其對應的 Amazon Timestream 目標資料表。預設值為 8；最大值為 49。
+ `ParallelLoadThreads` – 使用此選項指定 AWS DMS 用來將每個資料表載入其 Amazon Timestream 目標資料表的執行緒數目。Timestream 目標的最大值為 32。您可以要求提高此上限。
+ `ParallelLoadBufferSize`：使用此選項，指定要在平行載入執行緒用來將資料載入至 Amazon Timestream 目標的緩衝區中存放的記錄數量上限。預設值為 50。最大值為 1000。使用此設定搭配 `ParallelLoadThreads`；`ParallelLoadBufferSize`，只有在有多個執行緒時才有效。
+ `ParallelLoadQueuesPerThread`：使用此選項指定每個並行執行緒存取的佇列數目，以便將資料記錄從佇列中取出，並為目標產生批次載入。預設為 1。但是，對於各種承載大小的 Amazon Timestream 目標，有效範圍為每個執行緒 5–512 個佇列。

## 多執行緒 CDC 載入任務設定
<a name="CHAP_Target.Timestream.CDCTaskSettings"></a>

為了提升 CDC 效能， AWS DMS 支援下列任務設定：
+ `ParallelApplyThreads` – 指定在 CDC 載入期間 AWS DMS 用來將資料記錄推送至 Timestream 目標端點的並行執行緒數目。預設值為 0，最大值為 32。
+ `ParallelApplyBufferSize`：指定每個緩衝區佇列中存放的最大記錄數目，以便並行執行緒在 CDC 載入期間推送至 Timestream 目標端點。預設值為 100，最大值為 1,000。`ParallelApplyThreads` 指定多個執行緒時，請使用此選項。
+ `ParallelApplyQueuesPerThread`：指定每個執行緒存取的佇列數目，以便從佇列中取出資料記錄，並在 CDC 期間產生 Timestream 端點的批次載入。預設值為 １，最大值為 512。

## 使用 Timestream 做為 目標時的端點設定 AWS DMS
<a name="CHAP_Target.Timestream.ConnectionAttrib"></a>

您可以使用端點設定來設定您的 Timestream 目標資料庫，類似於使用額外的連線屬性。當您使用 AWS DMS 主控台或使用 中的 `create-endpoint`命令搭配 `--timestream-settings '{"EndpointSetting": "value", ...}'` JSON 語法來建立目標端點時[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)，您可以指定設定。

下列資料表顯示您可搭配 Timestream 做為目標使用的端點設定。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Target.Timestream.html)

## 建立和修改 Amazon Timestream 目標端點
<a name="CHAP_Target.Timestream.CreateModifyEndpoint"></a>

建立 IAM 角色並建立最低限度的存取許可後，您可以使用 AWS DMS 主控台建立 Amazon Timestream 目標端點，或使用 中的 `create-endpoint`命令[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)搭配 `--timestream-settings '{"EndpointSetting": "value", ...}'` JSON 語法。

以下範例示範如何使用 AWS CLI建立和修改 Timestream 目標端點。

**建立 Timestream 目標端點命令**

```
aws dms create-endpoint —endpoint-identifier timestream-target-demo
--endpoint-type target —engine-name timestream
--service-access-role-arn arn:aws:iam::123456789012:role/my-role
--timestream-settings
{
    "MemoryDuration": 20,
    "DatabaseName":"db_name",
    "MagneticDuration": 3,
    "CdcInsertsAndUpdates": true,
    "EnableMagneticStoreWrites": true,
}
```

**修改 Timestream 目標端點命令**

```
aws dms modify-endpoint —endpoint-identifier timestream-target-demo
--endpoint-type target —engine-name timestream
--service-access-role-arn arn:aws:iam::123456789012:role/my-role
--timestream-settings
{
    "MemoryDuration": 20,
    "MagneticDuration": 3,
}
```

## 使用物件映射將資料遷移到 Timestream 主題
<a name="CHAP_Target.Timestream.ObjectMapping"></a>

AWS DMS 使用資料表映射規則，將資料從來源映射到目標 Timestream 主題。若要將資料映射到目標主題，請使用一種稱為物件映射的資料表映射規則。您可以使用物件映射定義如何將來源中的資料記錄映射到發佈到 Timestream 主題的資料記錄。

除了擁有分割區索引鍵外，Timestream 主題沒有預設結構。

**注意**  
您不一定要使用物件映射。您可以針對各種轉換使用一般資料表映射。不過，分割區索引鍵類型會遵循下列預設行為：  
主索引鍵會作為「完全載入」的分割區索引鍵。
如果未使用平行套用任務設定，則 `schema.table` 會做為 CDC 的分割區索引鍵。
如果使用平行套用任務設定，則主索引鍵會做為 CDC 的分割區索引鍵。

若要建立物件映射規則，請將 `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": ""
            }
        }
    ]
}
```



```
{
    "rules": [
        {
            "rule-type": "object-mapping",
            "rule-id": "1",
            "rule-name": "timestream-map",
            "rule-action": "map-record-to-record",
            "target-table-name": "tablename",
            "object-locator": {
                "schema-name": "",
                "table-name": ""
            },
            "mapping-parameters": {
                "timestream-dimensions": [
                    "column_name1",
                     "column_name2"
                ],
                "timestream-timestamp-name": "time_column_name",
                "timestream-multi-measure-name": "column_name1or2",
                "timestream-hash-measure-name":  true or false,
                "timestream-memory-duration": x,
                "timestream-magnetic-duration": y
            }
        }
    ]
}
```

AWS DMS 目前支援 `map-record-to-record`和 `map-record-to-document`做為 `rule-action` 參數的唯一有效值。`map-record-to-record` 和 `map-record-to-document`值會指定預設對`exclude-columns`屬性清單中未排除的記錄 AWS DMS 執行的動作。這些值反正不會影響屬性映射。

從關聯式資料庫遷移到 Timestream 主題時，請使用 `map-record-to-record`。此規則類型使用關聯式資料庫的 `taskResourceId.schemaName.tableName` 值做為 Timestream 主題的分割區索引鍵，並會為來源資料庫中的每一欄建立一個屬性。使用 時`map-record-to-record`，對於來源資料表中未列於`exclude-columns`屬性清單中的任何資料欄， 會在目標主題中 AWS DMS 建立對應的屬性。無論屬性映射中是否使用該來源資料行，都會建立此對應的屬性。

了解 `map-record-to-record` 的一種方法是查看它運作時的狀態。在本範例中，假設您開始使用之關聯式資料庫資料表資料列的結構和資料如下。


| FirstName | LastName | StoreId | HomeAddress | HomePhone | WorkAddress | WorkPhone | DateofBirth | 
| --- | --- | --- | --- | --- | --- | --- | --- | 
| Randy | Marsh | 5 | 221B Baker Street | 1234567890 | 31 Spooner Street, Quahog  | 9876543210 | 1988/02/29 | 

若要將此資訊從名為 `Test` 的結構描述遷移至 Timestream 主題，您可以建立規則以將資料映射至目標主題。以下規則說明映射。

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "rule-action": "include",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            }
        },
        {
            "rule-type": "object-mapping",
            "rule-id": "2",
            "rule-name": "DefaultMapToTimestream",
            "rule-action": "map-record-to-record",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "Customers"
            }
        }
    ]
}
```

指定 Timestream 主題和分割區索引鍵 (在本例中為 `taskResourceId.schemaName.tableName`)，下列說明使用我們在 Timestream 目標主題中的範例資料所產生的記錄格式：

```
  {
     "FirstName": "Randy",
     "LastName": "Marsh",
     "StoreId":  "5",
     "HomeAddress": "221B Baker Street",
     "HomePhone": "1234567890",
     "WorkAddress": "31 Spooner Street, Quahog",
     "WorkPhone": "9876543210",
     "DateOfBirth": "02/29/1988"
  }
```

## 使用 Amazon Timestream 做為 目標的限制 AWS Database Migration Service
<a name="CHAP_Target.Timestream.Limitations"></a>

使用 Amazon Timestream 做為目標時，有下列限制：
+ **維度和時間戳記：**Timestream 會如同使用複合主鍵一樣使用來源資料中的維度和時間戳記，而且也不允許您更新插入這些值。這表示，如果您變更來源資料庫中記錄的時間戳記或維度，Timestream 資料庫會嘗試建立新記錄。因此，如果您變更記錄的維度或時間戳記，使其與其他現有記錄的維度或時間戳記相符，則 會 AWS DMS 更新其他記錄的值，而不是建立新的記錄或更新先前的對應記錄。
+ **DDL 命令：** 的目前版本 AWS DMS 僅支援 `CREATE TABLE`和 `DROP TABLE` DDL 命令。
+ **記錄限制：**Timestream 對記錄大小和度量大小等記錄有限制。如需詳細資訊，請參閱《[Amazon Timestream 開發人員指南](https://docs.aws.amazon.com/)》中的[配額](https://docs.aws.amazon.com/timestream/latest/developerguide/what-is-timestream.html)。
+ **刪除記錄和空值：**Timestream 不支援刪除記錄。為了支援遷移從來源刪除的記錄， 會 AWS DMS 清除 Timestream 目標資料庫中記錄中的對應欄位。將對應目標記錄欄位中的值 AWS DMS 變更為數字欄位為 **0**、文字欄位為 **null**，以及布林值欄位為 **false**。
+ 做為目標的 Timestream 不支援非關聯式資料庫 (RDBMS) 的來源。
+ AWS DMS 僅支援 Timestream 做為下列區域中的目標：
  + 美國東部 (維吉尼亞北部)
  + 美國東部 (俄亥俄)
  + 美國西部 (奧勒岡)
  + 歐洲 (愛爾蘭)
  + 歐洲 (法蘭克福)
  + 亞太地區 (雪梨)
  + 亞太地區 (東京)
+ 做為目標的 Timestream 不支援將 `TargetTablePrepMode` 設定為 `TRUNCATE_BEFORE_LOAD`。我們建議針對此設定使用 `DROP_AND_CREATE`。

# 使用 Amazon RDS for Db2 和 IBM Db2 LUW 作為 的目標 AWS DMS
<a name="CHAP_Target.DB2"></a>

您可以使用 AWS Database Migration Service () 將資料從 Db2 LUW 資料庫遷移至 Amazon RDS for Db2 或內部部署 Db2 資料庫AWS DMS。

如需 AWS DMS 支援做為目標之 Db2 LUW 版本的資訊，請參閱 [的目標 AWS DMS](CHAP_Introduction.Targets.md)。

您可以使用 Secure Sockets Layer (SSL) 加密您 Db2 LUW 端點與複寫執行個體之間的連線。如需有關 搭配 Db2 LUW 端點使用 SSL 的詳細資訊，請參閱 [搭配 使用 SSL AWS Database Migration Service](CHAP_Security.SSL.md)。

## 使用 Db2 LUW 做為 目標的限制 AWS DMS
<a name="CHAP_Target.DB2.Limitations"></a>

使用 Db2 LUW 資料庫做為目標時，適用下列限制 AWS DMS。使用 Db2 LUW 做為來源時，請參閱 [使用 Db2 LUW 做為 來源的限制 AWS DMS](CHAP_Source.DB2.md#CHAP_Source.DB2.Limitations)。
+ AWS DMS 當來源為 z/OS 的 Db2 LUW 或 Db2 時， 僅支援 Db2 LUW 做為目標。
+ 若使用 Db2 LUW 做為目標，並不支援具有完整 LOB 模式的複寫。
+ 若使用 Db2 LUW 做為目標，並不會在完全載入階段支援 XML 資料類型。這是 IBM dbload 公用程式的限制。如需詳細資訊，請參閱 *IBM Informix 伺服器*文件中的 [dbload 公用程式](https://www.ibm.com/docs/en/informix-servers/14.10?topic=utilities-dbload-utility)。
+ AWS DMS 使用對應於雙引號字元 (") 的值截斷 BLOB 欄位。這是 IBM dbload 公用程式的限制。
+ AWS DMS 在 DMS 3.5.3 版中遷移至 Db2 LUW 目標時， 不支援平行完全載入選項。此選項可從 DMS 3.5.4 版或更新版本取得。

## 使用 Db2 LUW 做為 目標時的端點設定 AWS DMS
<a name="CHAP_Target.DB2.ConnectionAttrib"></a>

您可以使用端點設定來設定您的 Db2 LUW 目標資料庫，類似於使用額外的連線屬性。當您使用 AWS DMS 主控台或使用 中的 `create-endpoint`命令搭配 `--ibm-db2-settings '{"EndpointSetting": "value", ...}'` JSON 語法來建立目標端點時[AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)，您可以指定設定。

下列資料表顯示可以搭配使用做為目標之 Db2 LUW 的端點設定。


| 名稱 | 描述 | 
| --- | --- | 
|  `KeepCsvFiles`  |  如果為 true， AWS DMS 會將任何 .csv 檔案儲存至用於複寫資料的 Db2 LUW 目標。DMS 使用這些檔案進行分析和疑難排解。  | 
|  `LoadTimeout`  |  DMS 在 Db2 目標上執行的 AWS DMS 逾時操作之前的時間量 （以毫秒為單位）。預設值為 1200 (20 分鐘)。  | 
|  `MaxFileSize`  |  針對用來將資料傳輸到 Db2 LUW 的任何 .csv 檔案，指定其大小上限 (KB)。  | 
|  `WriteBufferSize`  |  在 DMS 複寫執行個體的本機磁碟上產生 .csv 檔案時，所使用的記憶體內檔案寫入緩衝區的大小 (KB)。預設值為 1024 (1 MB)。  | 