View a markdown version of this page

將 Oracle SERIALLY_REUSABLE Pragma 套件遷移至 Amazon Aurora 或 Amazon RDS for PostgreSQL - AWS 方案指引

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

將 Oracle SERIALLY_REUSABLE Pragma 套件遷移至 Amazon Aurora 或 Amazon RDS for PostgreSQL

Vinay Paladi,Amazon Web Services

摘要

此模式提供step-by-step方法,可將使用 SERIALLY_REUSABLE Pragma 的 Oracle 套件遷移至 Amazon Aurora PostgreSQL 相容版本或 Amazon RDS for PostgreSQL AWS,同時維持原始功能。

PRAGMA SERIALLY_REUSABLE 表示只有在呼叫伺服器的持續時間 (例如,PL/SQL 匿名區塊或透過資料庫連結的預存程序呼叫) 內,才需要套件狀態。在此呼叫之後,可以重複使用套件變數的儲存體,以減少記憶體消耗。

PostgreSQL 原生不支援 SERIALLY_REUSABLE Pragma 的概念。為了實現同等功能,此模式使用包裝函式方法結合 AWS Database Migration Service (AWS DMS) 結構描述轉換 (AWS DMS SC) 功能來遷移套件結構。提供的範例指令碼示範如何在 PostgreSQL 中保留reset-on-each-call行為。

如需詳細資訊,請參閱 Oracle 文件中的 SERIALLY_REUSABLE Pragma。

先決條件和限制

  • 作用中 AWS 帳戶

  • 存取 AWS DMS 結構描述轉換服務

  • Amazon Aurora PostgreSQL 相容版本資料庫或 Amazon RDS for PostgreSQL 資料庫

  • Oracle 資料庫版本 10g 或更新版本

Architecture

來源技術堆疊

  • 內部部署 Oracle 資料庫

目標技術堆疊

遷移架構

將 Oracle SERIALLY_REUSABLE Pragma 套件遷移至 Amazon Aurora 或 Amazon RDS for PostgreSQL

工具

AWS 服務

其他工具

  • pgAdmin 是 PostgreSQL 的開放原始碼管理工具。它提供圖形界面,可協助您建立、維護和使用資料庫物件。

最佳實務

  • 一律將 reset_vars = 1用於最上層呼叫,將 reset_vars = 0用於內部子呼叫。

  • $init函數中的所有預設值保留為單一事實來源。

  • 比對 PostgreSQL 中的 Oracle 變數名稱,以取得可追蹤性。

  • 透過比較 Oracle DBMS_OUTPUT與 PostgreSQL RAISE NOTICE輸出進行驗證。

  • 在個別 PostgreSQL 工作階段中進行測試,以確認變數在呼叫之間重設。

史詩

任務說明所需的技能

設定 AWS DMS SC。

設定來源資料庫的 AWS DMS 連線。如需詳細資訊,請參閱使用 DMS 結構描述轉換轉換資料庫結構描述

DBA、開發人員

轉換指令碼。

使用 AWS DMS SC 將目標資料庫選取為 Aurora PostgreSQL 相容,以轉換 Oracle 套件。

DBA、開發人員

儲存 .sql 檔案。

儲存 .sql 檔案之前,請將 AWS DMS SC 中的專案設定選項修改為每個階段的單一檔案。這會設定 根據物件類型將 .sql 檔案 AWS DMS 分隔為多個 .sql 檔案。

DBA、開發人員

變更程式碼。

開啟 AWS DMS SC 產生的init函數,並如其他資訊區段中的範例所示進行變更。它會新增變數來實現功能 reset_vars = 0

DBA、開發人員

測試轉換。

init函數部署至 Aurora PostgreSQL 相容資料庫,並測試結果。

DBA、開發人員

疑難排解

問題解決方案

存取套件變數時,欄位不存在錯誤。

確保$init函數條件使用 IF v_need_init或 ,reset_vars = 1以便一律在工作階段中第一次存取時建立變數。

在最上層呼叫之間不會重設或在內部子呼叫期間意外重設的變數。

使用 reset_vars = 1進行直接最上層呼叫,並使用 reset_vars = 0進行內部function-to-function呼叫。

相關資源

其他資訊

-------Source Oracle Code: CREATE OR REPLACE PACKAGE test_pkg_var IS PRAGMA SERIALLY_REUSABLE; PROCEDURE function_1(test_id NUMBER); PROCEDURE function_2(test_id NUMBER); END; / CREATE OR REPLACE PACKAGE BODY test_pkg_var IS PRAGMA SERIALLY_REUSABLE; v_char VARCHAR2(20) := 'DEFAULT_VALUE'; v_num NUMBER := 123; PROCEDURE function_2(test_id NUMBER) IS BEGIN dbms_output.put_line('function_2 => v_char=' || v_char || ', v_num=' || v_num); END; PROCEDURE function_1(test_id NUMBER) IS BEGIN dbms_output.put_line('function_1 => v_char=' || v_char || ', v_num=' || v_num); v_char := 'MODIFIED_VALUE'; dbms_output.put_line('function_1 => v_char after update=' || v_char); function_2(0); END; END test_pkg_var; / SET SERVEROUTPUT ON EXEC test_pkg_var.function_1(1); EXEC test_pkg_var.function_2(1); ------Target PostgreSQL Code: CREATE SCHEMA IF NOT EXISTS testoracle; CREATE OR REPLACE FUNCTION testoracle.test_pkg_var$init(reset_vars IN INTEGER DEFAULT 0) RETURNS void AS $BODY$ DECLARE v_need_init BOOLEAN; BEGIN v_need_init := aws_oracle_ext.packageinitialize(proutinename => 'testoracle.test_pkg_var'); IF v_need_init OR reset_vars = 1 THEN PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', pval => 'DEFAULT_VALUE'::CHARACTER VARYING(20)); PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', pval => 123); END IF; END; $BODY$ LANGUAGE plpgsql; CREATE OR REPLACE PROCEDURE testoracle.test_pkg_var$function_1(reset_vars INT DEFAULT 1) AS $BODY$ BEGIN PERFORM testoracle.test_pkg_var$init(reset_vars); RAISE NOTICE 'function_1 => v_char=%, v_num=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20)), aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', ptp => NULL::DOUBLE PRECISION); PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', pval => 'MODIFIED_VALUE'::CHARACTER VARYING(20)); RAISE NOTICE 'function_1 => v_char after update=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20)); CALL testoracle.test_pkg_var$function_2(0); END; $BODY$ LANGUAGE plpgsql; CREATE OR REPLACE PROCEDURE testoracle.test_pkg_var$function_2(reset_vars INT DEFAULT 1) AS $BODY$ BEGIN PERFORM testoracle.test_pkg_var$init(reset_vars); RAISE NOTICE 'function_2 => v_char=%, v_num=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20)), aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', ptp => NULL::DOUBLE PRECISION); END; $BODY$ LANGUAGE plpgsql; CALL testoracle.test_pkg_var$function_1(1); -- loads defaults, sets v_char='MODIFIED_VALUE', function_2 sees 'MODIFIED_VALUE' CALL testoracle.test_pkg_var$function_2(1); -- new transcation: PRAGMA reset, sees 'DEFAULT_VALUE'