將虛擬生成的列從甲骨文遷移到 PostgreSQL - AWS 方案指引

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

將虛擬生成的列從甲骨文遷移到 PostgreSQL

創建者:韋蘭賈納魯格蘭希(AWS),拉傑什·馬蒂瓦勒(AWS)和拉梅什帕瑟里(AWS)

環境:生產

來源:甲骨文數據庫

目標:Amazon RDS for PostgreSQL 或 Aurora 兼容

R 型:重新建築

工作量:甲骨文

技術:移轉;資料庫

AWS 服務:Amazon Aurora; Amazon RDS; AWS DMS

Summary

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

  • 移轉期間不會顯示虛擬資料行。

  • 版本 12 之前的運算式不支援此generate運算式。

但是,有一些解決方法可以模擬類似的功能。當您使用 AWS Database Migration Service (AWS DMS) 將資料從 Oracle 資料庫遷移到 PostgreSQL 版本 11 及更早版本時,您可以使用觸發函數將值填入虛擬產生的資料欄中。這種模式提供了甲骨文數據庫和 PostgreSQL 代碼的例子,你可以使用這個目的。在 AWS 上,您可以使用 Amazon Relational Database Service 服務 (Amazon RDS) 適用於 PostgreSQL 資料庫或 Amazon Aurora PostgreSQL 相容版本。

從第 12 版開始,支援產生的資料行。產生的欄可以從其他欄值即時計算,也可以計算和儲存。PostgreSQL 產生的資料行類似於甲骨文虛擬資料行。

先決條件和限制

先決條件

  • 有效的 AWS 帳戶

  • 來源甲骨文資料庫

  • 目標資料庫 (在亞馬遜 RDS 上適用於 PostgreSQL 或 Aurora 相容)

  • 編碼專業知識

限制

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

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

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

  • 僅適用於在同一個表格中定義的欄。

  • 如果虛擬產生的資料行參照具決定性的使用者定義函數,則無法將其用作分割索引鍵資料欄。

  • 運算式的輸出必須是純量值。它不能返回一個 Oracle 提供的數據類型,一個用戶定義的類型LOB,或。LONG RAW

  • 針對虛擬資料行定義的索引等同於 PostgreSQL 中以函數為基礎的索引。

  • 必須收集表統計信息。

工具

  • pgAdmin 4 是一個適用於 PostgreSQL 的開源管理工具。此工具提供圖形介面,可簡化資料庫物件的建立、維護和使用。

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

史诗

任務描述所需技能

建立來源「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料會透過 AWS DMS 遷移到目標資料庫。不過,FLAG資料行是透過使用generate by功能填入的,因此 AWS DMS 在遷移期間看不到此欄。若要實作的功能generated by,您必須使用目標資料庫中的觸發程序和函式來填入資料行中的FLAG值,如下一個史詩所示。

DBA, 應用程式開發人員

在 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 程序。

在 PostgreSQL 中,創建一個觸發器。

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 函數。

在 PostgreSQL 中,為觸發器創建一個函數。此函數會填入由應用程式或 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, 應用程式開發人員
任務描述所需技能

建立複寫執行個體。

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

DBA, 應用程式開發人員

建立來源端點和目標端點。

若要建立端點,請遵循 AWS DMS 文件中的示。

DBA, 應用程式開發人員

測試端點連線。

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

DBA, 應用程式開發人員

建立並啟動完整載入工作。

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

DBA, 應用程式開發人員

驗證虛擬資料行的資料。

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

DBA, 應用程式開發人員

相關資源