

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

# 以 Amazon Aurora PostgreSQL 進行複寫
<a name="AuroraPostgreSQL.Replication"></a>

在下文中，您可以找到如何使用 Amazon Aurora PostgreSQL 進行複寫的相關資訊，其中包括如何監控和使用邏輯複寫。

**Topics**
+ [使用 Aurora 複本](#AuroraPostgreSQL.Replication.Replicas)
+ [改善 Aurora 複本的讀取可用性](#AuroraPostgreSQL.Replication.Replicas.SRO)
+ [監控 Aurora PostgreSQL 複寫](#AuroraPostgreSQL.Replication.Monitoring)
+ [以 Aurora 進行 PostgreSQL 邏輯複寫的概觀](AuroraPostgreSQL.Replication.Logical.md)
+ [針對 Aurora PostgreSQL 資料庫叢集設定邏輯複寫](AuroraPostgreSQL.Replication.Logical.Configure.md)
+ [關閉邏輯複寫](AuroraPostgreSQL.Replication.Logical.Stop.md)
+ [監控 Aurora PostgreSQL 邏輯複寫的全部寫入快取和邏輯槽](AuroraPostgreSQL.Replication.Logical-monitoring.md)
+ [範例：搭配 Aurora PostgreSQL 資料庫叢集使用邏輯複寫](AuroraPostgreSQL.Replication.Logical.PostgreSQL-Example.md)
+ [範例：使用 Aurora PostgreSQL 和 進行邏輯複寫 AWS Database Migration Service](AuroraPostgreSQL.Replication.Logical.DMS-Example.md)
+ [設定邏輯複寫連線的 IAM 身分驗證](AuroraPostgreSQL.Replication.Logical.IAM-auth.md)

## 使用 Aurora 複本
<a name="AuroraPostgreSQL.Replication.Replicas"></a>

*Aurora 複本*是 Aurora 資料庫叢集中的獨立端點，最適合用於擴展讀取操作和提高可用性。Aurora 資料庫叢集最多可包含 15 個 Aurora 複本，位於 Aurora 資料庫叢集 AWS 區域的可用區域。

資料庫叢集磁碟區由資料庫叢集的多個資料副本組成。然而，叢集磁碟區中的資料是以單一邏輯磁碟區的形式呈現給主要執行個體，以及資料庫叢集中的 Aurora 複本。如需 Aurora 複本的詳細資訊，請參閱 [Aurora 複本](Aurora.Replication.md#Aurora.Replication.Replicas)。

Aurora 複本很適合讀取擴展，因為完全專用於叢集磁碟區上的讀取操作。寫入器資料庫執行個體會管理寫入操作。Aurora PostgreSQL 資料庫叢集中的所有執行個體將共用叢集磁碟區。因此，不需要額外的工作來複寫每個 Aurora 複本的資料複本。

有了 Aurora PostgreSQL，在刪除 Aurora 複本時，隨即會移除其執行個體端點，並且會從讀取器端點移除 Aurora 複本。如果在要刪除的 Aurora 複本上有陳述式正在執行，則會有三分鐘的寬限期。現有陳述式在寬限期期間可以從容地完成。在寬限期結束時，Aurora 複本會關閉並刪除。

Aurora PostgreSQL 資料庫叢集使用 Aurora 全域資料庫，支援不同 AWS 區域中的 Aurora 複本。如需詳細資訊，請參閱[使用 Amazon Aurora 全球資料庫](aurora-global-database.md)。

**注意**  
透過讀取可用性功能，您必須手動執行才可重新啟動資料庫叢集中的 Aurora 複本。對於在此功能之前建立的資料庫叢集，重新啟動寫入器資料庫執行個體會自動重新啟動 Aurora 複本。自動重新啟動會重新建立進入點，保證資料庫叢集之間讀取/寫入的一致性。

## 改善 Aurora 複本的讀取可用性
<a name="AuroraPostgreSQL.Replication.Replicas.SRO"></a>

Aurora PostgreSQL 透過在寫入器資料庫執行個體重新啟動時，或在 Aurora 複本無法跟上寫入流量時持續提供讀取請求，從而改善資料庫叢集中的讀取可用性。

根據預設，可在下列版本的 Aurora PostgreSQL 上使用讀取可用性功能：
+ 16.1 版和所有更新版本
+ 15.2 版和更新的 15 版本
+ 14.7 版和更新的 14 版本
+ 13.10 版和更新的 13 版本
+ 12.14 版和更新的 12 版本

Aurora 全球資料庫支援下列版本中的讀取可用性功能：
+ 16.1 版和所有更新版本
+ 15.4 版和更新的 15 版本
+ 14.9 版和更新的 14 版本
+ 13.12 版和更新的 13 版本
+ 12.16 版和更新的 12 版本

若要在此啟動之前針對在其中一個版本上建立的資料庫叢集使用讀取可用性功能，請重新啟動資料庫叢集的寫入器執行個體。

修改 Aurora PostgreSQL 資料庫叢集的靜態參數時，您必須重新啟動寫入器執行個體，以便參數變更生效。例如，設定 `shared_buffers` 的值時，您必須重新啟動寫入器執行個體。使用 Aurora 複本讀取可用性功能時，資料庫叢集能維持更佳的可用性，在寫入器執行個體重新啟動時降低對叢集的影響。讀取器執行個體不會重新啟動，並繼續回應讀取請求。若要套用靜態參數變更，請重新啟動每個個別的讀取器執行個體。

Aurora PostgreSQL 資料庫叢集的 Aurora 複本可從複寫錯誤 (例如寫入器重新啟動、容錯移轉、緩慢複寫和網路問題) 中復原，方法為在與寫入器重新連線之後快速復原至記憶體資料庫狀態。此方法可讓 Aurora 複本執行個體在用戶端資料庫仍然可用時，與最新的儲存體更新達成一致性。

與複寫復原發生衝突的進行中交易可能會收到錯誤，但是在讀取器趕上寫入器之後，用戶端可以重試這些交易。

### 監控 Aurora 複本
<a name="AuroraPostgreSQL.Replication.Replicas.SRO.monitoring"></a>

從寫入器中斷連線復原時，您可以監控 Aurora 複本。使用以下指標檢查讀取器執行個體是否有最新的相關資訊，以及追蹤進行中的唯讀交易。
+ `aurora_replica_status` 函數會更新，以在讀取器執行個體仍然連線時，傳回該執行個體的最新資訊。資料列若對應至查詢執行所在的資料庫執行個體，`aurora_replica_status` 中的最後一個更新時間戳記一律為空白。這表示讀取器執行個體具有最新的資料。
+ 當 Aurora 複本中斷與寫入器執行個體的連線並重新連線時，系統會發送下列資料庫事件：

  `Read replica has been disconnected from the writer instance and reconnected.`
+ 當唯讀查詢由於復原衝突而遭到取消時，您可能會在資料庫錯誤日誌中看到一或多個下列錯誤訊息：

  `Canceling statement due to conflict with recovery`.

  `User query may not have access to page data to replica disconnect.`

  `User query might have tried to access a file that no longer exists.`

  `When the replica reconnects, you will be able to repeat your command.`

### 限制
<a name="AuroraPostgreSQL.Replication.Replicas.SRO.limitations"></a>

下列限制適用於具有讀取可用性功能的 Aurora 複本：
+ 如果在複寫復原期間無法從寫入器執行個體串流資料，則次要資料庫叢集的 Aurora 複本就可能會重新啟動。
+ 如果 Aurora 複本已在進行中，則它不支援線上複寫復原，並將重新啟動。
+ 當您的資料庫執行個體接近交易 ID 包圍時，Aurora 複本將重新啟動。如需交易 ID 包圍的詳細資訊，請參閱[避免交易 ID 包圍失敗](https://www.postgresql.org/docs/current/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND                     )。
+ 在特定情況下，當複寫程序遭到封鎖時，Aurora 複本可以重新啟動。

## 監控 Aurora PostgreSQL 複寫
<a name="AuroraPostgreSQL.Replication.Monitoring"></a>

讀取擴展和高可用性取決於最短延遲時間。您可以監控 Amazon CloudWatch `ReplicaLag` 指標，以監控 Aurora 複本落後 Aurora PostgreSQL 資料庫叢集之寫入器資料庫執行個體的程度。因為 Aurora 複本會從與寫入器資料庫執行個體所在的相同叢集磁碟區讀取，`ReplicaLag` 指標對 Aurora PostgreSQL 資料庫叢集有不同的意義。Aurora 複本的 `ReplicaLag` 指標指出 Aurora 複本的頁面快取落後於寫入器資料庫執行個體的頁面快取的程度。

如需監控 RDS 執行個體和 CloudWatch 指標的詳細資訊，請參閱 [在 Amazon Aurora 叢集中監控指標](MonitoringAurora.md)。

# 以 Aurora 進行 PostgreSQL 邏輯複寫的概觀
<a name="AuroraPostgreSQL.Replication.Logical"></a>

透過將 PostgreSQL 的邏輯複寫功能與 Aurora PostgreSQL 資料庫叢集搭配使用，您可以複寫和同步個別資料表，而不是整個資料庫執行個體。邏輯複寫會使用發佈與訂閱模型，將來源中的變更複寫到一或多個收件人。其運作方式為使用 PostgreSQL 預寫日誌 (WAL) 中的變更記錄。來源 (或*發佈者*) 會將所指定資料表的 WAL 資料傳送給一或多個收件人 (*訂閱者*)，進而複寫變更，並讓訂閱者的資料表與發行者的表格保持同步。來自發佈者的變更集是使用*發佈*來識別的。訂閱者取得變更的方式為建立*訂閱*，定義與發佈者資料庫及其發佈的連線。*複寫插槽*是此結構描述中用來追蹤訂閱進度的機制。

對於 Aurora PostgreSQL 資料庫叢集，WAL 記錄會儲存在 Aurora 儲存體上。在邏輯複寫案例中做為發佈者的 Aurora PostgreSQL 資料庫叢集會從 Aurora 儲存體讀取 WAL 資料、將其解碼，然後將其傳送給訂閱者，以便可將變更套用至該執行個體上的資料表。發佈者會使用*邏輯解碼器*來解碼資料以供訂閱者使用。根據預設，Aurora PostgreSQL 資料庫叢集會在傳送資料時使用原生 PostgreSQL `pgoutput` 外掛程式。還有其他邏輯解碼器可供使用。例如，Aurora PostgreSQL 也支援將 WAL 資料轉換為 JSON 的 `[wal2json](https://github.com/eulerto/wal2json)` 外掛程式。

從 Aurora PostgreSQL 14.5、13.8、12.12 和 11.17 版起，Aurora 使用*直接寫入式快取*來擴增 PostgreSQL 邏輯複寫程序，以提升效能。WAL 交易日誌會在緩衝區中進行本機快取，以減少磁碟 I/O 的數量，亦即在邏輯解碼期間從 Aurora 儲存體進行讀取。每當您針對 Aurora PostgreSQL 資料庫叢集使用邏輯複寫時，預設會使用直接寫入式快取。Aurora 提供數個您可以用來管理快取的功能。如需詳細資訊，請參閱[監控 Aurora PostgreSQL 邏輯複寫全部寫入快取](AuroraPostgreSQL.Replication.Logical-monitoring.md#AuroraPostgreSQL.Replication.Logical-write-through-cache)。

所有目前可用的 Aurora PostgreSQL 版本都支援邏輯複寫。如需詳細資訊，請參閱《Aurora PostgreSQL 版本資訊》**中的 [Amazon Aurora PostgreSQL 更新](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/AuroraPostgreSQL.Updates.html)。

從下列版本 Babelfish for Aurora PostgreSQL 支援邏輯複寫：
+ 15.7 及更新版本
+ 16.3 及更新版本

**注意**  
除了在 PostgreSQL 10 中引進的原生 PostgreSQL 邏輯複寫功能之外，Aurora PostgreSQL 也支援 `pglogical` 延伸模組。如需詳細資訊，請參閱[使用 pglogical 跨執行個體同步資料](Appendix.PostgreSQL.CommonDBATasks.pglogical.md)。

如需 PostgreSQL 邏輯複寫的詳細資訊，請參閱 PostgreSQL 文件中的[邏輯複寫](https://www.postgresql.org/docs/current/logical-replication.html)和[邏輯解碼概念](https://www.postgresql.org/docs/current/logicaldecoding-explanation.html)。

**注意**  
PostgreSQL 16 新增支援從僅供讀取複本進行邏輯解碼。Aurora PostgreSQL 不支援此功能。

# 針對 Aurora PostgreSQL 資料庫叢集設定邏輯複寫
<a name="AuroraPostgreSQL.Replication.Logical.Configure"></a>

設定邏輯複製需要 `rds_superuser` 權限。您的 Aurora PostgreSQL 資料庫叢集必須設定為使用自訂資料庫叢集參數群組，以便您可以依下列程序所述設定必要的參數。如需詳細資訊，請參閱[Amazon Aurora 資料庫叢集的資料庫叢集參數群組](USER_WorkingWithDBClusterParamGroups.md)。

**針對 Aurora PostgreSQL 資料庫叢集設定 PostgreSQL 邏輯複寫**

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

1. 在導覽窗格中，選擇 Aurora PostgreSQL 資料庫叢集。

1. 開啟 **Configuration** (組態) 索引標籤。在執行個體詳細資訊中找出**參數群組**連結，並於**類型**清單中選擇**資料庫叢集參數群組**。

1. 選擇連結以開啟與 Aurora PostgreSQL 資料庫叢集相關聯的連結。

1. 在 **Parameters** (參數) 搜尋欄位中，輸入 `rds` 以尋找 `rds.logical_replication` 參數。此參數的預設值為 `0`，表示預設為關閉。

1. 選擇 **Edit parameters** (編輯參數) 以存取屬性值，然後從選取器中選擇 `1` 以開啟功能。根據您預期的使用情況，您可能也需要變更下列參數的設定。不過，在許多情況下，預設值就足夠了。
   + `max_replication_slots` – 將此參數設定為至少等於您規劃之邏輯複寫發佈與訂閱總數的值。如果您使用的是 AWS DMS，此參數應至少等於您從叢集規劃的變更資料擷取任務，以及邏輯複寫出版物和訂閱。
   + `max_wal_senders` 和 `max_logical_replication_workers` – 將這些參數設定為至少等於您要作用中的邏輯複寫槽數目，或變更資料擷取的作用中 AWS DMS 任務數目的值。讓邏輯複寫槽處於非作用中會導致清理無法從資料表移除已淘汰的元組，因此建議您監控複寫槽並視需要移除非作用中的複寫槽。
   + `max_worker_processes` – 將此參數設定為至少等於 `max_logical_replication_workers`、`autovacuum_max_workers`、和 `max_parallel_workers` 值總計的值。在小型資料庫執行個體類別上，背景工作者程序可能影響應用程式工作負載，因此，如果您將 `max_worker_processes` 設為高於預設值，請監控資料庫的效能。(預設值是 `GREATEST(${DBInstanceVCPU*2},8}` 的結果，表示依預設，這是 8 或是資料庫執行個體類別對等 CPU 的兩倍，以較大者為準)。
**注意**  
您可修改客戶建立的資料庫參數群組中的參數值；但無法變更預設資料庫參數群組中的參數值。

1. 選擇**儲存變更**。

1. 重新啟動 Aurora PostgreSQL 資料庫叢集的寫入器執行個體，以便您的變更生效。在 Amazon RDS 主控台中，選擇叢集的主要資料庫執行個體，然後從 **Actions** (動作) 中選擇 **Reboot** (重新啟動)。

1. 當執行個體可用時，您可以驗證邏輯複寫是否已開啟，如下所示。

   1. 使用 `psql` 連線到 Aurora PostgreSQL 資料庫叢集的寫入器執行個體。

      ```
      psql --host=your-db-cluster-instance-1.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
      ```

   1. 使用下列命令驗證是否已啟用邏輯複寫。

      ```
      labdb=> SHOW rds.logical_replication;
       rds.logical_replication
      -------------------------
       on
      (1 row)
      ```

   1. 驗證 `wal_level` 是否已設為 `logical`。

      ```
      labdb=> SHOW wal_level;
        wal_level
      -----------
       logical
      (1 row)
      ```

如需使用邏輯複寫，讓資料庫表格與來源 Aurora PostgreSQL 資料庫叢集中的變更保持同步的範例，請參閱 [範例：搭配 Aurora PostgreSQL 資料庫叢集使用邏輯複寫](AuroraPostgreSQL.Replication.Logical.PostgreSQL-Example.md)。

# 關閉邏輯複寫
<a name="AuroraPostgreSQL.Replication.Logical.Stop"></a>

完成複寫任務之後，您應該停止複寫程序、捨棄複寫槽，並關閉邏輯複寫。在捨棄複寫槽之前，確定不再需要它們。無法捨棄作用中複寫槽。

**關閉邏輯複寫**

1. 捨棄所有複寫槽。

   若要捨棄所有複寫槽，請連線到發佈者，然後執行下列 SQL 命令。

   ```
   SELECT pg_drop_replication_slot(slot_name)
     FROM pg_replication_slots
    WHERE slot_name IN (SELECT slot_name FROM pg_replication_slots);
   ```

   執行此命令時，複寫槽不能處於作用中。

1. 如 [針對 Aurora PostgreSQL 資料庫叢集設定邏輯複寫](AuroraPostgreSQL.Replication.Logical.Configure.md) 所述，修改與發佈者相關聯的自訂資料庫叢集參數群組，但將 `rds.logical_replication` 參數設為 0。

   如需自訂參數群組的詳細資訊，請參閱 [在 Amazon Aurora 中修改資料庫叢集參數群組中的參數](USER_WorkingWithParamGroups.ModifyingCluster.md)。

1. 重新啟動發佈者 Aurora PostgreSQL 資料庫叢集，使 `rds.logical_replication` 參數的變更生效。

# 監控 Aurora PostgreSQL 邏輯複寫的全部寫入快取和邏輯槽
<a name="AuroraPostgreSQL.Replication.Logical-monitoring"></a>

監控邏輯複寫全部寫入快取並管理邏輯槽，以改善 Aurora PostgreSQL 資料庫叢集的效能。以下請見全部寫入快取和邏輯槽的詳細資訊。

**Topics**
+ [監控 Aurora PostgreSQL 邏輯複寫全部寫入快取](#AuroraPostgreSQL.Replication.Logical-write-through-cache)
+ [管理 Aurora PostgreSQL 的邏輯槽](#AuroraPostgreSQL.Replication.Logical.Configure.managing-logical-slots)

## 監控 Aurora PostgreSQL 邏輯複寫全部寫入快取
<a name="AuroraPostgreSQL.Replication.Logical-write-through-cache"></a>

根據預設，Aurora PostgreSQL 14.5、13.8、12.12 和 11.17 版，以及更高版本會使用直接寫入式快取來改善邏輯複寫的效能。若沒有直接寫入式快取，Aurora PostgreSQL 會在實作原生 PostgreSQL 邏輯複寫程序時使用 Aurora 儲存層。作法是將 WAL 資料寫入儲存體，然後從儲存體中讀回資料，以對其進行解碼並傳送 (複寫)到其目標 (訂閱者)。這可能會導致 Aurora PostgreSQL 資料庫叢集進行邏輯複寫期間產生瓶頸。

全部寫入快取可將對 Aurora 儲存層的依賴降至最低。Aurora PostgreSQL 不會持續寫入此層和從中讀取，而是會使用緩衝區來快取邏輯 WAL 串流，以便在複寫過程中使用，進而減少對存取磁碟的需求。此緩衝區是邏輯複寫所使用的原生 PostgreSQL 快取，其會在 Aurora PostgreSQL 資料庫叢集參數中識別為 `rds.logical_wal_cache`。

當使用邏輯複寫搭配 Aurora PostgreSQL 資料庫叢集 (適用於支援直接寫入式快取的版本) 時，您可以監控快取命中率，以查看其在您使用案例中的運作有多好。若要這麼做，請使用 `psql` 連線至 Aurora PostgreSQL 資料庫叢集的寫入執行個體，然後使用 Aurora 函數 `aurora_stat_logical_wal_cache`，如下列範例所示。

```
SELECT * FROM aurora_stat_logical_wal_cache();
```

此函數會傳回如下的輸出。

```
name       | active_pid | cache_hit | cache_miss | blks_read | hit_rate | last_reset_timestamp
-----------+------------+-----------+------------+-----------+----------+--------------
test_slot1 | 79183      | 24        | 0          | 24        | 100.00%  | 2022-08-05 17:39...
test_slot2 |            | 1         | 0          |  1        | 100.00%  | 2022-08-05 17:34...
(2 rows)
```

為了可讀性，`last_reset_timestamp` 值已縮短。如需此函數狀態的詳細資訊，請參閱 [aurora\$1stat\$1logical\$1wal\$1cache](aurora_stat_logical_wal_cache.md)。

Aurora PostgreSQL 提供下列兩個函數，用於監控直接寫入式快取。
+ `aurora_stat_logical_wal_cache` 函數 – 如需參考文件，請參閱 [aurora\$1stat\$1logical\$1wal\$1cache](aurora_stat_logical_wal_cache.md)。
+ `aurora_stat_reset_wal_cache` 函數 – 如需參考文件，請參閱 [aurora\$1stat\$1reset\$1wal\$1cache](aurora_stat_reset_wal_cache.md)。

如果發現自動調整的 WAL 快取大小無法滿足工作負載，則可以手動變更 `rds.logical_wal_cache` 的值。考慮下列各項：
+ 停用 `rds.logical_replication` 參數時，`rds.logical_wal_cache` 會設定為零 (0)。
+ 啟用 `rds.logical_replication` 參數時，`rds.logical_wal_cache` 的預設值為 16 MB。
+ `rds.logical_wal_cache` 為靜態參數，且需要重新啟動資料庫執行個體，變更才能產生作用。系統會以 8 Kb 區塊為單位定義此參數。請注意，任何小於 32 Kb 的正值都會視為 32 Kb。如需 `wal_buffers` 的詳細資訊，請參閱 PostgreSQL 文件中的[預寫日誌](https://www.postgresql.org/docs/current/runtime-config-wal.html#RUNTIME-CONFIG-WAL-SETTINGS)。

## 管理 Aurora PostgreSQL 的邏輯槽
<a name="AuroraPostgreSQL.Replication.Logical.Configure.managing-logical-slots"></a>

在 `pg_replication_origin_status` 檢視中擷取串流活動。若要查看此檢視的內容，您可以使用 `pg_show_replication_origin_status()` 函數，如下所示：

```
SELECT * FROM pg_show_replication_origin_status();
```

您可以使用下面的 SQL 查詢，取得您的邏輯槽清單。

```
SELECT * FROM pg_replication_slots;
```

若要捨棄邏輯槽，請使用 `pg_drop_replication_slot` 搭配該槽的名稱，如下列命令中所示。

```
SELECT pg_drop_replication_slot('test_slot');
```

# 範例：搭配 Aurora PostgreSQL 資料庫叢集使用邏輯複寫
<a name="AuroraPostgreSQL.Replication.Logical.PostgreSQL-Example"></a>

下列程序說明如何在兩個 Aurora PostgreSQL 資料庫叢集之間啟動邏輯複寫。發佈者和訂閱者都必須針對邏輯複寫進行設定，如 [針對 Aurora PostgreSQL 資料庫叢集設定邏輯複寫](AuroraPostgreSQL.Replication.Logical.Configure.md) 中所述。

作為指定發佈者的 Aurora PostgreSQL 資料庫叢集也必須允許存取複寫槽。若要這麼做，請根據 Amazon VPC 服務，修改與 Aurora PostgreSQL 資料庫叢集之虛擬公有雲端 (VPC) 相關聯的安全群組。將與訂閱者 VPC 相關聯的安全群組新增至發佈者的安全群組，以允許傳入存取。如需詳細資訊，請參閱 *Amazon VPC 使用者指南*中的[使用安全群組控制到資源的流量](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)。

完成這些初步步驟後，您可以在發佈者上使用 PostgreSQL 命令 `CREATE PUBLICATION`，以及在訂閱者上使用 `CREATE SUBSCRIPTION`，如下列程序所述。

**在兩個 Aurora PostgreSQL 資料庫叢集之間啟動邏輯複寫程序**

這些步驟假設您的 Aurora PostgreSQL 資料庫叢集具有一個寫入器執行個體，其中包含可在其中建立範例資料表的資料庫。

1. **在發佈者 Aurora PostgreSQL 資料庫叢集上**

   1. 使用下列 SQL 陳述式建立資料表。

      ```
      CREATE TABLE LogicalReplicationTest (a int PRIMARY KEY);
      ```

   1. 使用下列 SQL 陳述式，將資料插入發佈者資料庫。

      ```
      INSERT INTO LogicalReplicationTest VALUES (generate_series(1,10000));
      ```

   1. 使用下列 SQL 陳述式，驗證資料是否存在於資料表中。

      ```
      SELECT count(*) FROM LogicalReplicationTest;
      ```

   1. 使用 `CREATE PUBLICATION` 陳述式建立此資料表的發佈，如下所示。

      ```
      CREATE PUBLICATION testpub FOR TABLE LogicalReplicationTest;
      ```

1. **在訂閱者 Aurora PostgreSQL 資料庫叢集上**

   1. 在訂閱者上建立您已在發佈者上建立的相同 `LogicalReplicationTest` 資料表，如下所示。

      ```
      CREATE TABLE LogicalReplicationTest (a int PRIMARY KEY);
      ```

   1. 驗證此資料表是否為空的。

      ```
      SELECT count(*) FROM LogicalReplicationTest;
      ```

   1. 建立訂閱以從發佈者取得變更。您必須使用有關發佈者 Aurora PostgreSQL 資料庫叢集的下列詳細資訊。
      + **host** – 發佈者 Aurora PostgreSQL 資料庫叢集的寫入器資料庫執行個體。
      + **port** – 寫入器資料庫執行個體正在聆聽的連接埠。PostgreSQL 的預設值為 5432。
      + **dbname** – 資料庫的名稱。

      ```
      CREATE SUBSCRIPTION testsub CONNECTION 
         'host=publisher-cluster-writer-endpoint port=5432 dbname=db-name user=user password=password' 
         PUBLICATION testpub;
      ```
**注意**  
指定此處所顯示提示以外的密碼，作為安全最佳實務。

      建立訂閱後，發佈者會建立一個邏輯複寫槽。

   1. 對於本範例，若要驗證初始資料已複寫在訂閱者上，請對訂閱者資料庫使用下列 SQL 陳述式。

      ```
      SELECT count(*) FROM LogicalReplicationTest;
      ```

發佈者發生的任何其他變更會被複寫到訂閱者。

邏輯複寫會影響效能。建議您在複寫任務完成後關閉邏輯複寫。

# 範例：使用 Aurora PostgreSQL 和 進行邏輯複寫 AWS Database Migration Service
<a name="AuroraPostgreSQL.Replication.Logical.DMS-Example"></a>

您可以使用 AWS Database Migration Service (AWS DMS) 來複寫資料庫或資料庫的一部分。使用 AWS DMS 將您的資料從 Aurora PostgreSQL 資料庫遷移至另一個開放原始碼或商業資料庫。如需 的詳細資訊 AWS DMS，請參閱[AWS Database Migration Service 《 使用者指南》](https://docs.aws.amazon.com/dms/latest/userguide/)。

下列範例示範如何從 Aurora PostgreSQL 資料庫設定邏輯複寫做為發佈者，然後使用 AWS DMS 進行遷移。本範例使用在 [範例：搭配 Aurora PostgreSQL 資料庫叢集使用邏輯複寫](AuroraPostgreSQL.Replication.Logical.PostgreSQL-Example.md) 建立的同一個發佈者和訂閱者。

若要使用 設定邏輯複寫 AWS DMS，您需要 Amazon RDS 發佈者和訂閱者的詳細資訊。尤其是關於發佈者的寫入器資料庫執行個體，以及訂閱者的資料庫執行個體的詳細資訊。

取得發佈者的寫入器資料庫執行個體的下列資訊︰
+ Virtual Private Cloud (VPC) 識別符
+ 子網路群組
+ 可用區域 (AZ)
+ VPC 安全群組
+ 資料庫執行個體 ID

取得訂閱者的資料庫執行個體的下列資訊︰
+ 資料庫執行個體 ID
+ 來源引擎

**使用 與 Aurora PostgreSQL AWS DMS 進行邏輯複寫**

1. 準備要使用的發佈者資料庫 AWS DMS。

   若要這麼做，PostgreSQL 10.x 和以上版本的資料庫要求您將 AWS DMS 包裝函式套用於發佈者資料庫。如需此步驟和稍後步驟的詳細資訊，請參閱 *AWS Database Migration Service 使用者指南*中的[使用 PostgreSQL 10.x 和以上版本作為 AWS DMS的來源](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.v10)。

1. 登入 AWS 管理主控台 並開啟位於 的 AWS DMS 主控台[https://console.aws.amazon.com/dms/v2](https://console.aws.amazon.com/dms/v2)。在右上角，選擇發佈者和訂閱者所在的相同 AWS 區域。

1. 建立 AWS DMS 複寫執行個體。

   選擇與發佈者的寫入器資料庫執行個體相同的值。這些值包括下列設定：
   + 在 **VPC** 中，選擇與寫入器資料庫執行個體相同的 VPC。
   + 針對 **Replication Subnet Group** (複寫子網路群組)，選擇值同於寫入器資料庫執行個體的子網路群組。必要時，建立新的子網路群組。
   + 在 **Availability zone (可用區域)** 中，選擇與寫入器資料庫執行個體相同的區域。
   + 在 **VPC Security Group (VPC 安全群組)** 中，請選擇與寫入器資料庫執行個體相同的群組。

1. 建立來源的 AWS DMS 端點。

   使用下列設定，將發佈者指定為來源端點︰ 
   + 在 **Endpoint type (端點類型)** 中，選擇 **Source (來源)**。
   + 選擇 **Select RDS DB Instance (選取 RDS 資料庫執行個體)**。
   + 在 **RDS Instance (RDS 執行個體)** 中，選擇發佈者的寫入器資料庫執行個體的資料庫標識符。
   + 在 **Source engine (來源引擎)** 中，選擇 **postgres**。

1. 建立目標的 AWS DMS 端點。

   使用下列設定，將發佈者指定為目標端點︰
   + 在 **Endpoint type (端點類型)** 中，選擇 **Target (目標)**。
   + 選擇 **Select RDS DB Instance (選取 RDS 資料庫執行個體)**。
   + 在 **RDS Instance (RDS 執行個體)** 中，選擇發佈者資料庫執行個體的資料庫識別符。
   + 在 **Source engine (來源引擎)** 中選擇一個值。例如，如果訂閱者為一 RDS PostgreSQL 資料庫，則選擇 **postgres**。如果訂閱者是 Aurora PostgreSQL 資料庫，請選擇 **aurora-postgresql**。

1. 建立 AWS DMS 資料庫遷移任務。

   您使用資料庫遷移任務指定要遷移哪一個資料庫資料表，使用目標結構描述映射資料，並於目標資料庫上建立新資料表。至少將下列設定使用於 **Task configuration (任務組態)**：
   + 在 **Replication instance (複寫執行個體)** 中，選擇您在先前步驟中建立的複寫執行個體。
   + 在 **Source database endpoint (來源資料庫端點)** 中，選擇您在先前步驟中建立的發佈者來源。
   + 在 **Target database endpoint (目標資料庫端點)** 中，選擇您在先前步驟中建立的訂閱者目標。

   其餘的任務細節端視您的遷移專案而定。如需指定 DMS 任務所有詳細資訊的詳細資訊，請參閱《 使用者指南》中的[使用 AWS DMS 任務](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.html)。 *AWS Database Migration Service *

在 AWS DMS 建立任務之後，它會開始將資料從發佈者遷移至訂閱者。

# 設定邏輯複寫連線的 IAM 身分驗證
<a name="AuroraPostgreSQL.Replication.Logical.IAM-auth"></a>

從 Aurora PostgreSQL 第 11 版及更新版本開始，您可以使用 AWS Identity and Access Management (IAM) 身分驗證進行複寫連線。此功能可讓您使用 IAM 角色而非密碼來管理資料庫存取，以增強安全性。它可在叢集層級運作，並遵循與標準 IAM 身分驗證相同的安全模型。

複寫連線的 IAM 身分驗證是一項選擇加入功能。若要啟用它，請在資料庫叢集`rds.iam_auth_for_replication`參數群組`1`中將 參數設定為 。由於這是動態參數，因此您的資料庫叢集不需要重新啟動，可讓您利用 IAM 身分驗證與現有的工作負載，而無需停機。啟用此功能之前，您必須符合下列[先決條件](#AuroraPostgreSQL.Replication.Logical.IAM-auth-prerequisites)各項。

## 先決條件
<a name="AuroraPostgreSQL.Replication.Logical.IAM-auth-prerequisites"></a>

若要針對複寫連線使用 IAM 身分驗證，您需要符合下列所有要求：
+ 您的 Aurora PostgreSQL 資料庫叢集必須是 11 版或更新版本。
+ 在您的發佈者 Aurora PostgreSQL 資料庫叢集上：
  + 啟用 IAM 資料庫身分驗證。

    如需詳細資訊，請參閱[啟用和停用 IAM 資料庫身分驗證](UsingWithRDS.IAMDBAuth.Enabling.md)。
  + 將 `rds.logical_replication` 參數設定為 以啟用邏輯複寫`1`。

    如需詳細資訊，請參閱[針對 Aurora PostgreSQL 資料庫叢集設定邏輯複寫](AuroraPostgreSQL.Replication.Logical.Configure.md)。

  在邏輯複寫中，發佈者是將資料傳送至訂閱者叢集的來源 Aurora PostgreSQL 資料庫叢集。如需詳細資訊，請參閱[使用 Aurora 進行 PostgreSQL 邏輯複寫的概觀](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Replication.Logical.html)。

**注意**  
您的發佈者 Aurora PostgreSQL 資料庫叢集上必須同時啟用 IAM 身分驗證和邏輯複寫。如果其中一個未啟用，則您無法將 IAM 身分驗證用於複寫連線。

## 啟用複寫連線的 IAM 身分驗證
<a name="AuroraPostgreSQL.Replication.Logical.IAM-auth-enabling"></a>

完成下列步驟，以啟用複寫連線的 IAM 身分驗證。

1. 確認您的 Aurora PostgreSQL 資料庫叢集符合具有複寫連線的 IAM 身分驗證的所有先決條件。如需詳細資訊，請參閱[先決條件](#AuroraPostgreSQL.Replication.Logical.IAM-auth-prerequisites)。

1. 透過修改資料庫叢集`rds.iam_auth_for_replication`參數群組來設定 參數：
   + 將 `rds.iam_auth_for_replication` 參數設為 `1`。此動態參數不需要重新啟動。

1. 連線至您的資料庫，並將必要的角色授予您的複寫使用者：

   下列 SQL 命令會授予必要角色，以啟用複寫連線的 IAM 身分驗證：

   ```
   -- Grant IAM authentication role
   GRANT rds_iam TO replication_user_name;
   -- Grant replication privileges
   ALTER USER replication_user_name WITH REPLICATION;
   ```

完成這些步驟後，指定的使用者必須使用 IAM 身分驗證進行複寫連線。

**重要**  
當您啟用此功能時，同時具有 `rds_iam`和 `rds_replication`角色的使用者必須使用 IAM 身分驗證進行複寫連線。無論角色是直接指派給使用者或透過其他角色繼承，這都會套用。

## 停用複寫連線的 IAM 身分驗證
<a name="AuroraPostgreSQL.Replication.Logical.IAM-auth-disabling"></a>

您可以使用下列任一方法停用複寫連線的 IAM 身分驗證：
+ 將資料庫叢集`rds.iam_auth_for_replication`參數群組`0`中的 參數設定為
+ 或者，您可以在 Aurora PostgreSQL 資料庫叢集上停用下列其中一項功能：
  + 將 `rds.logical_replication` 參數設定為 以停用邏輯複寫 `0`
  + 停用 IAM 身分驗證

當您停用此功能時，複寫連線可以使用資料庫密碼進行身分驗證，如果已設定。

**注意**  
即使啟用 功能，沒有 `rds_iam`角色的使用者複寫連線也可以使用密碼身分驗證。

## 限制及考量
<a name="AuroraPostgreSQL.Replication.Logical.IAM-auth-limitations"></a>

將 IAM 身分驗證用於複寫連線時，適用下列限制和考量。
+ 複寫連線的 IAM 身分驗證僅適用於 Aurora PostgreSQL 第 11 版及更新版本。
+ 發佈者必須支援複寫連線的 IAM 身分驗證。
+ IAM 身分驗證字符預設會在 15 分鐘後過期。您可能需要在字符過期之前重新整理長時間執行的複寫連線。