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 に移行する

Amazon Web Services、Vinay Paladi

概要

このパターンは、元の機能 AWSを維持しながら、SERIALLY_REUSABLE Pragma を使用する Oracle パッケージを Amazon Aurora PostgreSQL 互換エディションまたは Amazon RDS for PostgreSQL に移行するstep-by-stepのアプローチを提供します。

PRAGMA SERIALLY_REUSABLE は、サーバーへの 1 回の呼び出し (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 Schema Conversion サービスへのアクセス

  • Amazon Aurora PostgreSQL 互換エディションデータベースまたは Amazon RDS for PostgreSQL データベース

  • Oracle データベースバージョン 10g 以降

アーキテクチャ

ソーステクノロジースタック

  • オンプレミスの Oracle データベース

ターゲットテクノロジースタック

移行アーキテクチャ

Oracle SERIALLY_REUSABLE Pragma パッケージを Amazon Aurora または Amazon RDS for PostgreSQL に移行する

ツール

AWS のサービス

  • AWS Database Migration Service (AWS DMS) Schema Conversion は、さまざまなタイプのデータベース間のデータベース移行をより予測しやすくします。これを使用して、ソースデータプロバイダーの移行の複雑さを評価し、データベーススキーマとコードオブジェクトを変換します。その後、変換したコードをターゲットデータベースに適用できます。

  • Amazon Aurora PostgreSQL 互換エディションは、PostgreSQL デプロイのセットアップ、運用、スケーリングに役立つ、フルマネージド型のACID準拠のリレーショナルデータベースエンジンです。

  • PostgreSQL 向け Amazon Relational Database Service (Amazon RDS) を使用して、 AWS クラウドで PostgreSQL リレーショナルデータベース (DB) をセットアップ、運用、スケールできます。

その他のツール

  • pgAdmin」は PostgreSQL 用のオープンソース管理ツールです。データベースオブジェクトの作成、管理、使用を支援するグラフィカルインターフェイスを提供します。

ベストプラクティス

  • 最上位の呼び出しreset_vars = 1には必ず を使用し、内部のサブ呼び出しreset_vars = 0には必ず を使用します。

  • $init 関数のすべてのデフォルト値を単一の信頼できるソースとして保持します。

  • トレーサビリティのために PostgreSQL で Oracle 変数名を一致させます。

  • Oracle DBMS_OUTPUTと PostgreSQL RAISE NOTICE出力を比較して検証します。

  • 個別の PostgreSQL セッションでテストして、呼び出し間で変数がリセットされることを確認します。

エピック

タスク説明必要なスキル

AWS DMS SC をセットアップします。

ソースデータベース AWS DMS への接続を設定します。詳細については、「DMS Schema Conversion を使用したデータベーススキーマの変換」を参照してください。

DBA、開発者

スクリプトを変換します。

AWS DMS SC を使用して、ターゲットデータベースを Aurora PostgreSQL 互換として選択して Oracle パッケージを変換します。

DBA、開発者

.sql ファイルを保存します。

.sql ファイルを保存する前に、 AWS DMS SC のプロジェクト設定オプションをステージごとに単一のファイルに変更します。これにより、オブジェクトタイプに基づいて .sql ファイルを複数の .sql ファイルに分割 AWS DMS するように が設定されます。

DBA、開発者

コードを変更してください。

AWS DMS SC によって生成されたinit関数を開き、「追加情報」セクションの例に示すように変更します。機能 reset_vars = 0 を実現するための変数が追加されます。

DBA、開発者

変換をテストします。

init 関数を Aurora PostgreSQL 互換データベースにデプロイし、結果をテストします。

DBA、開発者

トラブルシューティング

問題ソリューション

パッケージ変数にアクセスするときにフィールドが存在しません。

$init 関数条件が IF v_need_initまたは を使用しreset_vars = 1、セッションの最初のアクセス時に変数が常に作成されることを確認します。

最上位の呼び出し間でリセットされない変数、または内部サブ呼び出し中に予期せずリセットされない変数。

直接の最上位呼び出しreset_vars = 1には を使用し、内部function-to-function呼び出しreset_vars = 0には を渡します。

関連リソース

追加情報

-------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'