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

若我們提供該指南英語版本的翻譯,在有任何牴觸的狀況下請以英文版本的指南為主。其透過機器翻譯提供翻譯。

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

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

  • 現場部署資料庫

  • EC2 執行個體上的資料庫

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

  • Amazon Aurora 資料庫執行個體上與 PostgreSQL 相容的資料庫

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

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

  • 只在 AWS DMS 3.3.1 版和更新版本中支援 PostgreSQL 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 資料庫的這些準備。

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

PostgreSQL 來源版本

要使用的 AWS DMS 版本

9.x

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

10.x

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

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

11.x

使用 AWS DMS 3.3.1 版本。

12.x

使用 AWS DMS 3.3.3 版。

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

針對 AWS 上從 PostgreSQL 資料庫到 PostgreSQL 資料庫的同質遷移,以下事項屬實:

  • 來源上的 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 PostgreSQL 資料庫的 CDC。Amazon RDS 支援 PostgreSQL 資料庫執行個體 9.4.9 版和更新版本以及 9.5.4 版和更新版本的邏輯複寫。Amazon RDS 也支援使用 2.2.0 和 2.2.1 版且具備 PostgreSQL 10.6 相容性之 Amazon Aurora 資料庫執行個體的邏輯複寫。

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

使用 AWS DMS 從 PostgreSQL 遷移到 PostgreSQL。

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

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

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

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

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

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

如需將 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 或 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
布林值。 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,s) 資料類型沒有指定任何精度和規模,AWS DMS 預設將會使用 28 的精度和 6 的規模,NUMERIC(28,6)。舉例來說,來源的值 0.611111104488373 會轉換為 PostgreSQL 目標的 0.611111。

遷移 PostGIS 空間資料類型

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

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

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

  • POINT

  • LINESTRING

  • POLYGON

  • MULTIPOINT

  • MULTILINESTRING

  • MULTIPOLYGON

  • GEOMETRYCOLLECTION

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

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

  • 使用 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代表基於宿主的身份驗證。)文件傳統上存儲在數據庫羣集的數據目錄中。

  • 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 資料庫文件。

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

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

使用 PostgreSQL 做為來源時的唯一安全要求,是指定的使用者帳戶必須是 PostgreSQL 資料庫的註冊使用者。

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

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

  • AWS DMS 不會使用 PostgreSQL 10.4 或 Amazon Aurora PostgreSQL 10.4 的 Amazon RDS 做為來源或目標。

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

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

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

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

  • AWS DMS 支援 Amazon RDS for 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; $$;
  • 目前 PostgreSQL 來源中的 boolean 資料類型會以具有不一致的值的 bit 資料類型形式,遷移至 SQLServer 目標。因應措施是,預先建立具有欄的 VARCHAR(1) 資料類型的資料表 (或讓 AWS DMS 建立資料表),然後讓下游處理將 "F" 視為 False 並將 "T" 視為 True。

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

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

  • 如果您的來源是在現場部署或在 Amazon EC2 執行個體上的 PostgreSQL 資料庫,請確保 test_decoding 輸出外掛程式是安裝在您的來源端點。您可以在 Postgres contrib 套件找到這個外掛程式。如需 test-decoding 外掛程式的詳細資訊,請參閱 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.611111。

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

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

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

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

將 CDC 用於 RDS for PostgreSQL 資料庫執行個體

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

注意

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

啟用 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 參數設為 0。將此參數設為 0 可避免 PostgreSQL 終止失效超過指定逾時的複寫連線。在 AWS DMS 遷移資料時,複寫連線持續的時間需要超過指定的逾時。

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

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

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

    注意

    在 AWS DMS 3.1.0 版及更新版本中,可以使用原生 CDC 起始點和 PostgresSQL 做為來源。

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

如何使用原生 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 任務時,如果指定的邏輯複寫插槽不存在,或未使用 cdc-start-position 的有效設定建立任務,則會 AWS DMS 引發錯誤。

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

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

注意

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

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

建立物件

  1. 選擇要建立物件的結構描述。默認方案爲 public。確保架構存在且可由 NoPriv 賬戶。

  2. 使用 NoPriv 帳戶登入 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') 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 來源端點。

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

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

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

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

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

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

  • 表級別的參數 REPLICATE IDENTITY 在Postgreq版本9.4和更高版本中,您可以控制寫入WAL(事先寫入日誌)的信息,以識別更新或刪除的行。REPLICATE IDENTITY FULL 在行中記錄所有列的舊值。將 REPLICATE IDENTITY FULL 用於每個資料表時請小心,因為 FULL 可能產生額外不必要的 WAL 數量。

使用 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 版本以前的 AWS DMS 的來源 PostgreSQL 10.x 資料庫上執行此準備程式碼,將會看到如下錯誤。

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. 從您用來設定來源 PostgreSQL 10.x 組態搜尋路徑的 ALTER USER 陳述式中移除 fnRenames 參考。

  2. 從 PostgreSQL 資料庫刪除 fnRenames 結構描述。

如果您在升級之後未依照這些步驟進行,請在存取 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 for PostgreSQL 資料庫

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

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

下表顯示當使用 PostgreSQL 做為 AWS DMS 來源時可用的額外連線屬性:

屬性名稱 描述:

captureDDLs

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

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

已擷取串流的 DDL 事件。

預設值:”” Y

有效值:{、} 是/否

示例: captureDDLs=Y;

ddlArtifactsSchema

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

預設值:公有

有效值:{、} 字串:

示例: ddlArtifactsSchema=xyzddlschema;

failTasksOnLobTruncation

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

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

預設值:false

有效值:{、} 布林值。

示例: failTasksOnLobTruncation=true;

executeTimeout

設定 PostgreSQL 執行個體的用戶端陳述式逾時,以秒為單位。預設值為 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 的來源資料類型

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

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

如需 AWS DMS 資料類型的詳細資訊,請參閱Data types for 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

布林值。

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。