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

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

使用 PostgreSQL 資料庫做為 AWS DMS 的來源

您可以使用 PostgreSQL 遷移一或多個 AWS DMS 資料庫的資料。使用 PostgreSQL 資料庫做為來源,您可以將資料遷移到另一個 PostgreSQL 資料庫或其他受支援的資料庫。AWS DMS 支援 PostgreSQL 版本 9.4 和更新版本 (適用於 9.x 版)、10.x 版、11.x 版和 12.x 版資料庫,做為這些資料庫類型的來源:

  • 現場部署資料庫

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

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

  • 資料庫執行個體上具備 Amazon Aurora 相容性的資料庫PostgreSQL

注意
  • AWS DMS 不使用 Amazon RDS for PostgreSQL 10.4 或 Amazon Aurora (PostgreSQL 10.4) 做為來源或目標。

  • PostgreSQL 版本 12.x 支援在 AWS DMS 版本 3.3.1 和更新版本中做為來源。

  • 只在 PostgreSQL 3.3.1 版和更新版本中支援 AWS DMS 11.x 版做為來源。您可以使用 PostgreSQL 9.4 版和更新版本 (9.x 版),以及 10.x 版做為任何 DMS 版本中的來源。

  • PostgreSQL 10.x 版包含舊版許多函數名稱和資料夾名稱的變更。

    在某些案例中,您可能會使用 PostgreSQL 10.x 版資料庫做為來源,以及早於 3.3.1 的 AWS DMS 版本。在這些情況下,請參閱使用 PostgreSQL 10.x 版做為 AWS DMS 的來源,以取得準備您的資料庫做為 AWS DMS 來源的相關資訊。

    注意

    如果您使用 PostgreSQL 10.x 資料庫做為 AWS DMS 3.3.1 版或更新版本的來源,請不要針對舊版 AWS DMS 所需的來源 10.x 資料庫執行這些準備。

如需使用支援之 AWS DMS 來源版本的 PostgreSQL 版本需求摘要,請參考下表。

PostgreSQL 來源版本

要使用的 AWS DMS 版本

9.x

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

10.x

如果您使用 3.3.1 以前的 AWS DMS 版本,請使用 PostgreSQL 中所述的包裝函數來準備 使用 PostgreSQL 10.x 版做為 AWS DMS 的來源 來源。

如果您使用 AWS DMS 3.3.1 版或更新版本,請不要建立這些包裝函式函數。您可以使用 PostgreSQL 來源,無需進行任何額外的準備。

11.x

使用 AWS DMS 3.3.1 版本。

12.x

使用 AWS DMS 3.3.3 版。

您可以使用 SSL 來加密 PostgreSQL 端點與複寫執行個體之間的連接。如需搭配 PostgreSQL 端點使用 SSL 的詳細資訊,請前往 將 SSL 與 AWS Database Migration Service 搭配使用

對於 AWS 上從 PostgreSQL 資料庫到 PostgreSQL 資料庫的同質遷移,以下為 true:

  • 來源上的 JSONB 資料行會遷移到目標上的 JSONB 資料行。

  • JSON 資料行遷移到目標的 JSON 資料行。

  • HSTORE 資料行遷移到目標的 HSTORE 資料行。

對於以 PostgreSQL 做為來源的統一遷移和以不同資料庫引擎做為目標,情形是不同的。在這種情況下,JSONB、JSON 和 HSTORE 資料行都會轉換成 NCLOB 的 AWS DMS 中繼類型,然後轉譯成目標上對應的 NCLOB 欄類型。在這種情況下,AWS DMS 會將 JSONB 資料視為 LOB 資料行處理。在遷移的完全載入階段,目標資料行必須可為 null。

AWS DMS 支援具有主索引鍵之 PostgreSQL 資料表的變更資料擷取 (CDC)。如果資料表沒有主索引鍵,則預先寫入日誌 (WAL) 不包含資料庫資料列之前的映像,AWS DMS 也無法更新資料表。

當資料庫執行個體設定為使用邏輯複寫時,AWS DMS 支援 Amazon RDS 資料庫的 CDC。PostgreSQL 支援 Amazon RDS 資料庫執行個體 9.4.9 版和更新版本以及 9.5.4 版和更新版本的邏輯複寫。PostgreSQL 也支援使用 2.2.0 和 2.2.1 版及具備 Amazon RDS 10.6 相容性的 Amazon Aurora 資料庫執行個體邏輯複寫。PostgreSQL

如需使用 PostgreSQL 資料庫和 AWS DMS 的其他詳細資訊,請參考以下章節。

使用 PostgreSQL 從 PostgreSQL 遷移到AWS DMS

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

我們建議您在下列條件下使用 PostgreSQL 資料庫遷移工具,例如 pg_dump:

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

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

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

公用程式會使用 COPY 命令來建立 pg_dump 資料庫的結構描述和資料傾印。PostgreSQLpg_dump 產生的傾印指令碼會將資料載入相同名稱的資料庫中,並重新建立資料表、索引和外部索引鍵。您可以使用 pg_restore 命令和 -d 參數將資料還原至不同名稱的資料庫。

如需將 PostgreSQL 資料庫匯入至 Amazon RDS 或 PostgreSQL 的詳細資訊,請前往 Amazon Aurora 相容於 PostgreSQL。https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.Procedural.Importing.html

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

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

在來源資料庫支援、但在目標資料庫上不支援的資料類型可能無法順利遷移。如果該資料類型不明,則 AWS DMS 會將一些資料類型串流為字串。有些資料類型(如 XML 和 JSON),小型檔案移轉會成功,但大型文件會失敗。

下表顯示來源 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
TIMESTAMP(Z) X
DATE X
TIME X
TIME (z) 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 空間資料類型
注意

如果 PostgreSQL NUMERIC(p,) 資料類型不指定任何精確度和小數位數,AWS DMS 預設會使用 28 的精確度和 6 的小數位數:NUMERIC(28,6)。例如,來源的 0.611111104488373 值會轉換成 PostgreSQL 目標上的 0.6111。

遷移 PostGIS 空間資料類型

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

遷移 PostgreSQL 空間資料物件之前,請確定 PostGIS Plugin 已可在全域層級使用。這樣做可確保 AWS DMS 為 PostgreSQL 目標資料庫執行個體建立確切的來源空間資料行。

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

  • POINT

  • LINESTRING

  • POLYGON

  • MULTIPOINT

  • MULTILINESTRING

  • MULTIPOLYGON

  • GEOMETRYCOLLECTION

使用 PostgreSQL 資料庫做為 AWS DMS 來源的事前準備

若要讓 PostgreSQL 資料庫成為 AWS DMS 的來源,請執行下列動作:

  • 使用 PostgreSQL 資料庫,其為 9.4.x 版或更新版本。

  • 若為完全載入加上變更資料擷取 (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 代表以主機為基礎的身份驗證。) 此檔案傳統上存放在資料庫叢集的資料資料夾中。

  • postgresql.conf 組態檔案中設定下列參數和值:

    • 設定 wal_level = logical

    • max_replication_slots 設為大於 1 的值。

      max_replication_slots 值應該根據您想要執行的任務數量設定。例如,執行 5 項任務,您至少需要設定 5 個插槽。只要任務啟動並保持開啟,插槽立即自動開啟,即使任務不再執行。您需要手動刪除開啟的插槽。

    • max_wal_senders 設為大於 1 的值。

      max_wal_senders 參數設定可以同時執行的任務數量。

    • 設定 wal_sender_timeout =0

      wal_sender_timeout 參數終止失效超過指定毫秒數的複寫連線。雖然預設值是 60 秒,但建議您將此參數設為零,停用逾時機制。

    注意

    部分參數只能在伺服器開始時設定;在組態檔案中,對參數項目所做的任何變更,都將被忽略,直到伺服器重新開機為止。如需詳細資訊,請參考 PostgreSQL 資料庫文件。

  • 透過在 idle_in_transaction_session_timeout 9.6 版和更新版本中使用參數 PostgreSQL,可能會導致 idle 交易逾時並失敗。有些 AWS DMS 交易在 AWS DMS 引擎再次使用它們前,會閒置一段時間。使用 AWS DMS 時不要結束閒置交易。

使用 PostgreSQL 資料庫做為 AWS DMS 來源的安全需求

使用 PostgreSQL 做為來源時,唯一的安全需求是指定的使用者帳號必須是 PostgreSQL 資料庫中的已登記使用者。

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

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

  • AWS DMS 不會針對來源或目標 Amazon RDS 10.4 或 PostgreSQL 10.4 使用 Amazon Aurora PostgreSQL。

  • 擷取的資料表必須有主索引鍵。如果資料表沒有主索引鍵,AWS DMS 會忽略該資料表的 DELETE 和 UPDATE 記錄操作。

  • 不支援使用時區類型資料行的時間戳記。

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

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

  • AWS DMS 支援 Amazon RDS 的完全載入和變更處理。PostgreSQL 如需如何準備 PostgreSQL 資料庫執行個體以及使用 CDC 進行設定的資訊,請前往 設定 Amazon RDS PostgreSQL 資料庫執行個體做為來源

  • 複寫同名但每個名稱大小寫不盡相同的多份資料表 (例如 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; $$;
  • 目前,boolean 來源中的 PostgreSQL 資料類型會移轉至 SQL Server 目標,做為具有不一致值的 bit 資料類型。因應措施是,預先建立具有欄之 VARCHAR(1) 資料類型的資料表 (或讓 AWS DMS 建立資料表)。然後讓下游處理將「F」視為 False,將「T」視為 True。

  • AWS DMS 不支援 TRUNCATE 操作的變更處理。

  • OID LOB 資料類型不會遷移到目標。

  • 如果您的來源是現場部署或 PostgreSQL 執行個體上的 Amazon EC2 資料庫,請確保 test_decoding 輸出 plugin 已安裝在來源端點上。您可以在 Postgres contrib 套件找到這個外掛程式。如需測試解碼附加模組的詳細資訊,請查看 文件PostgreSQL。

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

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

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

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

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

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

注意

若要將分割資料表從 PostgreSQL 來源複寫到 PostgreSQL 目標,您必須先手動在目標上建立父資料表和子資料表。然後,您要另外定義任務,複寫到這些資料表。在這種情況下,您要將任務組態設定為 Truncate before loading (先截斷再載入)

注意

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

設定 Amazon RDS PostgreSQL 資料庫執行個體做為來源

您可以使用適用於 Amazon RDS 資料庫執行個體或僅供讀取複本的 PostgreSQL 做為 AWS DMS 來源。您可以使用資料庫執行個體來進行完整載入任務,以及持續複寫來進行變更資料擷取 (CDC)。僅供讀取複本只能用於完整載入工作,而不能用於 CDC。

您可以使用 PostgreSQL 資料庫執行個體的 AWS 主要使用者帳號,做為 PostgreSQL 來源端點的使用者帳號。AWS DMS主要使用者帳戶擁有能讓它設定 CDC 所需要的角色。如果您使用主要使用者帳戶以外的帳戶,則此帳戶必須有 rds_superuser 角色和 rds_replication 角色。rds_replication 角色會授權來管理邏輯槽和利用邏輯槽來串流資料。

如果資料庫執行個體不使用主要使用者帳戶,您必須從主要使用者帳戶為您要使用的帳戶建立數個物件。如需建立所需物件的資訊,請參閱遷移 Amazon RDS 資料庫的 PostgreSQL,而不使用主要使用者帳號

使用 CDC 搭配 RDS for PostgreSQL 資料庫執行個體

您可以使用 PostgreSQL 的原生邏輯複寫功能,在 Amazon RDS 資料庫執行個體的資料庫遷移期間實現 CDC。PostgreSQL此方法可以減少停機時間,並確保目標資料庫與來源 PostgreSQL 資料庫同步。Amazon RDS 支援 PostgreSQL 資料庫執行個體 9.4.9 版和更新版本以及 9.5.4 版和更新版本的邏輯複寫。

注意

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

讓 RDS PostgreSQL 資料庫執行個體進行邏輯複寫

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

    如果您使用主要使用者帳戶以外的帳戶,您必須從主帳戶為您要使用的帳戶建立數個物件。如需更多詳細資訊,請參閱「遷移 Amazon RDS 資料庫的 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 參數設為 0。將此參數設為 0 可防止 PostgreSQL 終止非作用中的複寫連接超過指定的逾時。在 AWS DMS 遷移資料時,複寫連線持續的時間需要超過指定的逾時。

  4. 使用 PostgreSQL 做為來源的原生 CDC 起點。若要執行此作業,請在建立端點時將 slotName 額外連接屬性設定為現有邏輯複寫插槽的名稱。此邏輯複寫插槽會保留從建立端點時開始的持續變更,因此它支援從前一個時間點進行複寫。

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

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

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

使用原生 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 DMS API 或 CLI 來建立新的僅 CDC 任務。例如,使用 CLI,您可以執行以下 create-replication-task 命令。

    AWS DMS 目前不支援使用主控台透過原生起點建立 CDC 任務。

    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 原生起點」。

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

遷移 Amazon RDS 資料庫的 PostgreSQL,而不使用主要使用者帳號

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

注意

如果在來源端點上將 captureDDLs 額外連線屬性設為 N,您即不必在來源資料庫中建立以下資料表和觸發。

請使用下列程序建立這些物件。在本程序中,主帳戶以外的使用者帳戶稱為 NoPriv 帳戶。

建立物件

  1. 選擇要建立物件的結構描述。預設結構描述為 public。 確認結構描述已存在,而且可供 NoPriv 帳號存取。

  2. 使用 PostgreSQL 登入 NoPriv 資料庫執行個體。

  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') 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. 登出 NoPriv 帳戶,再以獲指派 rds_superuser 角色的帳戶登入。

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

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

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

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

若要擷取 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 資料庫做為 AWS DMS 來源時的其他組態設定

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

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

  • 您可以覆寫連線字串參數。如果需要執行下列兩項作業的其中一項,請選取此選項:

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

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

  • 9.4 版和更新版本中的資料表層級參數 REPLICATE IDENTITY 可讓您控制寫入至預先寫入 (WAL) 的資訊。PostgreSQL尤其是,WALs 可辨識更新或除名的資料列。REPLICATE IDENTITY FULL 會記下資料列中所有資料欄的舊值。請對每個資料表謹慎使用 REPLICATE IDENTITY FULL,因為 FULL 會額外建立不必要的 WALs 數量。

使用 PostgreSQL 10.x 版做為 AWS DMS 的來源

PostgreSQL 10.x 版資料庫包含舊版 PostgreSQL 許多函數名稱和資料夾名稱的變更。在使用早於 3.3.1 的 AWS DMS 版本時,這些變更讓某些遷移動作與舊版不相容。

注意

如果您使用 PostgreSQL 10.x 資料庫做為 AWS DMS 3.3.1 或更新版本的來源,請不要執行以下所述的準備。您可以使用 PostgreSQL 來源,無需進行任何額外的準備。

由於大多數的名稱變更流於表面,所以 AWS DMS 建立了包裝函數,讓 AWS DMS 使用 PostgreSQL 10.x 版。包裝函數的優先順序高於 pg_catalog 中的函數。 此外,我們可確保現有結構描述的結構描述可見性不會變更,我們不會覆寫任何其他系統分類函數 (例如使用者定義的函數)。

若要在執行任何遷移任務之前使用這些包裝函數,請使用您用來建立來源端點的相同 AWS DMS 使用者帳號 (user_name)。若要定義並將這些包裝函數與此帳號建立關聯,請在來源 PostgreSQL 資料庫上執行以下 SQL 程式碼。

BEGIN; CREATE SCHEMA IF NOT EXISTS fnRenames; CREATE OR REPLACE FUNCTION fnRenames.pg_switch_xlog() RETURNS pg_lsn AS $$ SELECT pg_switch_wal(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_xlog_replay_pause() RETURNS VOID AS $$ SELECT pg_wal_replay_pause(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_xlog_replay_resume() RETURNS VOID AS $$ SELECT pg_wal_replay_resume(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_current_xlog_location() RETURNS pg_lsn AS $$ SELECT pg_current_wal_lsn(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_is_xlog_replay_paused() RETURNS boolean AS $$ SELECT pg_is_wal_replay_paused(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_xlogfile_name(lsn pg_lsn) RETURNS TEXT AS $$ SELECT pg_walfile_name(lsn); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_last_xlog_replay_location() RETURNS pg_lsn AS $$ SELECT pg_last_wal_replay_lsn(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_last_xlog_receive_location() RETURNS pg_lsn AS $$ SELECT pg_last_wal_receive_lsn(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_current_xlog_flush_location() RETURNS pg_lsn AS $$ SELECT pg_current_wal_flush_lsn(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_current_xlog_insert_location() RETURNS pg_lsn AS $$ SELECT pg_current_wal_insert_lsn(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_xlog_location_diff(lsn1 pg_lsn, lsn2 pg_lsn) RETURNS NUMERIC AS $$ SELECT pg_wal_lsn_diff(lsn1, lsn2); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_xlogfile_name_offset(lsn pg_lsn, OUT TEXT, OUT INTEGER) AS $$ SELECT pg_walfile_name_offset(lsn); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_create_logical_replication_slot(slot_name name, plugin name, temporary BOOLEAN DEFAULT FALSE, OUT slot_name name, OUT xlog_position pg_lsn) RETURNS RECORD AS $$ SELECT slot_name::NAME, lsn::pg_lsn FROM pg_catalog.pg_create_logical_replication_slot(slot_name, plugin, temporary); $$ LANGUAGE SQL; ALTER USER user_name SET search_path = fnRenames, pg_catalog, "$user", public; -- DROP SCHEMA fnRenames CASCADE; -- ALTER USER PG_User SET search_path TO DEFAULT; COMMIT;
注意

如果您未在適用於 3.3.1 版本以前的 PostgreSQL 10.x 資料庫上執行此準備程式碼,將會看到如下錯誤。AWS DMS

2018-10-29T02:57:50 [SOURCE_CAPTURE ]E: RetCode: SQL_ERROR SqlState: 42703 NativeError: 1 Message: ERROR: column "xlog_position" does not exist;, No query has been executed with that handle [1022502] (ar_odbc_stmt.c:3647)

將您的 AWS DMS 版本升級至 3.3.1 或更新版本之後,請依照以下步驟進行:

  1. 從您用來設定來源 fnRenames 10.x 組態搜尋路徑的 ALTER USER 陳述式中移除 PostgreSQL 參考。

  2. 删除您 fnRenames 資料庫的 PostgreSQL 結構描述。

如果您在升級之後未依照這些步驟進行,請在存取 fnRenames 結構描述時,參閱日誌中的下列錯誤。

RetCode: SQL_ERROR SqlState: 42703 NativeError: 1 Message: ERROR: column "lsn" does not exist;

如果 AWS DMS 是使用資料庫的非主要使用者帳號,則您也需要設定特定許可,才能使用來源 PostgreSQL 10.x 資料庫來存取這些包裝函數。若要設定這些權限,請執行下列授權。

GRANT USAGE ON SCHEMA fnRenames TO dms_superuser; GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA fnRenames TO dms_superuser;

如需使用非主要使用者帳號搭配來源 PostgreSQL 10.x 資料庫的詳細資訊,請前往 遷移 Amazon RDS 資料庫的 PostgreSQL,而不使用主要使用者帳號

使用 PostgreSQL 做為 AWS DMS 來源時的額外連接屬性

您可以使用額外的連接屬性來設定您的 PostgreSQL 來源。您要在建立來源端點時指定這些設定。如果您有多個連線屬性設定,請使用分號 (無額外空格) 分隔這些設定 (如 oneSetting;thenAnother)。

下表顯示在使用 PostgreSQL 做為 AWS DMS 來源時可使用的額外連接屬性。

屬性名稱 描述

captureDDLs

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

如果這個值設為 N,您不必在來源資料庫中建立資料表或觸發。如需更多詳細資訊,請參閱「遷移 Amazon RDS 資料庫的 PostgreSQL,而不使用主要使用者帳號」。

已擷取串流的 DDL 事件。

預設值:Y

有效值:Y/N (是/否)

範例:captureDDLs=Y;

ddlArtifactsSchema

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

預設值:公有

有效值:字串

範例:ddlArtifactsSchema=xyzddlschema;

failTasksOnLobTruncation

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

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

預設值:false

有效值:布林值

範例:failTasksOnLobTruncation=true;

executeTimeout

設定 PostgreSQL 執行個體的 Client 陳述式逾時 (以秒為單位)。預設值為 60 秒。

範例:executeTimeout=100;

slotName

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

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

如需 DMS 如何使用邏輯複寫插槽以開始 PostgreSQL CDC 載入的詳細資訊,請前往使用 CDC 搭配 RDS for PostgreSQL 資料庫執行個體。如需設定 CdcStartPosition 請求參數的詳細資訊,請參閱決定 CDC 原生起點。如需使用 CdcStartPosition 的詳細資訊,請參閱 AWS Database Migration Service API ReferenceCreateReplicationTaskStartReplicationTaskModifyReplicationTask API 操作的文件。

有效值:字串

範例:slotName=abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef;

PostgreSQL 的來源資料類型

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

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

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

PostgreSQL 資料類型

AWS 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

TIMESTAMP

TIMESTAMP (z)

TIMESTAMP

TIMESTAMP 帶時區

不支援

DATE

DATE

TIME

TIME

TIME (z)

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 資料欄大小會影響 PostgreSQL LOB 資料類型到 AWS DMS 資料類型的轉換。若要使用此欄,請採取以下 AWS DMS 資料類型的下列步驟:

  • BLOB – 在任務建立時設定 Limit LOB size to (將 LOB 大小限制為) Maximum LOB size (KB) (最大 LOB 大小 (KB)) 值。

  • CLOB – 複寫處理做為 UTF8 字元的每個字元。因此,尋找資料欄中最長字元文字的長度 (此處顯示為 max_num_chars_text),並使用它來指定 Limit LOB size to (將 LOB 大小限制為) 的值。如果資料包含 4 位元組的字元,乘以 2 來指定 Limit LOB size to (將 LOB 大小限制為) 值 (以位元組為單位)。在此案例中,Limit LOB size to (將 LOB 大小限制為) 等於 max_num_chars_text 乘以 4。

  • NCLOB – 複寫處理做為雙位元組字元的每個字元。因此,尋找欄 (max_num_chars_text) 中最長字元文字的長度,並乘以 2 來指定 Limit LOB size to (將 LOB 大小限制為) 的值。在此案例中,Limit LOB size to (將 LOB 大小限制為) 等於 max_num_chars_text 乘以 4。如果資料包含 4 位元組字元,則再次乘以 2。在此案例中,Limit LOB size to (將 LOB 大小限制為) 等於 max_num_chars_text 乘以 4。