使用 PostgreSQL 資料庫作為 AWS DMS 來源 - AWS Database Migration Service

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

使用 PostgreSQL 資料庫作為 AWS DMS 來源

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

如需有關 AWS DMS 支援作為來源之 PostgreSQL 版本的資訊,請參閱資料來源 AWS DMS

AWS DMS 支援下列資料庫類型的 PostgreSQL:

  • 現場部署資料庫

  • Amazon EC2 執行個體上的資料庫

  • Amazon RDS 資料庫執行個體上的資料庫

  • 以 Amazon Aurora PostgreSQL 相容版本為基礎的資料庫執行個體上的資料庫

  • 以 Amazon Aurora PostgreSQL 相容無伺服器版本為基礎的資料庫執行個體上的資料庫

注意

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

PostgreSQL 來源版本

要使用的 AWS DMS 版本

9.x、10.x、11.x、12.x

使用任何可用的 AWS DMS 版本。

13.x

使用 AWS DMS 3.4.3 版及更高版本。

14.x

使用 AWS DMS 3.4.7 及更高版本。

15.x

使用 AWS DMS 3.5.1 及更高版本。

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

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

若要將 PostgreSQL 資料庫設定為 AWS DMS 來源端點,請執行下列動作:

使用自我管理的 PostgreSQL 資料庫作為 AWS DMS 中的來源

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

使用自我管理的 PostgreSQL 資料庫作為 AWS DMS 來源的先決條件

從自我管理的 PostgreSQL 來源資料庫遷移資料之前,請執行下列動作:

  • 請確定您使用的是 9.4.x 版或更高版本的 PostgreSQL 資料庫。

  • 對於完全載入加上 CDC 任務或僅 CDC 任務,請將超級使用者許可授予針對 PostgreSQL 來源資料庫指定的使用者帳戶。此使用者帳戶需要超級使用者許可,才能存取來源中的複寫特定功能。對於僅完全載入任務,使用者帳戶在資料表上需要 SELECT 許可才能進行遷移。

  • 將 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

注意

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

使用自我管理的 PostgreSQL 資料庫作為 AWS DMS 來源來啟用 CDC

AWS DMS 支援使用邏輯複寫的變更資料擷取 (CDC)。若要啟用自我管理 PostgreSQL 來源資料庫的邏輯複寫,請在 postgresql.conf 組態檔中設定下列參數和值:

  • 設定 wal_level = logical

  • max_replication_slots 設為大於 1 的值。

    應該根據您想要執行的任務數量設定 max_replication_slots 值。例如,若要執行五項任務,您至少需要設定五個插槽。只要任務啟動並保持開啟,插槽立即自動開啟,即使任務不再執行。請務必手動刪除開啟的插槽。請注意,如果 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 文件

如需啟用 CDC 的詳細資訊,請參閱使用邏輯複寫啟用變更資料擷取 (CDC)

使用 AWS 受管的 PostgreSQL 資料庫作為 DMS 來源

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

使用 AWS 受管 PostgreSQL 資料庫作為 DMS 來源的先決條件

從 AWS 受管 PostgreSQL 來源資料庫遷移資料之前,請執行下列動作:

  • 我們建議您將具有 PostgreSQL 資料庫執行個體最基本必要許可的 AWS 使用者帳戶用作為 AWS DMS PostgreSQL 來源端點的使用者帳戶。不建議使用主帳戶。此帳戶必須具有 rds_superuser 角色和 rds_replication 角色。授權來管理邏輯槽和利用邏輯槽來串流資料的 rds_replication 角色

    請務必從您使用之帳戶的主要使用者帳戶建立數個物件。如需有關建立這些物件的資訊,請參閱不使用主要使用者帳戶遷移 Amazon RDS for PostgreSQL 資料庫

  • 如果來源資料庫位於虛擬私有雲端 (VPC) 中,請選取可提供資料庫所在之資料庫執行個體存取的 VPC 安全群組。DMS 複寫執行個體必須這樣做,才能成功連線到來源資料庫執行個體。當資料庫和 DMS 複寫執行個體位於相同的 VPC 中時,請將適當的安全群組新增至其本身的輸入規則。

注意

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

使用 AWS 受管的 PostgreSQL 資料庫執行個體搭配 AWS DMS 啟用 CDC

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

您無法使用 RDS PostgreSQL 僅供讀取複本以進行 CDC (持續複寫)。

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 資料庫

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

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

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

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

不使用主要使用者帳戶遷移 Amazon RDS for PostgreSQL 資料庫

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

注意

如果在來源端點上將 captureDDLs 端點設為 false,您即不必在來源資料庫中建立以下資料表和觸發程序。

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

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

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

  3. 執行以下命令建立資料表 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 );
  4. 執行以下命令建立函數 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; $$;
  5. 登出 OtherThanMaster 帳戶,再以獲指派 rds_superuser 角色的帳戶登入。

  6. 執行以下命令建立事件觸發 awsdms_intercept_ddl

    CREATE EVENT TRIGGER awsdms_intercept_ddl ON ddl_command_end EXECUTE PROCEDURE objects_schema.awsdms_intercept_ddl();
  7. 請確定存取這些事件的所有使用者和角色都具有必要的 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 TABLEALTER TABLEDROP TABLE 陳述式觸發。

使用邏輯複寫啟用變更資料擷取 (CDC)

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

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

注意

REPLICA IDENTITY FULL 支援邏輯解碼外掛程式,但不支援 pglogical 外掛程式。如需詳細資訊,請參閱 pglogical 文件

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

注意

對於邏輯解碼,DMS 會擇一使用 test_decoding 或 pglogical 外掛程式。如果 pglogical 外掛程式在來源 PostgreSQL 資料庫上是可用的狀態,則 DMS 會使用 pglogical 建立複寫插槽,否則將使用 test_decoding 外掛程式。如需 test-decoding 外掛程式的詳細資訊,請參閱 PostgreSQL 文件

如果將資料庫參數 max_slot_wal_keep_size 設為非預設值,且複寫插槽的 restart_lsn 落在目前 LSN 後面的次數超過大小,則 DMS 任務會因必要的 WAL 檔案移除而失敗。

設定 pglogical 外掛程式

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 來源資料庫上啟用邏輯複寫之後,請使用下列步驟設定 pglogical 以與 DMS 搭配使用。

若要在 PostgreSQL 來源資料庫上使用 pglogical 外掛程式,搭配 AWS DMS 進行邏輯複寫
  1. 在來源 PostgreSQL 資料庫上建立 pglogical 擴充功能:

    1. 設定正確的參數:

      • 對於自我管理的 PostgreSQL 資料庫,請設定資料庫參數 shared_preload_libraries= 'pglogical'

      • 對於 Amazon RDS 上的 PostgreSQL 和 Amazon Aurora PostgreSQL 相容版本資料庫,請在相同的 RDS 參數群組中將參數 shared_preload_libraries 設定為 pglogical

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

    3. 在 PostgreSQL 資料庫上,執行命令 (create extension pglogical;)

  2. 執行下列命令來確認 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 載入

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

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

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

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

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

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

  2. 建立新的來源端點,包括下列額外的連線屬性設定:

    slotName=abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef;
  3. 使用主控台、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-mappingsreplication-task-settings 選項會設為與步驟 1 中父項任務相同的值。

    • cdc-start-position 選項會設為起始位置值。若要尋找此起始位置,請查詢來源資料庫上的 pg_replication_slots 檢視,或檢視步驟 1 中父項任務的主控台詳細資訊。如需詳細資訊,請參閱 決定 CDC 原生起點

    若要在使用 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');
  2. 資料庫建立複寫插槽之後,請取得並記下此插槽的 restart_lsnconfirmed_flush_lsn 值:

    select * from pg_replication_slots where slot_name like 'replication_slot_name';

    請注意,在複寫插槽之後建立的 CDC 任務的原生 CDC 開始位置不能早於 confirmed_flush_lsn 值。

    若要取得有關 restart_lsnconfirmed_flush_lsn 的相關資訊,請參閱 pg_replication_slots

  3. 建立 pglogical 節點。

    SELECT pglogical.create_node(node_name := 'node_name', dsn := 'your_dsn_name');
  4. 使用 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);
  5. 將資料表新增至複寫集。

    SELECT pglogical.replication_set_add_table('replication_slot_name', 'schemaname.tablename', true); SELECT pglogical.replication_set_add_table('ireplication_slot_name', 'schemaname.tablename', true);
  6. 建立來源端點時,請依照下列設定額外連線屬性 (ECA)。

    PluginName=PGLOGICAL;slotName=slot_name;

您現在可以使用新的複寫插槽,使用 PostgreSQL 原生起點建立僅限 CDC 的任務。如需 pglogical 外掛程式的詳細資訊,請參閱 pglogical 3.7 文件

使用 AWS DMS 從 PostgreSQL 遷移到 PostgreSQL。

針對從 PostgreSQL 以外的資料庫引擎遷移到 PostgreSQL 資料庫時,AWS DMS 一直幾乎都是最佳的遷移工具。但是,從 PostgreSQL 資料庫遷移到 PostgreSQL 資料庫時,PostgreSQL 工具會更有效率。

使用 PostgreSQL 原生工具遷移資料

在下列情況中,建議您使用 PostgreSQL 資料庫遷移工具,例如 pg_dump

  • 您有一項從來源 PostgreSQL 資料庫遷移到目標 PostgreSQL 資料庫的同質遷移。

  • 您想要遷移整個資料庫。

  • 原生工具可讓您以最短的停機時間來遷移資料。

pg_dump 公用程式會使用 COPY 命令,建立 PostgreSQL 資料庫的結構描述和資料傾印。pg_dump 產生的傾印指令碼會將資料載入相同名稱的資料庫中,並重新建立資料表、索引和外部索引鍵。若要將資料還原至不同名稱的資料庫,請使用 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

使用 DMS 將資料從 PostgreSQL 遷移至 PostgreSQL

例如,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 空間資料類型

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

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

對於 PostgreSQL 至 PostgreSQL 同質遷移,AWS DMS 支援 PostGIS 幾何和地理 (全球座標) 資料物件類型和子類型的移轉,如下所示:

  • POINT

  • LINESTRING

  • POLYGON

  • MULTIPOINT

  • MULTILINESTRING

  • MULTIPOLYGON

  • GEOMETRYCOLLECTION

從 PostgreSQL 來源資料庫移除 AWS DMS 成品

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

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

drop event trigger awsdms_intercept_ddl;

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

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

使用 PostgreSQL 資料庫作為 DMS 來源時的其他組態設定

從 PostgreSQL 資料庫遷移資料時,您有兩種方式可以新增額外的組態設定:

  • 您可以在額外連線屬性新增值,擷取 DDL 事件和指定要建立操作 DDL 資料庫成品的結構描述。如需詳細資訊,請參閱 使用 PostgreSQL 做為 DMS 來源時的端點設定和額外連線屬性 (ECA)

  • 您可以覆寫連線字串參數。請選擇下列其中一個選項:

    • 指定內部 AWS DMS 參數。因為很少需要這種參數,所以不會在使用者介面公開。

    • 指定特定資料庫用戶端的傳遞 (passthru) 值。AWS DMS 包含傳遞到資料庫用戶端之連線字串中的傳遞參數。

  • 透過使用 PostgreSQL 9.4 版及更新版本中的資料表層級參數 REPLICA IDENTITY,您可以控制在預寫日誌 (WAL) 中寫入的資訊。特別是,其會對於識別已更新或刪除的資料列的 WALS 執行此操作。REPLICA IDENTITY FULL 會記錄資料列中所有資料欄的舊值。將 REPLICA IDENTITY FULL 用於每個資料表時請小心,因為 FULL 可能產生額外不必要的 WAL 數量。如需詳細資訊,請參閱 ALTER TABLE-REPLICA IDENTITY

使用 MapBooleanAsBoolean PostgreSQL 端點設定

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

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

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

由於 MySQL 沒有 BOOLEAN 型別,因此在將 BOOLEAN 資料遷移到 MySQL 時應使用轉換規則 (而不是此設定)。

使用 PostgreSQL 做為 DMS 來源時的端點設定和額外連線屬性 (ECA)

您可以使用端點設定和額外的連線屬性 (ECA) 來設定 PostgreSQL 來源資料庫。您可以在使用AWS DMS主控台建立來源端點時指定端點設定,或使用中的create-endpoint命令以 --postgre-sql-settings '{"EndpointSetting": "value", ...}' JSON 語法指定端點設定。AWS CLI

下表顯示可與 PostgreSQL 作為來源搭配使用的端點設定和 ECA。

屬性名稱 描述

CaptureDDLs

若要擷取 DDL 事件,AWS DMS 會在任務開始時,於 PostgreSQL 資料庫中建立各種成品。您稍後可以移除這些成品,如從 PostgreSQL 來源資料庫移除 AWS DMS 成品中所述。

如果這個值設定為 false,您不必在來源資料庫中建立資料表或觸發程序。

已擷取串流的 DDL 事件。

預設值:true

有效值:true/false

範例:--postgre-sql-settings '{"CaptureDDLs": true}'

ConsumeMonotonicEvents

用於控制複寫具有重複日誌序號 (LSN) 之整體交易的方式。如果此參數是 false,則會在目標上消耗並複寫具有重複 LSN 的事件。如果此參數是 true,則只會複寫第一個事件,而不會在目標上消耗或複寫具有重複 LSN 的事件。

預設值:false

有效值:false/true

範例:--postgre-sql-settings '{"ConsumeMonotonicEvents": true}'

DdlArtifactsSchema

設定操作 DDL 資料庫成品建立所用的結構描述。

預設值:公有

有效值:字串

範例:--postgre-sql-settings '{"DdlArtifactsSchema": "xyzddlschema"}'

ExecuteTimeout

設定 PostgreSQL 執行個體的用戶端陳述式逾時,以秒為單位。預設值為 60 秒。

範例:--postgre-sql-settings '{"ExecuteTimeout": 100}'

FailTasksOnLobTruncation

當設為 true 時,如果 LOB 資料行的實際大小大於指定的 LobMaxSize,此值會造成任務失敗。

如果任務設為有限 LOB 模式,且此選項設為 true,則任務會失敗,而不是截斷 LOB 資料。

預設值:false

有效值:布林值

範例:--postgre-sql-settings '{"FailTasksOnLobTruncation": true}'

fetchCacheSize

此額外連線屬性 (ECA) 會設定游標在完全載入操作期間將擷取的資料列數目。視複寫執行個體中的可用資源而定,您可以調整為更高或更低的值。

預設值:10000

有效值:數值

ECA 範例:fetchCacheSize=10000;

HeartbeatFrequency

設定 WAL 活動訊號頻率 (以分鐘為單位)。

預設值:5

有效值:數值

範例:--postgre-sql-settings '{"HeartbeatFrequency": 1}'

HeartbeatSchema

設定建立活動訊號成品的結構描述。

預設值:public

有效值:字串

範例:--postgre-sql-settings '{"HeartbeatSchema": "xyzheartbeatschema"}'

MapJsonbAsClob

依預設,AWS DMS 會將 JSOB 對應至 NCLOB。您可以指定 MapJsonbAsClob 讓 PostgreSQL 將 JSONB 類型遷移為 CLOB。

範例:--postgre-sql-settings='{"MapJsonbAsClob": "true"}'

MapLongVarcharAs

根據預設 AWS DMS 會將 VARCHAR 對應至 WSTRING。您可以指定 MapLongVarcharAs 讓 PostgreSQL 將 VARCHAR(N) 類型 (其中 N 大於 16387) 遷移至下列類型:

  • WSTRING

  • CLOB

  • NCLOB

範例:--postgre-sql-settings='{"MapLongVarcharAs": "CLOB"}'

MapUnboundedNumericAsString

此參數會將具有無界限 NUMERIC 資料類型的資料欄視為 STRING,以便在不遺失數值精確度的情況下成功遷移。此參數僅適用於從 PostgreSQL 來源複寫到 PostgreSQL 目標,或是具有 PostgreSQL 相容性的資料庫。

預設值:false

有效值:false/true

範例:--postgre-sql-settings '{"MapUnboundedNumericAsString": true}'

由於使用此參數會進行從數值到字串再回到數值的轉換,因此可能會導致某些複寫效能降低。DMS 3.4.4 及更新版本支援此參數

注意

MapUnboundedNumericAsString 只能在 PostgreSQL 來源端點和目標端點中同時使用。

在 CDC 期間,在來源 PostgreSQL 端點上使用 MapUnboundedNumericAsString 會將精確度限制為 28 位。在目標端點上使用 MapUnboundedNumericAsString 將以精確度 28 位小數點 6 位遷移資料。

請勿將 MapUnboundedNumericAsString 搭配非 PostgreSQL 目標使用。

PluginName

指定用於建立複寫位置的外掛程式。

有效值:pglogicaltest_decoding

範例:--postgre-sql-settings '{"PluginName": "test_decoding"}'

SlotName

針對 PostgreSQL 來源執行個體的 CDC 負載,設定先前所建邏輯複寫插槽的名稱。

與 AWS DMS API CdcStartPosition 請求參數搭配使用時,此屬性也會啟用原生 CDC 起始點。DMS 會在開始 CDC 載入任務之前,驗證指定的邏輯複寫位置是否存在。它也會驗證該任務是否以 CdcStartPosition 的有效設定建立。如果指定的位置不存在或任務沒有有效的 CdcStartPosition 設定,則 DMS 會引發錯誤。

如需設定 CdcStartPosition 請求參數的詳細資訊,請參閱決定 CDC 原生起點。如需使用 CdcStartPosition 的詳細資訊,請參閱 AWS Database Migration Service API 參考中的 CreateReplicationTaskStartReplicationTaskModifyReplicationTask API 操作的文件。

有效值:字串

範例:--postgre-sql-settings '{"SlotName": "abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef"}'

unboundedVarcharMaxSize

這個「額外連線屬性」(ECA) 會定義為 VarChar 沒有最大長度說明字的類型的資料欄大小上限。預設值為 8000 個位元組。最大值為 10485760 個位元組。

使用 PostgreSQL 資料庫作為 DMS 來源的限制

使用 PostgreSQL 做為 AWS DMS 來源時,有下列限制:

  • 以 Amazon RDS for PostgreSQL 10.4 或 Amazon Aurora PostgreSQL 10.4 作為來源或目標時,AWS DMS 便無法運作。

  • 擷取的資料表必須有主索引鍵。如果資料表沒有主索引鍵,AWS DMS 會忽略該資料表的 DELETE 和 UPDATE 記錄操作。如需因應措施,請參閱使用邏輯複寫啟用變更資料擷取 (CDC)

    備註:我們不建議在沒有主索引鍵/唯一索引的情況下進行遷移,否則應考量其他限制,例如「不」批次套用功能、完整 LOB 功能、資料驗證,以及無法有效率地複寫至 Redshift 目標。

  • AWS DMS 忽略更新主索引鍵區段的嘗試。在這些情況下,目標會將更新識別為一個未更新任何資料列的項目。不過,因為無法預測在 PostgreSQL 中更新主索引鍵的結果,所以例外狀況資料表中不會寫入任何記錄。

  • AWS DMS 不支援 Start Process Changes from Timestamp (從時間戳記開始程序變更) 執行選項。

  • AWS DMS 不會複寫由分割或子分割操作 (ADDDROPTRUNCATE) 所產生的變更。

  • 複寫同名但每個名稱大小寫不盡相同的多份資料表 (例如 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_decoding 輸出外掛程式會安裝在來源端點。您可以在 PostgreSQL contrib 套件找到這個外掛程式。如需 test-decoding 外掛程式的詳細資訊,請參閱 PostgreSQL 文件

  • AWS DMS 不支援變更處理以設定和取消設定資料行預設值 (在 ALTER TABLE 陳述式中使用 ALTER COLUMN SET DEFAULT 子句)。

  • AWS DMS 不支援變更處理以設定資料行可為 Null (在 ALTER TABLE 陳述式中使用 ALTER COLUMN [SET|DROP] NOT NULL 子句)。

  • 啟用邏輯複寫時,每個交易保留在記憶體中的變更數目上限為 4 MB。之後,變更會溢出到磁碟。結果 ReplicationSlotDiskUsage 會增加,restart_lsn 在交易完成或中止並且復原完成前不會有所進展。由於這個交易很長,復原所需時間可能很久。因此,當啟用邏輯複寫時,請避免長時間執行的交易或許多子交易。相反地,請將交易分解為幾個較小的交易。

    在 Aurora PostgreSQL 版本 13 及更新版本上,您可以調整logical_decoding_work_mem參數以控制 DMS 何時洩漏將資料變更為磁碟。如需詳細資訊,請參閱 溢出 Aurora 中的檔案

  • 具有 ARRAY 資料類型的資料表必須有主索引鍵。缺少主索引鍵之 ARRAY 資料類型的資料表會在完全載入間暫停。

  • AWS DMS 不支援複寫分割資料表。偵測到分割資料表時,會發生下列情況:

    • 端點會報告父資料表和子資料表清單。

    • AWS DMS 在目標上建立的資料表,是一般資料表加上和所選資料表一樣的屬性。

    • 如果來源資料庫的父資料表和其子資料表具有相同的主索引鍵值,即會產生「重複的金鑰」錯誤。

  • 若要將分割資料表從 PostgreSQL 來源複寫到 PostgreSQL 目標,請先在目標手動建立父資料表和子資料表。然後,要另外定義任務,以複寫到那些資料表。在這種情況下,要將任務組態設定為先截斷再載入

  • PostgreSQL NUMERIC 資料類型的大小不固定。根據預設,當傳輸資料類型為 NUMERIC 但沒有精確度和小數位數的資料時,DMS 使用 NUMERIC(28,6) (精確度為 28 和小數位數為 6)。舉例來說,來源的值 0.611111104488373 會轉換為 PostgreSQL 目標的 0.611111。

  • AWS DMS 僅支援 Aurora PostgreSQL 無伺服器 V1 作為完全載入任務的來源。AWS DMS 支援 Aurora PostgreSQL 無伺服器 V2 作為完全載入、完全載入和 CDC 以及僅限 CDC 任務的來源。

  • AWS DMS 不支援使用合併函數建立的唯一索引對資料表進行複寫。

  • 使用 LOB 模式時,來源資料表和對應的目標資料表都必須具有相同的主索引鍵。如果其中一個資料表沒有主索引鍵,DELETE 和 UPDATE 記錄操作的結果將是不可預測的。

  • 使用平行載入功能時,不支援根據分割或子分割進行資料表分段。如需平行載入的詳細資訊,請參閱在選取的資料表、檢視和集合使用平行載入

  • AWS DMS 不支援延遲限制。

  • AWS DMS 3.4.7 版支援 PostgreSQL 14.x 作為來源,但有下列限制:

    • AWS DMS 不支援兩階段遞交的變更處理。

    • AWS DMS 不支援邏輯複寫以串流處理進行中的長時間交易。

  • AWS DMS 不支援將 CDC 作為 Amazon RDS Proxy for PostgreSQL 的來源。

  • 使用不包含主索引鍵資料欄的來源篩選條件時,將不會擷取 DELETE 操作。

  • 如果來源資料庫也是另一個第三方複寫系統的目標,則 DDL 變更可能不會在 CDC 期間遷移。因為這種情況可以防止 awsdms_intercept_ddl 事件觸發程序遭到觸發。若要解決這種情況,請依照下列方式修改來源資料庫上的觸發程序:

    alter event trigger awsdms_intercept_ddl enable always;
  • AWS DMS 不支援將 CDC 適用於 PostgreSQL 的 Amazon RDS Multi-AZ 資料庫叢集作為來源,因為 RDS for PostgreSQL Multi-AZ 資料庫叢集不支援邏輯複寫。

PostgreSQL 的來源資料類型

下表顯示使用 AWS DMS 和映射至 AWS DMS 的資料類型時,受支援的 Oracle 來源資料類型。

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

如需 AWS DMS 資料類型的詳細資訊,請參閱AWS Database Migration Service 的資料類型

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

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 來源資料類型

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。