將虛擬產生的資料欄從 Oracle 遷移至 PostgreSQL - AWS 方案指引

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

將虛擬產生的資料欄從 Oracle 遷移至 PostgreSQL

由 Veeranjaneyulu Grandhi (AWS)、Rajesh Madiwale (AWS) 和 Ramesh Pathuri (AWS) 建立

環境:生產

來源:Oracle 資料庫

目標:Amazon RDS for PostgreSQL 或 Aurora Postgre SQL– 相容

R 類型:重新架構

工作負載:Oracle

技術:遷移;資料庫

AWS 服務:Amazon Aurora;AmazonRDS; AWS DMS

Summary

在 11 版及更早版本中,PostgreSQL 不提供直接等同於 Oracle 虛擬資料欄的功能。在從 Oracle 資料庫遷移至 PostgreSQL 第 11 版或更早版本時,處理虛擬產生的資料欄是困難的,原因有兩個: 

  • 遷移期間看不到虛擬資料欄。

  • PostgreSQL 不支援第 12 版之前的generate表達式。

不過,有模擬類似功能的解決方法。當您使用 AWS Database Migration Service (AWS DMS) 將資料從 Oracle Database 遷移至 PostgreSQL 第 11 版及更早版本時,您可以使用觸發函數在虛擬產生的欄中填入值。此模式提供 Oracle 資料庫和 PostgreSQL 程式碼的範例,您可以用於此目的。在 上AWS,您可以將 Amazon Relational Database Service (Amazon RDS) 用於 PostgreSQL,或將 Amazon Aurora Postgre SQL相容版本用於 PostgreSQL 資料庫。

從 PostgreSQL 第 12 版開始,支援產生的資料欄。產生的資料欄可以快速從其他資料欄值計算,也可以計算和儲存。PostgreSQL 產生的資料欄類似於 Oracle 虛擬資料欄。

先決條件和限制

先決條件

  • 作用中AWS帳戶

  • 來源 Oracle 資料庫

  • Target PostgreSQL 資料庫 (Amazon RDS for PostgreSQL 或 Aurora Postgre SQL- 相容)

  • PL/pgSQL 編碼專業知識

限制

  • 僅適用於第 12 版之前的 PostgreSQL 版本。 

  • 適用於 Oracle 資料庫 11g 版或更新版本。

  • 資料遷移工具不支援虛擬資料欄。

  • 僅適用於相同資料表中定義的資料欄。

  • 如果虛擬產生的資料欄參考確定性的使用者定義函數,則無法用作分割金鑰資料欄。

  • 表達式的輸出必須是純量值。它無法傳回 Oracle 提供的資料類型、使用者定義的類型LOB、 或 LONG RAW

  • 根據虛擬資料欄定義的索引相當於 Postgre 中的以函數為基礎的索引SQL。

  • 必須收集資料表統計資料。

工具

  • pgAdmin 4 是 Postgre 的開放原始碼管理工具SQL。此工具提供圖形界面,可簡化資料庫物件的建立、維護和使用。

  • Oracle SQL 開發人員是免費的整合開發環境,可在傳統和雲端部署的 SQL Oracle 資料庫中使用 。 

史詩

任務描述所需的技能

建立來源 Oracle 資料庫資料表。

在 Oracle 資料庫中,使用下列陳述式建立具有虛擬產生資料欄的資料表。

CREATE TABLE test.generated_column ( CODE NUMBER, STATUS VARCHAR2(12) DEFAULT 'PreOpen', FLAG CHAR(1) GENERATED ALWAYS AS (CASE UPPER(STATUS) WHEN 'OPEN' THEN 'N' ELSE 'Y' END) VIRTUAL VISIBLE );

在此來源資料表中,STATUS資料欄中的資料會遷移AWSDMS到目標資料庫。不過,資料FLAG欄會使用 generate by功能填入,因此遷移AWSDMS期間無法將此資料欄顯示為 。若要實作 的功能generated by,您必須使用目標資料庫中的觸發條件和函數來填入資料FLAG欄中的值,如下一個圖示所示。

DBA、應用程式開發人員

在 上建立目標 PostgreSQL 資料表AWS。

AWS 使用下列陳述式在 上建立 PostgreSQL 資料表。

CREATE TABLE test.generated_column ( code integer not null, status character varying(12) not null , flag character(1) );

在此資料表中,資料status欄是標準資料欄。flag 資料欄會根據資料欄中的資料產生資料status欄。

DBA、應用程式開發人員
任務描述所需的技能

建立 PostgreSQL 觸發程序。

在 Postgre SQL中,建立觸發程序。

CREATE TRIGGER tgr_gen_column AFTER INSERT OR UPDATE OF status ON test.generated_column FOR EACH ROW EXECUTE FUNCTION test.tgf_gen_column();
DBA、應用程式開發人員

建立 PostgreSQL 觸發函數。

在 Postgre 中SQL,為觸發程序建立函數。此函數會填入由應用程式或 AWS 插入或更新的虛擬資料欄DMS,並驗證資料。

CREATE OR REPLACE FUNCTION test.tgf_gen_column() RETURNS trigger AS $VIRTUAL_COL$ BEGIN IF (TG_OP = 'INSERT') THEN IF (NEW.flag IS NOT NULL) THEN RAISE EXCEPTION 'ERROR: cannot insert into column "flag"' USING DETAIL = 'Column "flag" is a generated column.'; END IF; END IF; IF (TG_OP = 'UPDATE') THEN IF (NEW.flag::VARCHAR != OLD.flag::varchar) THEN RAISE EXCEPTION 'ERROR: cannot update column "flag"' USING DETAIL = 'Column "flag" is a generated column.'; END IF; END IF; IF TG_OP IN ('INSERT','UPDATE') THEN IF (old.flag is NULL) OR (coalesce(old.status,'') != coalesce(new.status,'')) THEN UPDATE test.generated_column SET flag = (CASE UPPER(status) WHEN 'OPEN' THEN 'N' ELSE 'Y' END) WHERE code = new.code; END IF; END IF; RETURN NEW; END $VIRTUAL_COL$ LANGUAGE plpgsql;
DBA、應用程式開發人員
任務描述所需的技能

建立複寫執行個體。

若要建立複寫執行個體,請遵循AWSDMS文件中的指示。複寫執行個體應與來源和目標資料庫位於相同的虛擬私有雲端 (VPC) 中。

DBA、應用程式開發人員

建立來源和目標端點。

若要建立端點,請遵循AWSDMS文件中的指示

DBA、應用程式開發人員

測試端點連線。

您可以透過指定 VPC和 複寫執行個體,然後選擇執行測試 來測試端點連線。

DBA、應用程式開發人員

建立並啟動完整載入任務。

如需指示,請參閱 AWS DMS 文件中的建立任務完全載入任務設定

DBA、應用程式開發人員

驗證虛擬資料欄的資料。

比較來源和目標資料庫中虛擬資料欄中的資料。您可以手動驗證資料或撰寫此步驟的指令碼。

DBA、應用程式開發人員

相關資源