本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將 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
先決條件和限制
作用中 AWS 帳戶
存取 AWS DMS 結構描述轉換服務
Amazon Aurora PostgreSQL 相容版本資料庫或 Amazon RDS for PostgreSQL 資料庫
Oracle 資料庫版本 10g 或更新版本
Architecture
來源技術堆疊
內部部署 Oracle 資料庫
目標技術堆疊
Aurora PostgreSQL 相容
或 Amazon RDS for PostgreSQL AWS DMS 結構描述轉換
遷移架構

工具
AWS 服務
AWS Database Migration Service (AWS DMS) 結構描述轉換可讓不同類型的資料庫之間的資料庫遷移更具可預測性。使用它來評估來源資料提供者遷移的複雜性,以及轉換資料庫結構描述和程式碼物件。您接著可將轉換後的程式碼套用至目標資料庫。
Amazon Aurora PostgreSQL 相容版本是完全受管且符合 ACID 規範的關聯式資料庫引擎,可協助您設定、操作和擴展 PostgreSQL 部署。
適用於 PostgreSQL 的 Amazon Relational Database Service (Amazon RDS) 可協助您在 中設定、操作和擴展 PostgreSQL 關聯式資料庫 AWS 雲端。
其他工具
pgAdmin
是 PostgreSQL 的開放原始碼管理工具。它提供圖形界面,可協助您建立、維護和使用資料庫物件。
最佳實務
一律將
reset_vars = 1用於最上層呼叫,將reset_vars = 0用於內部子呼叫。將
$init函數中的所有預設值保留為單一事實來源。比對 PostgreSQL 中的 Oracle 變數名稱,以取得可追蹤性。
透過比較 Oracle
DBMS_OUTPUT與 PostgreSQLRAISE 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 產生的 | DBA、開發人員 |
測試轉換。 | 將 | DBA、開發人員 |
疑難排解
| 問題 | 解決方案 |
|---|---|
存取套件變數時,欄位不存在錯誤。 | 確保 |
在最上層呼叫之間不會重設或在內部子呼叫期間意外重設的變數。 | 使用 |
相關資源
其他資訊
-------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'