

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

# 使用 建立持續複寫的任務 AWS DMS
<a name="CHAP_Task.CDC"></a>

您可以建立 AWS DMS 任務，從來源資料存放區擷取正在進行的變更。您可以在遷移資料的同時執行此擷取。您也可以建立任務，在完成初始 (完全載入) 遷移到支援的目標資料存放區之後，擷取持續進行的變更。此程序稱為持續複寫或變更資料擷取 (CDC)。從來源資料存放區複寫持續變更時， AWS DMS 會使用此程序。此程序的運作方式為使用資料庫引擎的原生 API，將變更收集到資料庫日誌。

**注意**  
您只能使用完全載入任務來遷移檢視。如果您的任務是僅限 CDC 的任務，或是在完成之後啟動 CDC 的完全載入任務，則遷移只會包含來自來源的資料表。使用僅限完全載入的任務，您可以遷移檢視或資料表和檢視的組合。如需詳細資訊，請參閱[使用 JSON 指定資料表選擇及轉換](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.md)。

每個來源引擎都有特定的組態需求，用於將此變更串流公開給指定的使用者帳戶。大多數的引擎都需要一些額外設定，才能讓擷取程序以有意義的方式使用變更資料，同時不遺失資料。例如，Oracle 需要額外的增補日誌記錄，MySQL 則需要資料列層級的二進位日誌記錄 (二進位日誌記錄)。

 若要從來源資料庫讀取持續變更， AWS DMS 會使用引擎特定的 API 動作，從來源引擎的交易日誌讀取變更。以下是如何 AWS DMS 執行此操作的一些範例：
+ 對於 Oracle， AWS DMS 會使用 Oracle LogMiner API 或二進位讀取器 API (bfile API) 來讀取持續變更。 會根據系統變更編號 (SCN) 從線上或封存重做日誌 AWS DMS 讀取持續變更。
+ 對於 Microsoft SQL Server， AWS DMS 會使用 MS-Replication 或 MS-CDC 將資訊寫入 SQL Server 交易日誌。它接著會根據記錄序號 (LSN) 使用 SQL Server 中的 `fn_dblog()` 或 ` fn_dump_dblog()` 函數讀取交易日誌中的變更。
+ 對於 MySQL， 會從資料列型二進位日誌 (binlog) AWS DMS 讀取變更，並將這些變更遷移至目標。
+ 對於 PostgreSQL， AWS DMS 會設定邏輯複寫插槽，並使用 test\$1decoding 外掛程式從來源讀取變更，並將其遷移至目標。
+ 針對以 Amazon RDS 做為來源的情況，我們建議您確認已啟用備份來設定 CDC。我們也建議您確定來源資料庫設定的變更記錄保留時間充足，通常 24 小時就足夠了。如需每個端點的詳細設定，請參閱以下內容：
  + **Amazon RDS for Oracle：**[設定 AWS的 受管 Oracle 來源 AWS DMS](CHAP_Source.Oracle.md#CHAP_Source.Oracle.Amazon-Managed.Configuration)。
  + **Amazon RDS for MySQL 和 MariaDB Aurora MySQL：**[使用 AWS管理的 MySQL 相容資料庫做為 的來源 AWS DMS](CHAP_Source.MySQL.md#CHAP_Source.MySQL.AmazonManaged)。
  + **Amazon RDS for SQL Server：**[設定雲端 SQL Server 資料庫執行個體的進行中複寫](CHAP_Source.SQLServer.CDC.md#CHAP_Source.SQLServer.Configuration)。
  + **Amazon RDS for PostgreSQL SQL 和 Aurora：**PostgreSQL 會自動保留所需的 WAL。

進行中複寫任務有兩種類型：
+ 完全載入加上 CDC – 任務會遷移現有資料，然後根據來源資料庫的變更更新目標資料庫。
+ 僅 CDC – 任務會在您於目標資料庫上擁有資料後遷移持續進行的變更。

## 從 CDC 起點開始執行複寫
<a name="CHAP_Task.CDC.StartPoint"></a>

您可以從數個點開始 AWS DMS 持續的複寫任務 （僅限變更資料擷取）。這些索引標籤包括以下項目：
+  **從自訂 CDC 開始時間** – 您可以使用 AWS 管理主控台 或 AWS CLI AWS DMS 提供您希望複寫啟動的時間戳記。 AWS DMS 然後， 會從此自訂 CDC 開始時間開始持續複寫任務。 會將指定的時間戳記 (UTC) AWS DMS 轉換為原生起點，例如 SQL Server 的 LSN 或 Oracle 的 SCN。 AWS DMS 會使用引擎特定方法，根據來源引擎的變更串流來決定從何處啟動遷移任務。
**注意**  
只有在將`StartFromContext`額外的連線屬性設定為所需的時間戳記時，Db2 才會做為來源提供自訂的 CDC 開始時間。  
以 PostgreSQL 做為來源則不支援自訂 CDC 啟動時間。這是因為 PostgreSQL 資料庫引擎與 Oracle 和 SQL Server 不同，沒有將時間戳記映射到 LSN 或 SCN 的方法。
+ **從 CDC 原生起點** – 您也可以從來源引擎交易日誌中的原生點開始。在某些情況下，您可能偏好這種方法，因為時間戳記可以在交易日誌中指出多個原生點。 AWS DMS 支援下列來源端點的此功能：
  + SQL Server
  + PostgreSQL
  + Oracle
  + MySQL
  + MariaDB
**注意**  
下列資料庫端點不支援 CDC 原生起點功能：  
 Amazon Aurora MySQL 
 Amazon Aurora PostgreSQL 
Amazon DocumentDB (with MongoDB compatibility)
Amazon S3
z/OS 的 IBM Db2 
IBM Db2 LUW
Microsoft Azure SQL Database
Microsoft Azure SQL 受管執行個體
MongoDB
SAP Sybase ASE

建立任務時， 會 AWS DMS 標記 CDC 起點，而且無法變更。若要使用不同的 CDC 起點，請建立新任務。

**注意**  
 指定 CDC （變更資料擷取） 起點時，預遷移評估仍會執行目前環境中現有中繼資料和參數的完整分析。這可確保評估所有目前的組態和設定，無論指定的 CDC 起點為何。  
 重要：如果指定任務在過去 7 天內未執行任何評估，預遷移評估將在繼續和重新載入模式下自動執行，以確保資料完整性和一致性。  
 中繼資料分析保持不變。
 參數評估涵蓋目前的狀態。
 CDC 起點不會限制評估範圍。
 系統會維護完整的系統組態檢閱。
 在以下情況下，在繼續和重新載入模式中自動執行：  
 上次評估 > 7 天前。  
 找不到先前的評估記錄。
 這有助於確保準確的遷移規劃，同時保持指定 CDC 點與目前系統狀態之間的資料一致性。

### 決定 CDC 原生起點
<a name="CHAP_Task.CDC.StartPoint.Native"></a>

*CDC 原生起點*是資料庫引擎的日誌中的一點，定義您可開始 CDC 的時間。例如，假設大量資料傾印已套用到目標。您可以尋找僅進行中複寫任務的原生起點。為避免產生資料不一致，請謹慎選擇僅複製任務的起點。DMS 會擷取在所選 CDC 起點之後啟動的交易。

以下範例說明您如何從支援的來源引擎尋找 CDC 原生起點：

**SQL Server**  
在 SQL Server 中，記錄序號 (LSN) 分成三個部分：  
+ 虛擬日誌檔 (VLF) 序號
+ 日誌區塊的啟動位移
+ 位置編號
 範例 LSN 如下：`00000014:00000061:0001`  
若要根據您的交易日誌備份設定取得 SQL Server 遷移任務的起點，請使用 SQL Server 中的 `fn_dblog()` 或 `fn_dump_dblog()` 函數。  
若要搭配 SQL Server 使用 CDC 原生起點，請在參與進行中複寫的任何資料表上建立發佈。當您使用 CDC 而不使用 CDC 原生起始點時， AWS DMS 會自動建立發佈。

**PostgreSQL**  
您可以為您的 PostgreSQL 來源資料庫使用 CDC 復原檢查點。當來源資料庫 (父項任務) 執行進行中複寫任務時，此檢查點值會在不同的時間點產生。如需整體檢查點的詳細資訊，請參閱：[使用檢查點做為 CDC 起點](#CHAP_Task.CDC.StartPoint.Checkpoint)。  
若要識別要用作原生起點的檢查點，請使用資料庫`pg_replication_slots`檢視或來自 的父項任務概觀詳細資訊 AWS 管理主控台  

**在主控台上尋找父項任務的概觀詳細資訊**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/dms/v2/](https://console.aws.amazon.com/dms/v2/) 開啟 AWS DMS 主控台。

   如果您以 IAM 使用者身分登入，請確認您具備適當的許可來存取 AWS DMS。如需所需許可的詳細資訊，請參閱 [使用 所需的 IAM 許可 AWS DMS](security-iam.md#CHAP_Security.IAMPermissions)。

1. 從導覽窗格中，選擇 **Database migration tasks (資料庫遷移任務)**。

1. 從 **Database migration tasks (資料庫遷移任務)** 頁面的清單中選擇您的父任務。這會開啟顯示概觀詳細資訊的父項任務頁面。

1. 在 **Change data capture (CDC) (變更資料擷取 (CDC))**、**Change data capture (CDC) start position (變更資料擷取 (CDC) 起始位置)** 以及 **Change data capture (CDC) recovery checkpoint (變更資料擷取 (CDC) 復原檢查點)** 下尋找檢查點值。

   該數值會顯示如下：

   ```
   checkpoint:V1#1#000004AF/B00000D0#0#0#*#0#0
   ```

   在這裡，`4AF/B00000D0` 元件是您需要指定此原生 CDC 起點的元件。當您建立 CDC 任務為您的 PostgreSQL 來源在此起點開始複寫時，請將 DMS API 的 `CdcStartPosition` 參數設定為此數值。如需使用 AWS CLI 建立此 CDC 任務的資訊，請參閱 [使用 啟用具有 AWS受管 PostgreSQL 資料庫執行個體的 CDC AWS DMS](CHAP_Source.PostgreSQL.md#CHAP_Source.PostgreSQL.RDSPostgreSQL.CDC)。

**Oracle**  
系統變更編號 (SCN) 是一種 Oracle 資料庫所使用的邏輯、內部時間戳記。SCN 會將資料庫中發生的事件排序，以滿足交易的 ACID 屬性。Oracle 資料庫使用 SCN 來標記所有變更寫入磁碟的位置，以使復原動作不會套用已寫入的變更。Oracle 也會針對一組資料使用 SCN 標記不存在重做的點，以使復原能夠停止。  
若要取得 Oracle 資料庫中目前的 SCN，請執行以下命令。  

```
SELECT CURRENT_SCN FROM V$DATABASE
```
如果您使用 SCN 或時間戳記來啟動 CDC 工作，將會遺漏任何開啟中交易的結果，而且無法遷移這些結果。*開啟中交易*是指起始於任務開始位置之前，並在任務開始位置之後遞交的交易。您可以識別 SCN 和時間戳記，以便在包含所有開啟中交易的時間點啟動 CDC 工作。如需更多資訊，請參閱 Oracle 線上文件中的 [Transactions (交易)](https://docs.oracle.com/database/121/CNCPT/transact.htm#CNCPT016)。在 3.5.1 版及更高版本中，如果您使用 SCN 或時間戳記來啟動任務， AWS DMS 會使用`openTransactionWindow`端點設定支援僅限 CDC 任務的開放交易。  
 使用 `openTransactionWindow`設定時，您必須提供以分鐘為單位的視窗來處理開啟的交易。 會 AWS DMS 轉移擷取位置並尋找新位置以啟動資料擷取。 AWS DMS 會使用新的開始位置，從必要的 Oracle 重做或封存重做日誌掃描任何開啟的交易。

**MySQL**  
在 MySQL 5.6.3 版發行之前，MySQL 的記錄序號 (LSN) 是 4 位元組不含正負號的整數。在 MySQL 5.6.3 版中，當重做日誌大小限制從 4 GB 增加至 512 GB 時，LSN 便會變成 8 位元組不含正負號的整數。該增加反映了儲存額外大小資訊所需要的額外位元組。在使用 LSN 值的 MySQL 5.6.3 及更新版本上建置的應用程式應使用 64 位元，而非 32 位元的變數來儲存及比較 LSN 值。如需 MySQL LSN 的詳細資訊，請參閱 [MySQL documentation](https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_lsn)。  
 若要取得 MySQL 資料庫中目前的 LSN，請執行以下命令。  

```
mysql> show master status;
```
 查詢會傳回一個 binlog 檔案名稱、位置，以及其他數個值。CDC 原生起點是 binlog 檔案名稱和位置的組合，例如 `mysql-bin-changelog.000024:373`。在此範例中， `mysql-bin-changelog.000024` 是 binlogs 檔案名稱， `373`是 AWS DMS 需要開始擷取變更的位置。

### 使用檢查點做為 CDC 起點
<a name="CHAP_Task.CDC.StartPoint.Checkpoint"></a>

 持續複寫任務會遷移變更，並 AWS DMS 不時 AWS DMS 快取 的特定檢查點資訊。 AWS DMS 建立的檢查點包含資訊，可讓複寫引擎了解變更串流的復原點。您可以使用檢查點來在變更的時間軸上返回，並復原失敗的遷移任務。您也可以使用檢查點針對其他目標，於任何指定的時間點啟動另一個進行中複寫任務。

您可以透過三種方式中的其中一種取得檢查點資訊：
+ 執行 API 操作 `DescribeReplicationTasks` 並檢視結果。您可以透過任務篩選資訊並搜尋檢查點。您可以在任務處於停止或失敗狀態時擷取最新的檢查點。若任務遭到刪除，則會遺失此資訊。
+ 檢視目標執行個體上名為 `awsdms_txn_state` 的中繼資料表。您可以查詢資料表來取得檢查點資訊。若要建立中繼資料表，請在建立任務時將 `TaskRecoveryTableEnabled` 參數設為 `Yes`。此設定會導致 AWS DMS 持續將檢查點資訊寫入目標中繼資料資料表。若任務遭到刪除，則會遺失此資訊。

  例如，以下是中繼資料表中的範例檢查點：`checkpoint:V1#34#00000132/0F000E48#0#0#*#0#121`
+ 在瀏覽窗格中，選擇**資料庫遷移任務**，然後從 [資料庫遷移任務] 頁面上顯示的清單中選擇您的父任務。父任務頁面隨即開啟，顯示概觀詳細資訊。在 Change data capture (CDC) (變更資料擷取 (CDC))、Change data capture (CDC) start position (變更資料擷取 (CDC) 起始位置) 以及 Change data capture (CDC) recovery checkpoint (變更資料擷取 (CDC) 復原檢查點) 下尋找檢查點值。該檢查點值會顯示如下：

  `checkpoint:V1#1#000004AF/B00000D0#0#0#*#0#0`

### 在遞交或伺服器時間點停止任務
<a name="CHAP_Task.CDC.StopPoint"></a>

 隨著 CDC 原生起點的推出， AWS DMS 也可以在下列時間點停止任務：
+ 來源上的遞交時間
+ 複寫執行個體上的伺服器時間

 您可以視需要修改任務及設定時間 (格式為 UTC)。任務會根據您設定的遞交或伺服器時間自動停止。或者，若您知道在建立任務時停止遷移任務的適當時間，您也可以在建立任務時設定停止時間。

**注意**  
當您第一次啟動新的無 AWS DMS 伺服器複寫時，初始化所有資源最多可能需要 40 分鐘。請注意，`server_time` 選項只有在資源初始化完成後才適用。

### 使用目標重新載入啟動任務
<a name="CHAP_Task.CDC.Start.Task"></a>

 您可以啟動 AWS DMS 遷移現有資料，並使用重新載入選項 (DMS API 中的「重新載入目標」) 複寫進行中的變更任務。在這種情況下，遷移將從頭開始，重新載入每個資料表資料，並使用完全載入和啟用 CDC 的任務設定繼續資料複寫。

 若要使用以重新載入選項開始的任務，必須適用下列條件：
+  必須停止任務。
+  任務的遷移方法必須是完全載入或完全載入加上 CDC。

 DMS 會在重新載入資料表之前套用 TargetTablePrepMode 設定。如果您將 `TargetTablePrepMode`設定為 `DO_NOTHING`，您必須先手動截斷資料表。

**注意**  
 當 DMS 任務以目標重新載入選項啟動時，預遷移評估會執行目前環境中現有中繼資料和參數的完整分析。這可確保評估所有目前的組態和設定，無論實際任務狀態為何。

**重要**  
 如果指定任務在過去 7 天內未執行任何評估，預遷移評估將自動執行，以確保資料完整性和一致性。

## 執行雙向複寫
<a name="CHAP_Task.CDC.Bidirectional"></a>

您可以使用 AWS DMS 任務在兩個系統之間執行雙向複寫。在「雙向複寫」**中，您可以從兩個系統之間的相同資料表 (或一組資料表) 以兩個方向複寫資料。

例如，您可以將 EMPLOYEE 資料表從資料庫 A 複製到資料庫 B，並將資料庫 A 的變更複寫到資料庫 B。您也可以將 EMPLOYEE 資料表的變更從資料庫 B 複寫回 A。因此，您執行的是雙向複製。

**注意**  
AWS DMS 雙向複寫不適用於完整多主機解決方案，包括主節點、衝突解決等。

針對不同節點上的資料在操作上分離的情況，請使用雙向複寫。換句話說，假設您有一個資料元素由節點 A 上操作的應用程式所變更，而且節點 A 與節點 B 執行雙向複寫。則節點 A 上的資料元素永遠不會被節點 B 上操作的任何應用程式所變更。

AWS DMS 支援在這些資料庫引擎上進行雙向複寫：
+ Oracle 
+ SQL Server 
+ MySQL 
+ PostgreSQL 
+ Amazon Aurora MySQL-Compatible Edition
+ Amazon PostgreSQL-Compatible Edition

### 建立雙向複寫任務
<a name="CHAP_Task.CDC.Bidirectional.Tasks"></a>

若要啟用雙向複寫，請設定資料庫 (A AWS DMS 和 B) 的來源和目標端點。例如，設定資料庫 A 的來源端點、資料庫 B 的來源端點、資料庫 A 的目標端點和資料庫 B 的目標端點。

然後建立兩個任務：一個任務讓來源 A 將資料移至目標 B，另一個任務讓來源 B 將資料移至目標 A。此外，請確定每個任務都已設定迴路預防。這樣做可以防止將相同的變更套用至兩個任務的目標，而不致損毀至少其中一個任務的資料。如需詳細資訊，請參閱[防止迴路](#CHAP_Task.CDC.Bidirectional.Loopback)。

最簡單的方法是從資料庫 A 和資料庫 B 上的相同資料集開始，然後建立兩個僅 CDC 任務，一個將資料從 A 複寫到 B 的任務，另一個將資料從 B 複寫到 A 的任務。

若要使用 AWS DMS 從節點 A 執行個體化節點 B 上的新資料集 （資料庫），請執行下列動作：

1. 使用完整載入和 CDC 任務將資料從資料庫 A 移至 B。請確定在此期間沒有任何應用程式修改資料庫 B 上的資料。

1. 當完整載入完成並在允許應用程式修改資料庫 B 上的資料之前，請注意資料庫 B 的時間或 CDC 起始位置。如需指示，請參閱[從 CDC 起點開始執行複寫](#CHAP_Task.CDC.StartPoint)。

1. 使用此起始時間或 CDC 起始位置，建立一個僅 CDC 任務將資料從資料庫 B 移回 A。

**注意**  
雙向對中只有一個任務可以完整載入和 CDC。

### 防止迴路
<a name="CHAP_Task.CDC.Bidirectional.Loopback"></a>

若要顯示防止循環，假設任務 T1 AWS DMS 從來源資料庫 A 讀取變更日誌，並將變更套用至目標資料庫 B。

接下來，第二項任務 T2 從來源資料庫 B 讀取變更日誌，並將它們套用回目標資料庫 A。在 T2 執行這項操作之前，DMS 必須確定從來源資料庫 A 對目標資料庫 B 所做的相同變更不會對來源資料庫 A 進行。換句話說，DMS 必須確定這些變更不會回應 (循環) 回目標資料庫 A。否則，資料庫 A 中的資料可能會損毀。

若要防止變更迴路，請將下列任務設定新增至每個雙向複寫任務。這樣做可確保任一方向都不會發生迴路資料損毀。

```
{
. . .

  "LoopbackPreventionSettings": {
    "EnableLoopbackPrevention": Boolean,
    "SourceSchema": String,
    "TargetSchema": String
  },

. . .
}
```

`LoopbackPreventionSettings` 任務設定會判斷交易是新的還是來自相反複寫任務的回應。當 AWS DMS 將交易套用至目標資料庫時，它會以變更的指示更新 DMS 資料表 (`awsdms_loopback_prevention`)。在將每個交易套用至目標之前，DMS 會忽略包含此 `awsdms_loopback_prevention` 資料表參考的任何交易。因此，它不會套用變更。

將這些任務設定包含在雙向配對中的每個複寫任務。這些設定可啟用迴路預防。它們也會為包含每個端點之 `awsdms_loopback_prevention` 資料表的任務中的每個來源和目標資料庫指定結構描述。

若要讓每個任務都能夠識別此類回應並加以捨棄，請將 `EnableLoopbackPrevention` 設定為 `true`。若要在包含 `awsdms_loopback_prevention` 的來源指定結構描述，請將 `SourceSchema` 設定為來源資料庫中該結構描述的名稱。若要在包含相同資料表的目標指定結構描述，請將 `TargetSchema` 設定為目標資料庫中該結構描述的名稱。

在以下範例中，複寫任務 T1 及其相反複製任務 T2 的`SourceSchema` 和 `TargetSchema` 設定是以相反的設定指定的。

任務 T1 的設定如下。

```
{
. . .

  "LoopbackPreventionSettings": {
    "EnableLoopbackPrevention": true,
    "SourceSchema": "LOOP-DATA",
    "TargetSchema": "loop-data"
  },

. . .
}
```

相反任務 T2 的設定如下。

```
{
. . .

  "LoopbackPreventionSettings": {
    "EnableLoopbackPrevention": true,
    "SourceSchema": "loop-data",
    "TargetSchema": "LOOP-DATA"
  },

. . .
}
```

**注意**  
使用 時 AWS CLI，請僅使用 `create-replication-task`或 `modify-replication-task`命令在雙向複寫任務`LoopbackPreventionSettings`中設定 。

### 雙向複寫的限制
<a name="CHAP_Task.CDC.Bidirectional.Limitations"></a>

的雙向複寫 AWS DMS 有下列限制：
+ 迴路預防只會追蹤資料處理語言 (DML) 陳述式。 AWS DMS 不支援防止資料定義語言 (DDL) 迴路。若要這麼做，請在雙向對中設定其中一個任務，篩選出 DDL 陳述式。
+ 使用迴路預防的任務不支援批次遞交變更。若要設定具有迴路預防的任務，請確定將 `BatchApplyEnabled` 設定為 `false`。
+ DMS 雙向複寫不包括衝突偵測或解決方法。若要偵測資料不一致，請在這兩項任務上使用資料驗證。
+ `setUpMsCdcForTables` 必須將 `true` SQL Server 來源端點的 設定為 ，才能設定雙向複寫。