

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

# 使用 PostgreSQL 資料庫做為 AWS DMS 來源
<a name="CHAP_Source.PostgreSQL"></a>

您可以使用 從一或多個 PostgreSQL 資料庫遷移資料 AWS DMS。使用 PostgreSQL 資料庫作為來源，您可以將資料遷移至其他 PostgreSQL 資料庫或其他受支援的資料庫之一。

如需 AWS DMS 支援做為來源的 PostgreSQL 版本的資訊，請參閱 [的來源 AWS DMS](CHAP_Introduction.Sources.md)。

AWS DMS 支援 PostgreSQL 用於這些類型的資料庫：
+ 現場部署資料庫
+ Amazon EC2 執行個體上的資料庫
+ Amazon RDS 資料庫執行個體上的資料庫
+ 以 Amazon Aurora PostgreSQL 相容版本為基礎的資料庫執行個體上的資料庫
+ 以 Amazon Aurora PostgreSQL 相容無伺服器版本為基礎的資料庫執行個體上的資料庫

**注意**  
DMS 支援 Amazon Aurora PostgreSQL：無伺服器 V1 僅作為完全載入的來源。但是您可以使用 Amazon Aurora PostgreSQL：無伺服器 V2 作為完全載入、完全載入 \$1 CDC 和僅限 CDC 任務的來源。

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

使用 PostgreSQL 作為來源時的額外安全要求，是指定的使用者帳戶必須是 PostgreSQL 資料庫中的註冊使用者。

若要將 PostgreSQL 資料庫設定為 AWS DMS 來源端點，請執行下列動作：
+ 建立具有適當許可的 PostgreSQL 使用者，以提供 PostgreSQL 來源資料庫的 AWS DMS 存取權。
**注意**  
如果 PostgreSQL 來源資料庫是自我管理的，請參閱 [在 中使用自我管理 PostgreSQL 資料庫做為來源 AWS DMS](#CHAP_Source.PostgreSQL.Prerequisites) 以取得詳細資訊。
如果 PostgreSQL 來源資料庫是由 Amazon RDS 管理，請參閱 [使用 AWS受管 PostgreSQL 資料庫做為 DMS 來源](#CHAP_Source.PostgreSQL.RDSPostgreSQL) 以取得詳細資訊。
+ 建立符合您所選的 PostgreSQL 資料庫組態的 PostgreSQL 來源端點。
+ 建立一個或一組遷移資料表的任務。

  如果要建立僅完全載入的任務，則不需要任何進一步的端點組態。

  建立用於變更資料擷取的任務 (僅限 CDC 或完全載入和 CDC 任務) 之前，請參閱 [使用自我管理 PostgreSQL 資料庫做為 AWS DMS 來源來啟用 CDC](#CHAP_Source.PostgreSQL.Prerequisites.CDC) 或 [使用 啟用具有 AWS受管 PostgreSQL 資料庫執行個體的 CDC AWS DMS](#CHAP_Source.PostgreSQL.RDSPostgreSQL.CDC)。

**Topics**
+ [在 中使用自我管理 PostgreSQL 資料庫做為來源 AWS DMS](#CHAP_Source.PostgreSQL.Prerequisites)
+ [使用 AWS受管 PostgreSQL 資料庫做為 DMS 來源](#CHAP_Source.PostgreSQL.RDSPostgreSQL)
+ [使用邏輯複寫啟用變更資料擷取 (CDC)](#CHAP_Source.PostgreSQL.Security)
+ [如何使用原生 CDC 起點，以設定 PostgreSQL 來源的 CDC 載入](#CHAP_Source.PostgreSQL.v10)
+ [使用 從 PostgreSQL 遷移至 PostgreSQL AWS DMS](#CHAP_Source.PostgreSQL.Homogeneous)
+ [使用 從 Babelfish for Amazon Aurora PostgreSQL 遷移 AWS DMS](#CHAP_Source.PostgreSQL.Babelfish)
+ [從 PostgreSQL 來源資料庫移除 AWS DMS 成品](#CHAP_Source.PostgreSQL.CleanUp)
+ [使用 PostgreSQL 資料庫作為 DMS 來源時的其他組態設定](#CHAP_Source.PostgreSQL.Advanced)
+ [作為 PostgreSQL 來源的僅供讀取複本](#CHAP_Source.PostgreSQL.ReadReplica)
+ [使用 `MapBooleanAsBoolean` PostgreSQL 端點設定](#CHAP_Source.PostgreSQL.ConnectionAttrib.Endpointsetting)
+ [使用 PostgreSQL 做為 DMS 來源時的端點設定和額外連線屬性 (ECAs)](#CHAP_Source.PostgreSQL.ConnectionAttrib)
+ [使用 PostgreSQL 資料庫作為 DMS 來源的限制](#CHAP_Source.PostgreSQL.Limitations)
+ [PostgreSQL 的來源資料類型](#CHAP_Source-PostgreSQL-DataTypes)

## 在 中使用自我管理 PostgreSQL 資料庫做為來源 AWS DMS
<a name="CHAP_Source.PostgreSQL.Prerequisites"></a>

使用自我管理的 PostgreSQL 資料庫做為來源，您可以將資料遷移至另一個 PostgreSQL 資料庫，或其中一個 支援的其他目標資料庫 AWS DMS。資料庫來源可以是在 Amazon EC2 執行個體上執行的內部部署資料庫或自我管理引擎。您可以使用資料庫執行個體來進行完全載入任務，以及變更資料擷取 (CDC) 任務。

### 使用自我管理 PostgreSQL 資料庫做為 AWS DMS 來源的先決條件
<a name="CHAP_Source.PostgreSQL.Prerequisites.SelfManaged"></a>

從自我管理的 PostgreSQL 來源資料庫遷移資料之前，請執行下列動作：
+ 請確定您使用的是 9.4.x 版或更高版本的 PostgreSQL 資料庫。
+ 對於完全載入加上 CDC 任務或僅 CDC 任務，請將超級使用者許可授予針對 PostgreSQL 來源資料庫指定的使用者帳戶。此使用者帳戶需要超級使用者許可，才能存取來源中的複寫特定功能。DMS 使用者帳戶需要所有資料欄的 SELECT 許可，才能成功遷移資料表。如果資料欄缺少許可，DMS 會使用一般 DMS 資料類型映射建立目標資料表，這會導致中繼資料差異和任務失敗。
+ 將 AWS DMS 複寫伺服器的 IP 地址新增至`pg_hba.conf`組態檔案，並啟用複寫和通訊端連線。範例如下。

  ```
              # Replication Instance
              host all all 12.3.4.56/00 md5
              # Allow replication connections from localhost, by a user with the
              # replication privilege.
              host replication dms 12.3.4.56/00 md5
  ```

  PostgreSQL 的 `pg_hba.conf` 組態文件控制用戶端身分驗證。(HBA 代表以主機為基礎的身分驗證。) 按照傳統做法，檔案會儲存在資料庫叢集的資料目錄中。
+ 如果您要使用 將資料庫設定為邏輯複寫的來源， AWS DMS 請參閱 [使用自我管理 PostgreSQL 資料庫做為 AWS DMS 來源來啟用 CDC](#CHAP_Source.PostgreSQL.Prerequisites.CDC)

**注意**  
有些 AWS DMS 交易會在 DMS 引擎再次使用它們之前閒置一段時間。透過使用 PostgreSQL 9.6 版和更高版本的參數 `idle_in_transaction_session_timeout`，可讓您將閒置交易變成逾時而失敗。使用 AWS DMS時不要結束閒置交易。

### 使用自我管理 PostgreSQL 資料庫做為 AWS DMS 來源來啟用 CDC
<a name="CHAP_Source.PostgreSQL.Prerequisites.CDC"></a>

AWS DMS 支援使用邏輯複寫進行變更資料擷取 (CDC)。若要啟用自我管理 PostgreSQL 來源資料庫的邏輯複寫，請在 `postgresql.conf` 組態檔中設定下列參數和值：
+ 設定 `wal_level = logical`。
+ 將 `max_replication_slots` 設為大於 1 的值。

  將 `max_replication_slots` 值設定為您想要執行的任務數量。例如，若要執行 5 項任務，則需要設定至少 5 個插槽。只要任務啟動並保持開啟，插槽立即自動開啟，即使任務不再執行。請務必手動刪除開啟的插槽。請注意，如果 DMS 建立了插槽，則 DMS 會在刪除任務時自動捨棄複寫插槽。
+ 將 `max_wal_senders` 設為大於 1 的值。

  `max_wal_senders` 參數設定可以同時執行的任務數量。
+ `wal_sender_timeout` 參數會將失效超過指定毫秒數的複寫連線結束。內部部署 PostgreSQL 資料庫的預設值為 60000 毫秒 (60 秒)。將值設定為 0 (零) 會停用逾時機制，而且是 DMS 的有效設定。

  將 `wal_sender_timeout` 設為非零值時，使用 CDC 的 DMS 任務至少需要 10000 毫秒 (10 秒)，如果值小於 10000，則會失敗。將值保持在 5 分鐘以內，以避免在 DMS 複寫執行個體的異地同步備份容錯移轉期間造成延遲。

某些參數是靜態值，您只能在伺服器啟動時進行設定。在重新啟動伺服器之前，會忽略其在組態檔 (針對自我管理的資料庫) 或資料庫參數群組 (針對 RDS for PostgreSQL 資料庫) 中對項目所做的任何變更。如需詳細資訊，請參閱 [PostgreSQL 文件](https://www.postgresql.org/docs/current/intro-whatis.html)。

如需啟用 CDC 的詳細資訊，請參閱[使用邏輯複寫啟用變更資料擷取 (CDC)](#CHAP_Source.PostgreSQL.Security)。

## 使用 AWS受管 PostgreSQL 資料庫做為 DMS 來源
<a name="CHAP_Source.PostgreSQL.RDSPostgreSQL"></a>

您可以使用 AWS受管 PostgreSQL 資料庫執行個體做為 的來源 AWS DMS。您可以使用 AWS受管的 PostgreSQL 來源，同時執行完全載入任務和變更資料擷取 (CDC) 任務。

### 使用 AWS受管 PostgreSQL 資料庫做為 DMS 來源的先決條件
<a name="CHAP_Source.PostgreSQL.RDSPostgreSQL.Prerequisites"></a>

從 AWS受管 PostgreSQL 來源資料庫遷移資料之前，請執行下列動作：
+ 我們建議您使用具有 PostgreSQL 資料庫執行個體最低必要許可的 AWS 使用者帳戶，做為 PostgreSQL 來源端點的使用者帳戶 AWS DMS。不建議使用主帳戶。此帳戶必須具有 `rds_superuser` 角色和 `rds_replication` 角色。授權來管理邏輯槽和利用邏輯槽來串流資料的 `rds_replication` 角色

  請務必從您使用之帳戶的主要使用者帳戶建立數個物件。如需建立這些物件的相關資訊，請參閱[不使用主要使用者帳戶遷移 Amazon RDS for PostgreSQL 資料庫](#CHAP_Source.PostgreSQL.RDSPostgreSQL.NonMasterUser)。
+ 如果來源資料庫位於虛擬私有雲端 (VPC) 中，請選取可提供資料庫所在之資料庫執行個體存取的 VPC 安全群組。DMS 複寫執行個體必須這樣做，才能成功連線到來源資料庫執行個體。當資料庫和 DMS 複寫執行個體位於相同的 VPC 中時，請將適當的安全群組新增至其本身的輸入規則。

**注意**  
有些 AWS DMS 交易會在 DMS 引擎再次使用它們之前閒置一段時間。透過使用 PostgreSQL 9.6 版和更高版本的參數 `idle_in_transaction_session_timeout`，可讓您將閒置交易變成逾時而失敗。使用 AWS DMS時不要結束閒置交易。

### 使用 啟用具有 AWS受管 PostgreSQL 資料庫執行個體的 CDC AWS DMS
<a name="CHAP_Source.PostgreSQL.RDSPostgreSQL.CDC"></a>

AWS DMS 當資料庫執行個體設定為使用邏輯複寫時， 支援 Amazon RDS PostgreSQL 資料庫上的 CDC。下表摘要說明每個 AWS受管 PostgreSQL 版本的邏輯複寫相容性。


|  PostgreSQL 版本  |  AWS DMS 完全載入支援   |  AWS DMS CDC 支援  | 
| --- | --- | --- | 
|  Aurora PostgreSQL 2.1 版 (與 PostgreSQL 10.5 版相容 (或更低版本))。  |  是  |  否  | 
|  Aurora PostgreSQL 2.2 版 (與 PostgreSQL 10.6 版 相容 (或更高版本))。  |  是  |  是  | 
|  與 PostgreSQL 10.21 相容 (或更高版本) 的 RDS for PostgreSQL  |  是  |  是  | 

**啟用 RDS PostgreSQL 資料庫執行個體的邏輯複寫**

1. 使用 PostgreSQL 資料庫執行個體 AWS 的主要使用者帳戶做為 PostgreSQL 來源端點的使用者帳戶。主要使用者帳戶擁有能讓它設定 CDC 所需要的角色。

   如果您使用主要使用者帳戶以外的帳戶，務必從主帳戶為您要使用的帳戶建立數個物件。如需詳細資訊，請參閱[不使用主要使用者帳戶遷移 Amazon RDS for PostgreSQL 資料庫](#CHAP_Source.PostgreSQL.RDSPostgreSQL.NonMasterUser)。

1. 將您資料庫叢集參數群組中的 `rds.logical_replication` 參數設為 1。此靜態參數需要重新啟動資料庫執行個體才會生效。套用此參數時， AWS DMS 會設定 `wal_level`、`max_wal_senders`、`max_replication_slots` 和 `max_connections` 參數。這些參數變更會產生更多 Write Ahead Log (WAL)，因此您應在使用邏輯複寫插槽時才設定 `rds.logical_replication` 參數。

1. `wal_sender_timeout` 參數會將失效超過指定毫秒數的複寫連線結束。受 AWS管 PostgreSQL 資料庫的預設值為 30000 毫秒 (30 秒）。將值設定為 0 (零) 會停用逾時機制，而且是 DMS 的有效設定。

   將 `wal_sender_timeout` 設為非零值時，使用 CDC 的 DMS 任務至少需要 10000 毫秒 (10 秒)，如果值介於 0 和 10000 之間，則會失敗。將值保持在 5 分鐘以內，以避免在 DMS 複寫執行個體的異地同步備份容錯移轉期間造成延遲。

1.  請確定資料庫叢集參數群組中的 `max_worker_processes` 參數值等於或大於 `max_logical_replication_workers`、`autovacuum_max_workers` 和 `max_parallel_workers` 的合併值總計。背景工作者程序的數量如果很多，可能會影響小型執行個體上的應用程式工作負載 因此，如果您將 `max_worker_processes` 設為高於預設值，請監控資料庫的效能。

1.  使用 Aurora PostgreSQL 做為具有 CDC 的來源時，請將 `synchronous_commit`設定為 `ON`。

**使用 PostgreSQL MultiAZ 資料庫叢集僅供讀取複本進行 CDC （持續複寫）**

1. 將資料庫 CLUSTER `sync_replication_slots` 參數群組中的 `rds.logical_replication`和 參數設定為 1。此靜態參數需要重新啟動資料庫執行個體才能生效。

1. 執行下列命令以在 Writer 上建立`awsdms_ddl_audit`資料表，並將 取代`objects_schema`為要使用的結構描述名稱：

   ```
   CREATE TABLE objects_schema.awsdms_ddl_audit
   (
     c_key    bigserial primary key,
     c_time   timestamp,    -- Informational
     c_user   varchar(64),  -- Informational: current_user
     c_txn    varchar(16),  -- Informational: current transaction
     c_tag    varchar(24),  -- Either 'CREATE TABLE' or 'ALTER TABLE' or 'DROP TABLE'
     c_oid    integer,      -- For future use - TG_OBJECTID
     c_name   varchar(64),  -- For future use - TG_OBJECTNAME
     c_schema varchar(64),  -- For future use - TG_SCHEMANAME. For now - holds current_schema
     c_ddlqry  text         -- The DDL query associated with the current DDL event
   );
   ```

1. 執行下列命令來建立 `awsdms_intercept_ddl`函數，並將 取代`objects_schema`為要使用的結構描述名稱：

   ```
   CREATE OR REPLACE FUNCTION objects_schema.awsdms_intercept_ddl()
     RETURNS event_trigger
   LANGUAGE plpgsql
   SECURITY DEFINER
     AS $$
     declare _qry text;
   BEGIN
     if (tg_tag='CREATE TABLE' or tg_tag='ALTER TABLE' or tg_tag='DROP TABLE' or tg_tag = 'CREATE TABLE AS') then
            SELECT current_query() into _qry;
            insert into objects_schema.awsdms_ddl_audit
            values
            (
            default,current_timestamp,current_user,cast(TXID_CURRENT()as varchar(16)),tg_tag,0,'',current_schema,_qry
            );
            delete from objects_schema.awsdms_ddl_audit;
   end if;
   END;
   $$;
   ```

1. 執行下列命令來建立`awsdms_intercept_ddl`事件觸發：

   ```
   CREATE EVENT TRIGGER awsdms_intercept_ddl ON ddl_command_end EXECUTE PROCEDURE objects_schema.awsdms_intercept_ddl();
   ```

   確保存取這些事件的所有使用者和角色都具有必要的 DDL 許可。例如：

   ```
   grant all on public.awsdms_ddl_audit to public;
   grant all on public.awsdms_ddl_audit_c_key_seq to public;
   ```

1. 在寫入器上建立複寫槽：

   ```
   SELECT * FROM pg_create_logical_replication_slot('dms_read_replica_slot', 'test_decoding', false, true);
   ```

1. 確保 複寫槽在 Reader 上可用：

   ```
   select * from pg_catalog.pg_replication_slots where slot_name = 'dms_read_replica_slot';
   
   slot_name            |plugin       |slot_type|datoid|database|temporary|active|active_pid|xmin|catalog_xmin|restart_lsn|confirmed_flush_lsn|wal_status|safe_wal_size|two_phase|inactive_since               |conflicting|invalidation_reason|failover|synced|
   ---------------------+-------------+---------+------+--------+---------+------+----------+----+------------+-----------+-------------------+----------+-------------+---------+-----------------------------+-----------+-------------------+--------+------+
   dms_read_replica_slot|test_decoding|logical  |     5|postgres|false    |false |          |    |3559        |0/180011B8 |0/180011F0         |reserved  |             |true     |2025-02-10 15:45:04.083 +0100|false      |                   |false   |false |
   ```

1. 為僅供讀取複本建立 DMS 來源端點，並透過額外連線屬性設定邏輯複寫槽名稱：

   ```
   slotName=dms_read_replica_slot;
   ```

1. 建立並啟動 CDC/FL\$1CDC 任務。
**注意**  
對於 CDC/FL\$1CDC 遷移，DMS 會將任務開始時間視為 CDC 開始位置。複寫槽中所有較舊LSNs 都會遭到忽略。

### 不使用主要使用者帳戶遷移 Amazon RDS for PostgreSQL 資料庫
<a name="CHAP_Source.PostgreSQL.RDSPostgreSQL.NonMasterUser"></a>

在某些情況下，您可能不會對您用來作為來源的 Amazon RDS PostgreSQL 資料庫執行個體使用主要使用者帳戶。在這些情況下，您會建立多個物件來擷取資料定義語言 (DDL) 事件。您要在主帳戶以外的帳戶中建立這些物件，然後在主要使用者帳戶中建立觸發。

**注意**  
如果在來源端點上將 `CaptureDdls` 端點設為 `false`，您即不必在來源資料庫中建立以下資料表和觸發程序。

請使用下列程序建立這些物件。

**建立物件**

1. 選擇要建立物件的結構描述。預設結構描述為 `public`。確認結構描述存在且可讓 `OtherThanMaster` 帳戶存取。

1. 使用主帳戶以外的使用者帳戶 (此處為 `OtherThanMaster` 帳戶) 登入 PostgreSQL 資料庫執行個體。

1. 執行以下命令建立資料表 `awsdms_ddl_audit`，以要使用之結構描述名稱取代以下程式碼中的 `objects_schema`。

   ```
   CREATE TABLE objects_schema.awsdms_ddl_audit
   (
     c_key    bigserial primary key,
     c_time   timestamp,    -- Informational
     c_user   varchar(64),  -- Informational: current_user
     c_txn    varchar(16),  -- Informational: current transaction
     c_tag    varchar(24),  -- Either 'CREATE TABLE' or 'ALTER TABLE' or 'DROP TABLE'
     c_oid    integer,      -- For future use - TG_OBJECTID
     c_name   varchar(64),  -- For future use - TG_OBJECTNAME
     c_schema varchar(64),  -- For future use - TG_SCHEMANAME. For now - holds current_schema
     c_ddlqry  text         -- The DDL query associated with the current DDL event
   );
   ```

1. 執行以下命令建立函數 `awsdms_intercept_ddl`，以要使用的結構描述名稱取代以下程式碼中的 `objects_schema`。

   ```
   CREATE OR REPLACE FUNCTION objects_schema.awsdms_intercept_ddl()
     RETURNS event_trigger
   LANGUAGE plpgsql
   SECURITY DEFINER
     AS $$
     declare _qry text;
   BEGIN
     if (tg_tag='CREATE TABLE' or tg_tag='ALTER TABLE' or tg_tag='DROP TABLE' or tg_tag = 'CREATE TABLE AS') then
            SELECT current_query() into _qry;
            insert into objects_schema.awsdms_ddl_audit
            values
            (
            default,current_timestamp,current_user,cast(TXID_CURRENT()as varchar(16)),tg_tag,0,'',current_schema,_qry
            );
            delete from objects_schema.awsdms_ddl_audit;
   end if;
   END;
   $$;
   ```

1. 登出 `OtherThanMaster` 帳戶，再以獲指派 `rds_superuser` 角色的帳戶登入。

1. 執行以下命令建立事件觸發 `awsdms_intercept_ddl`。

   ```
   CREATE EVENT TRIGGER awsdms_intercept_ddl ON ddl_command_end 
   EXECUTE PROCEDURE objects_schema.awsdms_intercept_ddl();
   ```

1. 請確定存取這些事件的所有使用者和角色都具有必要的 DDL 許可。例如：

   ```
   grant all on public.awsdms_ddl_audit to public;
   grant all on public.awsdms_ddl_audit_c_key_seq to public;
   ```

完成上述程序後，您可以使用 `OtherThanMaster` 帳戶建立 AWS DMS 來源端點。

**注意**  
這些事件由 `CREATE TABLE`、`ALTER TABLE` 和 `DROP TABLE` 陳述式觸發。

## 使用邏輯複寫啟用變更資料擷取 (CDC)
<a name="CHAP_Source.PostgreSQL.Security"></a>

您可以使用 PostgreSQL 的原生邏輯複寫功能，在進行適用於 PostgreSQL 來源的資料庫遷移期間啟用變更資料擷取 (CDC)。您可以將此功能與自我管理的 PostgreSQL 以及 Amazon RDS for PostgreSQL SQL 資料庫執行個體搭配使用。此方法可縮短停機時間，並協助確保目標資料庫與來源 PostgreSQL 資料庫保持同步。

AWS DMS 支援具有主索引鍵的 CDC for PostgreSQL 資料表。如果資料表沒有主索引鍵，預先寫入日誌 (WAL) 不會在資料庫資料列的影像之前包含 。在此情況下，DMS 無法更新此資料表。您可以在此使用其他組態設定，並使用資料表複本身分識別作為因應措施。但是，這種方法可能會產生額外的日誌。我們建議您僅在仔細測試之後，才使用資料表複本身分識別作為因應措施。如需詳細資訊，請參閱[使用 PostgreSQL 資料庫作為 DMS 來源時的其他組態設定](#CHAP_Source.PostgreSQL.Advanced)。

**注意**  
REPLICA IDENTITY FULL 支援邏輯解碼外掛程式，但不支援 pglogical 外掛程式。如需詳細資訊，請參閱 [pglogical 文件](https://github.com/2ndQuadrant/pglogical#primary-key-or-replica-identity-required)。

對於完全載入和僅限 CDC 和 CDC 的任務， AWS DMS 會使用邏輯複寫插槽來保留複寫的 WAL 日誌，直到日誌解碼為止。在完全載入和 CDC 任務或 CDC 任務的重新啟動 (非繼續) 時，會重新建立複寫插槽。

**注意**  
對於邏輯解碼，DMS 會擇一使用 test\$1decoding 或 pglogical 外掛程式。如果 pglogical 外掛程式在來源 PostgreSQL 資料庫上是可用的狀態，則 DMS 會使用 pglogical 建立複寫插槽，否則將使用 test\$1decoding 外掛程式。如需 test-decoding 外掛程式的詳細資訊，請參閱 [ PostgreSQL 文件](https://www.postgresql.org/docs/9.4/test-decoding.html)。  
如果將資料庫參數 `max_slot_wal_keep_size` 設為非預設值，且複寫插槽的 `restart_lsn` 落在目前 LSN 後面的次數超過大小，則 DMS 任務會因必要的 WAL 檔案移除而失敗。

### 設定 pglogical 外掛程式
<a name="CHAP_Source.PostgreSQL.Security.Pglogical"></a>

pglogical 外掛程式會實作為 PostgreSQL 擴充功能，是用於選擇性資料複寫的邏輯複寫系統和模型。下表說明支援 pglogical 外掛程式的來源 PostgreSQL 資料庫版本。


|  PostgreSQL 來源   |  支援 pglogical  | 
| --- | --- | 
|  自我管理的 PostgreSQL 9.4 版或更高版本  |  是  | 
|  Amazon RDS PostgreSQL 9.5 或更低版本  |  否  | 
|  Amazon RDS PostgreSQL 9.6 或更高版本  |  是  | 
|  Aurora PostgreSQL 1.x 到 2.5.x  |  否  | 
|  Aurora PostgreSQL 2.6.x 及更高版本  |  是  | 
|  Aurora PostgreSQL 3.3.x 及更高版本  |  是  | 

在設定 pglogical 以搭配 使用之前 AWS DMS，請先在 PostgreSQL 來源資料庫上啟用變更資料擷取 (CDC) 的邏輯複寫。
+ 如需在自我管理** PostgreSQL 來源資料庫上啟用 CDC 邏輯複寫的相關資訊，請參閱[使用自我管理 PostgreSQL 資料庫做為 AWS DMS 來源來啟用 CDC](#CHAP_Source.PostgreSQL.Prerequisites.CDC)
+ 如需在 *AWS受管* PostgreSQL 來源資料庫上啟用 CDC 邏輯複寫的相關資訊，請參閱[使用 啟用具有 AWS受管 PostgreSQL 資料庫執行個體的 CDC AWS DMS](#CHAP_Source.PostgreSQL.RDSPostgreSQL.CDC)。

在 PostgreSQL 來源資料庫上啟用邏輯複寫之後，請使用下列步驟設定 pglogical 以與 DMS 搭配使用。

**使用 pglogical 外掛程式在 PostgreSQL 來源資料庫上使用 進行邏輯複寫 AWS DMS**

1. 在來源 PostgreSQL 資料庫上建立 pglogical 擴充功能：

   1. 設定正確的參數：
      + 對於自我管理的 PostgreSQL 資料庫，請設定資料庫參數 `shared_preload_libraries= 'pglogical'`。
      + 對於 Amazon RDS 上的 PostgreSQL 和 Amazon Aurora PostgreSQL 相容版本資料庫，請在相同的 RDS 參數群組中將參數 `shared_preload_libraries` 設定為 `pglogical`。

   1. 重新啟動 PostgreSQL 來源資料庫。

   1. 在 PostgreSQL 資料庫上，執行命令 (`create extension pglogical;`)

1. 執行下列命令來確認 pglogical 是否安裝成功：

   `select * FROM pg_catalog.pg_extension`

您現在可以建立 AWS DMS 任務，為 PostgreSQL 來源資料庫端點執行變更資料擷取。

**注意**  
如果您沒有在 PostgreSQL 來源資料庫上啟用 pglogical，則預設情況下 AWS DMS 會使用 `test_decoding` 外掛程式。啟用 pglogical 進行邏輯解碼時， 預設 AWS DMS 會使用 pglogical。但是您可以設定額外的連接屬性 (`PluginName`) 以改用 `test_decoding` 外掛程式。

## 如何使用原生 CDC 起點，以設定 PostgreSQL 來源的 CDC 載入
<a name="CHAP_Source.PostgreSQL.v10"></a>

建立端點時，您可以將 `slotName` 額外連線屬性設定為現有邏輯複寫插槽的名稱，便可將原生 CDC 起點和 PostgreSQL 作為來源。此邏輯複寫插槽會保留從建立端點時開始的持續變更，因此它支援從前一個時間點進行複寫。

PostgreSQL 會將資料庫變更寫入 WAL 檔案，這只有在 AWS DMS 成功讀取邏輯複寫插槽的變更之後才會捨棄。使用邏輯複寫插槽可以保護已記錄的變更，使其免於接受複寫引擎使用之前遭到刪除。

不過，依照不同的變更速率和使用比率，保留在邏輯複寫插槽中的變更可能會提高的磁碟使用率。建議您在使用邏輯複寫插槽時，於來源 PostgreSQL 執行個體中設定空間使用量警示。如需設定 `slotName` 額外連線屬性的相關資訊，請參閱 [使用 PostgreSQL 做為 DMS 來源時的端點設定和額外連線屬性 (ECAs)](#CHAP_Source.PostgreSQL.ConnectionAttrib)。

下列程序更詳細說明這個方法。

**如何使用原生 CDC 起點，以設定 PostgreSQL 來源端點的 CDC 載入**

1. 識別您想要用作為起始點之先前複寫任務 (父項任務) 所使用的邏輯複寫插槽。然後查詢來源資料庫上的`pg_replication_slots`檢視，以確保此插槽沒有任何作用中的連線。如果是這樣，請在繼續之前解決並關閉。

   對於下列步驟，假設您的邏輯複寫插槽為 `abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef`。

1. 建立新的來源端點，包括下列額外的連線屬性設定：

   ```
   slotName=abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef;
   ```

1. 使用主控台 AWS CLI 或 AWS DMS API 建立新的僅限 CDC 任務。例如，您可以使用 CLI，執行以下 `create-replication-task` 命令。

   ```
   aws dms create-replication-task --replication-task-identifier postgresql-slot-name-test 
   --source-endpoint-arn arn:aws:dms:us-west-2:012345678901:endpoint:ABCD1EFGHIJK2LMNOPQRST3UV4 
   --target-endpoint-arn arn:aws:dms:us-west-2:012345678901:endpoint:ZYX9WVUTSRQONM8LKJIHGF7ED6 
   --replication-instance-arn arn:aws:dms:us-west-2:012345678901:rep:AAAAAAAAAAA5BB4CCC3DDDD2EE 
   --migration-type cdc --table-mappings "file://mappings.json" --cdc-start-position "4AF/B00000D0" 
   --replication-task-settings "file://task-pg.json"
   ```

   在上述命令中，會設定下列選項：
   + `source-endpoint-arn` 選項會設為您在步驟 2 中建立的新值。
   + `replication-instance-arn` 選項會設為與步驟 1 的父項任務相同的值。
   + `table-mappings` 和 `replication-task-settings` 選項會設為與步驟 1 中父項任務相同的值。
   + `cdc-start-position` 選項會設為起始位置值。若要尋找此起始位置，請查詢來源資料庫上的 `pg_replication_slots` 檢視，或檢視步驟 1 中父項任務的主控台詳細資訊。如需詳細資訊，請參閱[決定 CDC 原生起點](CHAP_Task.CDC.md#CHAP_Task.CDC.StartPoint.Native)。

   若要在使用 AWS DMS 主控台建立新的僅限 CDC 任務時啟用自訂 CDC 啟動模式，請執行下列動作：
   + 在**任務設定**區段中，針對**來源交易的 CDC 開始模式**，選擇**啟用自訂 CDC 開始模式**。
   + 對於**來源交易的自訂 CDC 起點**，請選擇**指定日誌序號**。指定系統變更編號，或選擇**指定復原檢查點**，然後提供復原檢查點。

   當此 CDC 任務執行時，如果指定的邏輯複寫槽不存在， 會 AWS DMS 引發錯誤。如果未使用 `cdc-start-position` 的有效設定建立任務，也會引發錯誤。

將原生 CDC 起點與 pglogical 外掛程式搭配使用時，您想要使用新的複寫插槽時，請先完成下列設定步驟，然後再建立 CDC 任務。

**使用先前未建立為另一個 DMS 任務一部分的新複寫插槽**

1. 如下所示建立複寫插槽：

   ```
   SELECT * FROM pg_create_logical_replication_slot('replication_slot_name', 'pglogical');
   ```

1. 資料庫建立複寫插槽之後，請取得並記下此插槽的 **restart\$1lsn** 和 **confirmed\$1flush\$1lsn** 值：

   ```
   select * from pg_replication_slots where slot_name like 'replication_slot_name';
   ```

   請注意，在複寫插槽之後建立的 CDC 任務的原生 CDC 開始位置不能早於 **confirmed\$1flush\$1lsn** 值。

   若要取得有關 **restart\$1lsn** 和 **confirmed\$1flush\$1lsn** 的相關資訊，請參閱 [pg\$1replication\$1slots](https://www.postgresql.org/docs/14/view-pg-replication-slots.html) 

1. 建立 pglogical 節點。

   ```
   SELECT pglogical.create_node(node_name := 'node_name', dsn := 'your_dsn_name');
   ```

1. 使用 `pglogical.create_replication_set` 函數建立兩個複寫集。第一個複寫集會追蹤具有主索引鍵之資料表的更新和刪除。第二個複寫集只會追蹤插入，名稱與第一個複寫集的名稱相同，但新增了前綴 'i'。

   ```
   SELECT pglogical.create_replication_set('replication_slot_name', false, true, true, false);
   SELECT pglogical.create_replication_set('ireplication_slot_name', true, false, false, true);
   ```

1. 將資料表新增至複寫集。

   ```
   SELECT pglogical.replication_set_add_table('replication_slot_name', 'schemaname.tablename', true);
   SELECT pglogical.replication_set_add_table('ireplication_slot_name', 'schemaname.tablename', true);
   ```

1. 建立來源端點時，請依照下列設定額外連線屬性 (ECA)。

   ```
   PluginName=PGLOGICAL;slotName=slot_name;
   ```

您現在可以使用新的複寫插槽，使用 PostgreSQL 原生起點建立僅限 CDC 的任務。如需 pglogical 外掛程式的詳細資訊，請參閱 [pglogical 3.7 文件](https://www.enterprisedb.com/docs/pgd/3.7/pglogical/)

## 使用 從 PostgreSQL 遷移至 PostgreSQL AWS DMS
<a name="CHAP_Source.PostgreSQL.Homogeneous"></a>

當您從 PostgreSQL 以外的資料庫引擎遷移至 PostgreSQL 資料庫時， 幾乎一律 AWS DMS 是最適合使用的遷移工具。但是，從 PostgreSQL 資料庫遷移到 PostgreSQL 資料庫時，PostgreSQL 工具會更有效率。

### 使用 PostgreSQL 原生工具遷移資料
<a name="CHAP_Source.PostgreSQL.Homogeneous.Native"></a>

在下列情況中，建議您使用 PostgreSQL 資料庫遷移工具，例如 `pg_dump`：
+ 您有一項從來源 PostgreSQL 資料庫遷移到目標 PostgreSQL 資料庫的同質遷移。
+ 您想要遷移整個資料庫。
+ 原生工具可讓您以最短的停機時間來遷移資料。

pg\$1dump 公用程式會使用 COPY 命令，建立 PostgreSQL 資料庫的結構描述和資料傾印。pg\$1dump 產生的傾印指令碼會將資料載入相同名稱的資料庫中，並重新建立資料表、索引和外部索引鍵。若要將資料還原至不同名稱的資料庫，請使用 `pg_restore` 命令和 `-d` 參數。

如果您要將資料從 EC2 上執行的 PostgreSQL 來源資料庫遷移到 Amazon RDS for PostgreSQL 的目標，您可以使用 pglogical 外掛程式。

如需將 PostgreSQL 資料庫匯入 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL 相容版本的詳細資訊，請參閱 [https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.Procedural.Importing.html](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.Procedural.Importing.html)。

### 使用 DMS 將資料從 PostgreSQL 遷移至 PostgreSQL
<a name="CHAP_Source.PostgreSQL.Homogeneous.DMS"></a>

 AWS DMS 可以將資料從內部部署的來源 PostgreSQL 資料庫遷移到目標 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 執行個體。核心或基本 PostgreSQL 資料類型最常遷移成功。

**注意**  
將分區資料表從 PostgreSQL 來源複寫到 PostgreSQL 目標時，您不需要提及父資料表作為 DMS 任務中選擇條件的一部分。提及父資料表會導致目標上子資料表中的資料重複，而可能會導致 PK 違規。只要在資料表對應選擇條件中選取子資料表，就會自動填入父資料表。

來源資料庫上支援但目標上不支援的資料類型可能無法成功遷移。如果資料類型未知， 會將某些資料類型 AWS DMS 串流為字串。有些資料類型（如 XML 和 JSON），小型檔案移轉會成功，但大型文件會失敗。

執行資料類型遷移時，請注意下列事項：
+ 在某些情況下，PostgreSQL NUMERIC(p，s) 資料類型不會指定任何精確度和比例。對於版本 3.4.2 及更早版本的 DMS，DMS 根據預設會使用精確度 28 和小數位數 6，即 NUMERIC(28,6)。舉例來說，來源的值 0.611111104488373 會轉換為 PostgreSQL 目標的 0.611111。
+ 具有 ARRAY 資料類型的資料表必須有主索引鍵。缺少主索引鍵之 ARRAY 資料類型的資料表會在完全載入間暫停。

下表顯示來源 PostgreSQL 資料類型以及它們是否可成功遷移：


| 資料類型 | 遷移成功 | 部分遷移 | 不會遷移 | 說明 | 
| --- | --- | --- | --- | --- | 
| INTEGER | X |  |  |  | 
| SMALLINT | X |  |  |  | 
| BIGINT | X |  |  |  | 
| NUMERIC/DECIMAL(p,s) |  | X |  | 其中 0<p<39，且 0<s | 
| NUMERIC/DECIMAL |  | X |  | 其中 p>38 或 p=s=0 | 
| REAL | X |  |  |  | 
| DOUBLE | X |  |  |  | 
| SMALLSERIAL | X |  |  |  | 
| SERIAL | X |  |  |  | 
| BIGSERIAL | X |  |  |  | 
| MONEY | X |  |  |  | 
| CHAR |  | X |  | 沒有指定的精確度 | 
| CHAR(n) | X |  |  |  | 
| VARCHAR |  | X |  | 沒有指定的精確度 | 
| VARCHAR(n) | X |  |  |  | 
| TEXT | X |  |  |  | 
| BYTEA | X |  |  |  | 
| TIMESTAMP | X |  |  | 正無限大值和負無限大值分別截斷為 '9999-12-31 23:59:59' 和 '4713-01-01 00:00:00 BC'。 | 
| TIMESTAMP WITH TIME ZONE |  | X |  |  | 
| DATE | X |  |  |  | 
| TIME | X |  |  |  | 
| TIME WITH TIME ZONE | X |  |  |  | 
| INTERVAL |  | X |  |  | 
| BOOLEAN | X |  |  |  | 
| ENUM |  |  | X |  | 
| CIDR | X |  |  |  | 
| INET |  |  | X |  | 
| MACADDR |  |  | X |  | 
| TSVECTOR |  |  | X |  | 
| TSQUERY |  |  | X |  | 
| XML |  | X |  |  | 
| POINT | X |  |  | PostGIS 空間資料類型 | 
| LINE |  |  | X |  | 
| LSEG |  |  | X |  | 
| BOX |  |  | X |  | 
| PATH |  |  | X |  | 
| POLYGON | X |  |  | PostGIS 空間資料類型 | 
| CIRCLE |  |  | X |  | 
| JSON |  | X |  |  | 
| ARRAY | X |  |  | 需要主索引鍵 | 
| COMPOSITE |  |  | X |  | 
| RANGE |  |  | X |  | 
| LINESTRING | X |  |  | PostGIS 空間資料類型 | 
| MULTIPOINT | X |  |  | PostGIS 空間資料類型 | 
| MULTILINESTRING | X |  |  | PostGIS 空間資料類型 | 
| MULTIPOLYGON | X |  |  | PostGIS 空間資料類型 | 
| GEOMETRYCOLLECTION | X |  |  | PostGIS 空間資料類型 | 

### 遷移 PostGIS 空間資料類型
<a name="CHAP_Source.PostgreSQL.DataTypes.Spatial"></a>

*空間資料*可識別空間中，物件或位置的幾何圖形資訊。PostgreSQL 物件關聯式資料庫支援 PostGIS 空間資料類型。

遷移 PostgreSQL 空間資料物件之前，請確定 PostGIS 外掛程式可在全域層級啟用。這樣做可確保 為 PostgreSQL 目標資料庫執行個體 AWS DMS 建立確切的來源空間資料欄。

對於 PostgreSQL 到 PostgreSQL 同質遷移， AWS DMS 支援 PostGIS 幾何和地理 （地理座標） 資料物件類型和子類型的遷移，如下所示：
+  POINT 
+  LINESTRING 
+  POLYGON 
+  MULTIPOINT 
+  MULTILINESTRING 
+  MULTIPOLYGON 
+  GEOMETRYCOLLECTION 

## 使用 從 Babelfish for Amazon Aurora PostgreSQL 遷移 AWS DMS
<a name="CHAP_Source.PostgreSQL.Babelfish"></a>

您可以使用 將 Babelfish for Aurora PostgreSQL 來源資料表遷移至任何支援的目標端點 AWS DMS。

當您使用 DMS 主控台、API 或 CLI 命令建立 AWS DMS 來源端點時，請將來源設定為 **Amazon Aurora PostgreSQL**，並將資料庫名稱設定為 **babelfish\$1db**。在**端點設定**區段中，確定 **DatabaseMode** 設定為 **Babelfish**，**BabelfishDatabaseName** 設定為來源 Babelfish T-SQL 資料庫的名稱。不使用 Babelfish TCP 連接埠 **1433**，而是使用 Aurora PostgreSQL TCP 連接埠 **5432**。

您必須在遷移資料之前建立資料表，以確保 DMS 使用正確的資料類型和資料表中繼資料。如果您在執行遷移之前未在目標上建立資料表，DMS 可能會建立具有不正確資料類型和許可的資料表。

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

當您為 Babelfish 來源建立遷移任務時，您需要包含轉換規則，以確保 DMS 使用預先建立的目標資料表。

如果您在定義 Babelfish for PostgreSQL 叢集時設定多資料庫遷移模式，請將重新命名結構描述名稱的轉換規則新增至 T-SQL 結構描述。例如，如果 T-SQL 結構描述名稱為 `dbo`，而 Babelfish for PostgreSQL 結構描述名稱為 `mydb_dbo`，`dbo`請使用轉換規則將結構描述重新命名為 。若要尋找 PostgreSQL 結構描述名稱，請參閱《*Amazon Aurora 使用者指南*》中的 [Babelfish 架構](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/babelfish-architecture.html)。

如果您使用單一資料庫模式，則不需要使用轉換規則來重新命名資料庫結構描述。PostgreSQL 結構描述名稱具有one-to-one映射。

下列轉換規則範例示範如何將結構描述名稱從`mydb_dbo`後重新命名為 `dbo`：

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

### 搭配 Babelfish 資料表使用 PostgreSQL 來源端點的限制
<a name="CHAP_Source.PostgreSQL.Babelfish.Limitations"></a>

搭配 Babelfish 資料表使用 PostgreSQL 來源端點時，適用下列限制：
+ DMS 僅支援從 Babelfish 16.2/15.6 版和更新版本以及 DMS 3.5.3 版和更新版本進行遷移。
+ DMS 不會將 Babelfish 資料表定義變更複寫至目標端點。此限制的解決方法是先在目標上套用資料表定義變更，然後在 Babelfish 來源上變更資料表定義。
+ 當您使用 BYTEA 資料類型建立 Babelfish 資料表時，DMS 會在遷移至 SQL Server 做為目標時將其轉換為 `varbinary(max)`資料類型。
+ DMS 不支援二進位資料類型的完整 LOB 模式。請改為對二進位資料類型使用有限的 LOB 模式。
+ DMS 不支援 Babelfish 做為來源的資料驗證。
+ 對於**目標資料表準備模式**任務設定，請僅使用**不執行**或**截斷**模式。請勿使用**刪除目標中的資料表**模式。在**目標上使用捨棄資料表**時，DMS 可能會建立資料類型不正確的資料表。
+ 使用持續複寫 (CDC 或完全載入和 CDC) 時，請將`PluginName`額外連線屬性 (ECA) 設定為 `TEST_DECODING`。
+ DMS 不支援 Babelfish 做為來源之分割資料表的複寫 (CDC 或完全載入和 CDC)。

## 從 PostgreSQL 來源資料庫移除 AWS DMS 成品
<a name="CHAP_Source.PostgreSQL.CleanUp"></a>

若要擷取 DDL 事件， 會在遷移任務開始時，在 PostgreSQL 資料庫中 AWS DMS 建立各種成品。當任務完成後，您可能想要移除這些成品。

若要移除成品，請發出以下陳述式 (依出現順序)，其中 `{AmazonRDSMigration}` 是成品建立所在的結構描述。如要捨棄結構描述，請務必小心謹慎。絕對不要捨棄操作的結構描述，尤其是不公開的。

```
drop event trigger awsdms_intercept_ddl;
```

事件觸發不屬於特定結構描述。

```
drop function {AmazonRDSMigration}.awsdms_intercept_ddl()
drop table {AmazonRDSMigration}.awsdms_ddl_audit
drop schema {AmazonRDSMigration}
```

## 使用 PostgreSQL 資料庫作為 DMS 來源時的其他組態設定
<a name="CHAP_Source.PostgreSQL.Advanced"></a>

從 PostgreSQL 資料庫遷移資料時，您有兩種方式可以新增額外的組態設定：
+ 您可以在額外連線屬性新增值，擷取 DDL 事件和指定要建立操作 DDL 資料庫成品的結構描述。如需詳細資訊，請參閱[使用 PostgreSQL 做為 DMS 來源時的端點設定和額外連線屬性 (ECAs)](#CHAP_Source.PostgreSQL.ConnectionAttrib)。
+ 您可以覆寫連線字串參數。請選擇下列其中一個選項：
  + 指定內部 AWS DMS 參數。因為很少需要這種參數，所以不會在使用者介面公開。
  + 為特定資料庫用戶端指定傳遞 （傳遞） 值。在傳遞給資料庫用戶端的連線 sting 中 AWS DMS 包含傳遞參數。
+ 透過使用 PostgreSQL 9.4 版及更新版本中的資料表層級參數 `REPLICA IDENTITY`，您可以控制在預寫日誌 (WAL) 中寫入的資訊。特別是，其會對於識別已更新或刪除的資料列的 WALS 執行此操作。`REPLICA IDENTITY FULL` 會記錄資料列中所有資料欄的舊值。將 `REPLICA IDENTITY FULL` 用於每個資料表時請小心，因為 `FULL` 可能產生額外不必要的 WAL 數量。如需詳細資訊，請參閱 [ALTER TABLE-REPLICA IDENTITY](https://www.postgresql.org/docs/devel/sql-altertable.html) 

## 作為 PostgreSQL 來源的僅供讀取複本
<a name="CHAP_Source.PostgreSQL.ReadReplica"></a>

在 中使用 PostgreSQL 僅供讀取複本做為 CDC 來源 AWS DMS ，以減少主要資料庫負載。此功能可從 PostgreSQL 16.x 取得，且需要 3 AWS DMS .6.1 版或更新版本。使用僅供讀取複本處理 CDC 可減少對主要資料庫的操作影響。

**注意**  
Amazon RDS PostgreSQL 16.x 版對三可用區域 (TAZ) 組態中的僅供讀取複本邏輯複寫有限制。如需 TAZ 部署中的完整僅供讀取複本邏輯複寫支援，您必須使用 PostgreSQL 17.x 版或更新版本。

### 先決條件
<a name="CHAP_Source.PostgreSQL.ReadReplica.prereq"></a>

使用僅供讀取複本做為 CDC 來源之前 AWS DMS，您必須在主要資料庫執行個體及其僅供讀取複本上啟用邏輯複寫，以在僅供讀取複本上建立邏輯解碼。執行下列動作：
+ 在主要資料庫執行個體及其僅供讀取複本以及任何其他必要的資料庫參數上啟用邏輯複寫。如需詳細資訊，請參閱[使用 AWS受管 PostgreSQL 資料庫做為 DMS 來源](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.RDSPostgreSQL)。
+ 對於僅限 CDC 的任務，在主要 （寫入器） 執行個體上建立複寫槽。如需詳細資訊，請參閱[使用原生 CDC 起點設定 PostgreSQL 來源的 CDC 負載](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.v10)。此動作是必要的，因為僅供讀取複本不支援建立複寫槽。
+ 對於 PostgreSQL 16 版，必須在僅供讀取複本上手動建立插槽。
+ 對於 PostgreSQL 第 17 版及更高版本，複寫插槽必須在主要 上建立，並自動同步到僅供讀取複本。
+ 使用完全載入 \$1 CDC 或僅限 CDC 任務時， AWS DMS 可以自動管理主要執行個體上的邏輯複寫槽，但不能管理僅供讀取複本上的邏輯複寫槽。對於 PostgreSQL 第 16 版僅供讀取複本，您必須在重新啟動任務 （而非繼續） 之前手動捨棄並重新建立複寫槽。略過此步驟可能會導致任務失敗或不正確的 CDC 開始位置。從 PostgreSQL 第 17 版起，主要執行個體的邏輯槽同步會自動化此程序。

完成先決條件後，您可以使用端點設定中的僅供讀取複本來源`SlotName`複寫來設定 AWS DMS 來源端點，並使用原生 CDC 起點來設定 AWS DMS 任務。如需詳細資訊，請參閱[使用 PostgreSQL 做為 DMS 來源時的端點設定和額外連線屬性 (ECAs)](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.ConnectionAttrib)，以及[使用原生 CDC 起點設定 PostgreSQL 來源的 CDC 負載](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.v10)。

## 使用 `MapBooleanAsBoolean` PostgreSQL 端點設定
<a name="CHAP_Source.PostgreSQL.ConnectionAttrib.Endpointsetting"></a>

您可以使用 PostgreSQL 端點設定，將布林值作為布林值從 PostgreSQL 來源對應至 Amazon Redshift 目標。根據預設，BOOLEAN 型別會以 varchar(5) 遷移。您可以如下列範例所示，指定 `MapBooleanAsBoolean` 讓 PostgreSQL 將布林值型別以 boolean 遷移。

```
--postgre-sql-settings '{"MapBooleanAsBoolean": true}'
```

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

由於 MySQL 沒有 BOOLEAN 類型，因此將 BOOLEAN 資料遷移至 MySQL 時，請使用轉換規則而非此設定。

## 使用 PostgreSQL 做為 DMS 來源時的端點設定和額外連線屬性 (ECAs)
<a name="CHAP_Source.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)，您可以指定端點設定。

下表顯示您可以搭配 PostgreSQL 做為來源使用的端點設定和 ECAs。

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

## 使用 PostgreSQL 資料庫作為 DMS 來源的限制
<a name="CHAP_Source.PostgreSQL.Limitations"></a>

使用 PostgreSQL 做為 AWS DMS來源時，有下列限制：
+ AWS DMS 無法使用 Amazon RDS for PostgreSQL 10.4 或 Amazon Aurora PostgreSQL 10.4 做為來源或目標。
+ 擷取的資料表必須有主索引鍵。如果資料表沒有主索引鍵， 會 AWS DMS 忽略該資料表的 DELETE 和 UPDATE 記錄操作。如需因應措施，請參閱[使用邏輯複寫啟用變更資料擷取 (CDC)](#CHAP_Source.PostgreSQL.Security)。

  **備註：**我們不建議在沒有主索引鍵/唯一索引的情況下進行遷移，否則應考量其他限制，例如「不」批次套用功能、完整 LOB 功能、資料驗證，以及無法有效率地複寫至 Redshift 目標。
+ AWS DMS 會忽略嘗試更新主索引鍵區段。在這些情況下，目標會將更新識別為一個未更新任何資料列的項目。不過，因為無法預測在 PostgreSQL 中更新主索引鍵的結果，所以例外狀況資料表中不會寫入任何記錄。
+ AWS DMS 不支援**從時間戳記執行開始程序變更**選項。
+ AWS DMS 不會複寫分割區或子分割區操作 (`ADD`、 `DROP`或 ) 所產生的變更`TRUNCATE`。
+ 複寫同名但每個名稱大小寫不盡相同的多份資料表 (例如 table1、TABLE1 和 Table1)，會造成無法預測的行為。由於此問題， AWS DMS 不支援這種複寫類型。
+ 在大多數情況下， AWS DMS 支援資料表的 CREATE、ALTER 和 DROP DDL 陳述式變更處理。如果資料表保留在內部函數或程序內文區塊或其他巢狀建構中， AWS DMS 則 不支援此變更處理。

  例如，不擷取以下變更。

  ```
  CREATE OR REPLACE FUNCTION attu.create_distributors1() RETURNS void
  LANGUAGE plpgsql
  AS $$
  BEGIN
  create table attu.distributors1(did serial PRIMARY KEY,name
  varchar(40) NOT NULL);
  END;
  $$;
  ```
+ 目前 PostgreSQL 來源中的 `boolean` 資料類型會以具有不一致值的 `bit` 資料類型形式，遷移至 SQL Server 目標。作為解決方法，使用資料欄的`VARCHAR(1)`資料類型預先建立資料表 （或 AWS DMS 建立資料表）。然後讓下游處理將「F」視為 False，將「T」視為 True。
+ AWS DMS 不支援 TRUNCATE 操作的變更處理。
+ OID LOB 資料類型不會遷移到目標。
+ AWS DMS 僅支援同質遷移的 PostGIS 資料類型。
+ 如果來源是在內部部署或在 Amazon EC2 執行個體上的 PostgreSQL 資料庫，請確保 test\$1decoding 輸出外掛程式會安裝在來源端點。您可以在 PostgreSQL contrib 套件找到這個外掛程式。如需 test-decoding 外掛程式的詳細資訊，請參閱 [ PostgreSQL 文件](https://www.postgresql.org/docs/10/static/test-decoding.html)。
+ AWS DMS 不支援變更處理來設定和取消設定資料欄預設值 （在 ALTER TABLE 陳述式上使用 ALTER COLUMN SET DEFAULT 子句）。
+ AWS DMS 不支援變更處理以設定資料欄 nullability （使用 ALTER TABLE 陳述式上的 ALTER COLUMN 【SET\$1DROP】 NOT NULL 子句）。
+ 啟用邏輯複寫時，每個交易保留在記憶體中的變更數目上限為 4 MB。之後，變更會溢出到磁碟。結果 `ReplicationSlotDiskUsage` 會增加，`restart_lsn` 在交易完成或中止並且回復完成前不會有所進展。由於這個交易很長，回復所需時間可能很久。因此，在啟用邏輯複寫時，請避免長時間執行的交易或許多子交易。相反地，請將交易分解為幾個較小的交易。

  在 Aurora PostgreSQL 第 13 版及更新版本上，您可以調校 `logical_decoding_work_mem` 參數，以控制 DMS 何時溢出將資料變更為磁碟。如需詳細資訊，請參閱[Aurora PostgreSQL 中的溢出檔案](CHAP_Troubleshooting_Latency_Source_PostgreSQL.md#CHAP_Troubleshooting_Latency_Source_PostgreSQL_Spill)。
+ 具有 ARRAY 資料類型的資料表必須有主索引鍵。缺少主索引鍵之 ARRAY 資料類型的資料表會在完全載入間暫停。
+ AWS DMS 不支援遷移與資料表分割或資料表[繼承相關的資料表](https://www.postgresql.org/docs/15/ddl-inherit.html)中繼資料。當 AWS DMS 遇到分割的資料表或使用繼承的資料表時，會觀察到下列行為：
  + AWS DMS 識別和報告涉及來源資料庫上分割或繼承的父資料表和子資料表。
  + 在**目標上建立資料表**：在目標資料庫中，將資料表 AWS DMS 建立為標準 （非分割、非繼承） 資料表，保留所選資料表的結構和屬性，但不會保留分割或繼承邏輯。
  + **在繼承資料表中記錄差異**：對於使用繼承的資料表， AWS DMS 不會在填入父資料表時區分屬於子資料表的記錄。因此，它不會使用 SQL 查詢搭配語法，例如：`SELECT * FROM ONLY parent_table_name`。
+ 若要將分割資料表從 PostgreSQL 來源複寫到 PostgreSQL 目標，請先在目標手動建立父資料表和子資料表。然後，要另外定義任務，以複寫到那些資料表。在這種情況下，要將任務組態設定為**先截斷再載入**。
+ PostgreSQL `NUMERIC` 資料類型的大小不固定。根據預設，當傳輸資料類型為 `NUMERIC` 但沒有精確度和小數位數的資料時，DMS 使用 `NUMERIC(28,6)` (精確度為 28 和小數位數為 6)。舉例來說，來源的值 0.611111104488373 會轉換為 PostgreSQL 目標的 0.611111。
+ AWS DMS 僅支援 Aurora PostgreSQL Serverless V1 作為完全載入任務的來源。 AWS DMS 支援 Aurora PostgreSQL Serverless V2 作為完全載入、完全載入和 CDC 以及僅限 CDC 任務的來源。
+ AWS DMS 不支援複寫具有以 coalesce 函數建立之唯一索引的資料表。
+ 如果來源和目標上的主索引鍵定義不相符，複寫結果可能無法預測。
+ 使用平行載入功能時，不支援根據分割或子分割進行資料表分段。如需平行載入的詳細資訊，請參閱[在選取的資料表、檢視和集合使用平行載入](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.md#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.ParallelLoad) 
+ AWS DMS 不支援延遲限制條件。
+ AWS DMS 3.4.7 版支援 PostgreSQL 14.x 作為具有下列限制的來源：
  + AWS DMS 不支援兩個階段遞交的變更處理。
  + AWS DMS 不支援邏輯複寫來串流長時間進行中的交易。
+ AWS DMS 不支援 Amazon RDS Proxy for PostgreSQL 的 CDC 做為來源。
+ 使用不包含主索引鍵資料欄的[來源篩選條件](CHAP_Tasks.CustomizingTasks.Filters.md)時，將不會擷取 `DELETE` 操作。
+ 如果來源資料庫也是另一個第三方複寫系統的目標，則 DDL 變更可能不會在 CDC 期間遷移。因為這種情況可以防止 `awsdms_intercept_ddl` 事件觸發程序遭到觸發。若要解決這種情況，請依照下列方式修改來源資料庫上的觸發程序：

  ```
  alter event trigger awsdms_intercept_ddl enable always;
  ```
+ AWS DMS 不支援複寫對來源資料庫中主索引鍵定義所做的變更。如果在作用中複寫任務期間變更主索引鍵結構，則對受影響資料表的後續變更不會複寫至目標。
+ 在做為指令碼一部分的 DDL 複寫中，每個指令碼的 DDL 命令總數上限為 8192，每個指令碼的行總數上限為 8192。
+ AWS DMS 不支援具體化視觀表。
+ 對於使用僅供讀取複本做為來源的完全載入和 CDC 任務， AWS DMS 無法在僅供讀取複本上建立複寫槽。

## PostgreSQL 的來源資料類型
<a name="CHAP_Source-PostgreSQL-DataTypes"></a>

下表顯示使用 時支援的 PostgreSQL 來源資料類型， AWS DMS 以及與 AWS DMS 資料類型的預設映射。

如需如何檢視從目標映射的資料類型資訊，請參閱您要使用的目標端點一節。

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


|  PostgreSQL 資料類型  |  DMS 資料類型  | 
| --- | --- | 
|  INTEGER  |  INT4  | 
|  SMALLINT  |  INT2  | 
|  BIGINT  |  INT8  | 
|  NUMERIC (p,s)  |  如果精確度是從 0 到 38，則使用 NUMERIC。 如果精確度是 39 或更多，則使用 STRING。  | 
|  DECIMAL(P,S)  |  如果精確度是從 0 到 38，則使用 NUMERIC。 如果精確度是 39 或更多，則使用 STRING。  | 
|  REAL  |  REAL4  | 
|  DOUBLE  |  REAL8  | 
|  SMALLSERIAL  |  INT2  | 
|  SERIAL  |  INT4  | 
|  BIGSERIAL  |  INT8  | 
|  MONEY  |  NUMERIC(38,4) MONEY 資料類型會映射到 SQL Server 的 FLOAT。  | 
|  CHAR  |  WSTRING (1)  | 
|  CHAR(N)  |  WSTRING (n)  | 
|  VARCHAR(N)  |  WSTRING (n)  | 
|  TEXT  |  NCLOB  | 
|  CITEXT  |  NCLOB  | 
|  BYTEA  |  BLOB  | 
|  TIMESTAMP  |  DATETIME  | 
|  TIMESTAMP WITH TIME ZONE  |  DATETIME  | 
|  DATE  |  DATE  | 
|  TIME  |  TIME  | 
|  TIME WITH TIME ZONE  |  TIME  | 
|  INTERVAL  |  STRING (128)：1 YEAR、2 MONTHS、3 DAYS、4 HOURS、5 MINUTES、6 SECONDS  | 
|  BOOLEAN  |  CHAR (5) false 或 true  | 
|  ENUM  |  STRING (64)  | 
|  CIDR  |  STRING (50)  | 
|  INET  |  STRING (50)  | 
|  MACADDR  |  STRING (18)  | 
|  BIT(n)  |  STRING (n)  | 
|  BIT VARYING (n)  |  STRING (n)  | 
|  UUID  |  STRING  | 
|  TSVECTOR  |  CLOB  | 
|  TSQUERY  |  CLOB  | 
|  XML  |  CLOB  | 
|  POINT  |  STRING (255) "(x,y)"  | 
|  LINE  |  STRING (255) "(x,y,z)"  | 
|  LSEG  |  STRING (255) "((x1,y1),(x2,y2))"  | 
|  BOX  |  STRING (255) "((x1,y1),(x2,y2))"  | 
|  PATH  |  CLOB "((x1,y1),(xn,yn))"  | 
|  POLYGON  |  CLOB "((x1,y1),(xn,yn))"  | 
|  CIRCLE  |  STRING (255) "(x,y),r"  | 
|  JSON  |  NCLOB  | 
|  JSONB  |  NCLOB  | 
|  ARRAY  |  NCLOB  | 
|  COMPOSITE  |  NCLOB  | 
|  HSTORE  |  NCLOB  | 
|  INT4RANGE  |  STRING (255)  | 
|  INT8RANGE  |  STRING (255)  | 
|  NUMRANGE  |  STRING (255)  | 
|  STRRANGE  |  STRING (255)  | 

### 使用適用於 PostgreSQL 的 LOB 來源資料類型
<a name="CHAP_Source-PostgreSQL-DataTypes-LOBs"></a>

PostgreSQL 欄大小會影響 PostgreSQL LOB 資料類型到 AWS DMS 資料類型的轉換。若要使用此欄，請採取以下 AWS DMS 資料類型的下列步驟：
+ BLOB：在任務建立時，將**將 LOB 大小限制為以下值**設為**最大 LOB 大小 (KB)** 值。
+ CLOB：複寫處理作為 UTF8 字元的每個字元。因此，尋找資料欄中最長字元文字的長度，此處顯示為 `max_num_chars_text`。使用此長度可指定**將 LOB 大小限制為以下值**的值。如果資料包含 4 位元組的字元，乘以 2 來指定 **Limit LOB size to (將 LOB 大小限制為)** 值 (以位元組為單位)。在此案例中，**Limit LOB size to (將 LOB 大小限制為)** 等於 `max_num_chars_text` 乘以 4。
+ NCLOB：複寫處理作為雙位元組字元的每個字元。因此，尋找資料欄 (`max_num_chars_text`) 中最長字元文字的長度，並乘以 2。您這樣做是為了指定**將 LOB 大小限制為以下值**的值。在此案例中，**Limit LOB size to (將 LOB 大小限制為)** 等於 `max_num_chars_text` 乘以 4。如果資料包含 4 位元組字元，則再次乘以 2。在此案例中，**Limit LOB size to (將 LOB 大小限制為)** 等於 `max_num_chars_text` 乘以 4。