View a markdown version of this page

Migrieren Sie Oracle SERIALLY_REUSABLE Pragma-Pakete zu Amazon Aurora oder Amazon RDS for PostgreSQL - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Migrieren Sie Oracle SERIALLY_REUSABLE Pragma-Pakete zu Amazon Aurora oder Amazon RDS for PostgreSQL

Vinay Paladi, Amazon Web Services

Zusammenfassung

Dieses Muster bietet einen schrittweisen Ansatz für die Migration von Oracle-Paketen, die das SERIALLY_REUSABLE Pragma verwenden, auf Amazon Aurora PostgreSQL-Compatible Edition oder Amazon RDS for PostgreSQL unter AWS Beibehaltung der ursprünglichen Funktionalität.

Das PRAGMA SERIALLY_REUSABLE gibt an, dass der Paketstatus nur für die Dauer eines Serveraufrufs benötigt wird (z. B. ein PL/SQL anonymer Block oder ein Aufruf einer gespeicherten Prozedur über einen Datenbank-Link). Nach diesem Aufruf kann der Speicher für die Paketvariablen wiederverwendet werden, wodurch der Speicherverbrauch reduziert wird.

PostgreSQL unterstützt das Konzept von SERIALLY_REUSABLE Pragma nicht nativ. Um eine gleichwertige Funktionalität zu erreichen, verwendet dieses Muster einen Wrapper-Funktionsansatz in Kombination mit der AWS Database Migration Service (AWS DMS) Schema Conversion (AWS DMS SC) -Funktion, um die Paketstruktur zu migrieren. Das bereitgestellte Beispielskript zeigt, wie das Reset-on-Each-Call-Verhalten in PostgreSQL beibehalten wird.

Weitere Informationen finden Sie unter SERIALLY_REUSABLE Pragma in der Oracle-Dokumentation.

Voraussetzungen und Einschränkungen

  • Ein aktiver AWS-Konto

  • Zugriff auf den AWS DMS Schema Conversion Service

  • Eine Amazon Aurora PostgreSQL-Compatible Edition-Datenbank oder eine Amazon RDS for PostgreSQL PostgreSQL-Datenbank

  • Oracle-Datenbank Version 10g oder höher

Architektur

Quelltechnologie-Stack

  • On-premises Oracle-Datenbank

Zieltechnologie-Stack

Migrationsarchitektur

Migrieren Sie Oracle SERIALLY_REUSABLE Pragma-Pakete zu Amazon Aurora oder Amazon RDS for PostgreSQL

Tools

AWS-Services

Andere Tools

  • pgAdmin ist ein Open-Source-Verwaltungstool für PostgreSQL. Es bietet eine grafische Oberfläche, mit der Sie Datenbankobjekte erstellen, verwalten und verwenden können.

Bewährte Methoden

  • Wird immer reset_vars = 1 für Anrufe auf oberster Ebene und reset_vars = 0 für interne Unteranrufe verwendet.

  • Behalten Sie alle Standardwerte in der $init Funktion als zentrale Informationsquelle bei.

  • Ordnen Sie Oracle-Variablennamen in PostgreSQL aus Gründen der Rückverfolgbarkeit zu.

  • Überprüfen Sie, indem Sie die Oracle- DBMS_OUTPUT mit der PostgreSQL-Ausgabe RAISE NOTICE vergleichen.

  • Testen Sie in separaten PostgreSQL-Sitzungen, um zu bestätigen, dass Variablen zwischen Aufrufen zurückgesetzt werden.

Epen

AufgabeDescriptionErforderliche Fähigkeiten

Richten Sie AWS DMS SC ein.

Konfigurieren Sie die AWS DMS Konnektivität zur Quelldatenbank. Weitere Informationen finden Sie unter Datenbankschemas mithilfe der DMS-Schemakonvertierung konvertieren.

DBA, Entwickler

Konvertiert das Skript.

Verwenden Sie AWS DMS SC, um das Oracle-Paket zu konvertieren, indem Sie die Zieldatenbank als Aurora auswählen PostgreSQL-Compatible.

DBA, Entwickler

Speichern Sie die .sql-Dateien.

Bevor Sie die SQL-Datei speichern, ändern Sie die Option Projekteinstellungen in AWS DMS SC auf Eine Datei pro Phase. Dadurch wird die .sql-Datei je AWS DMS nach Objekttyp in mehrere .sql-Dateien aufgeteilt.

DBA, Entwickler

Ändern Sie den Code.

Öffnen Sie die von AWS DMS SC generierte init Funktion und ändern Sie sie, wie im Beispiel im Abschnitt Zusätzliche Informationen gezeigt. Es wird eine Variable hinzugefügt, um die Funktionalität zu erreichenreset_vars = 0.

DBA, Entwickler

Testen Sie die Konvertierung.

Stellen Sie die init Funktion in der PostgreSQL-Compatible Aurora-Datenbank bereit und testen Sie die Ergebnisse.

DBA, Entwickler

Fehlerbehebung

ProblemLösung

Fehler „Feld existiert nicht“ beim Zugriff auf Paketvariablen.

Stellen Sie sicher, dass die $init Funktionsbedingung IF v_need_init oder verwendet, reset_vars = 1 dass Variablen immer beim ersten Zugriff in einer Sitzung erstellt werden.

Variablen werden nicht zwischen Aufrufen der obersten Ebene zurückgesetzt oder bei internen Unteraufrufen unerwartet zurückgesetzt.

Wird reset_vars = 1 für direkte Aufrufe der obersten Ebene verwendet und für interne Aufrufe von Funktion zu Funktion übergeben. reset_vars = 0

Zugehörige Ressourcen

Zusätzliche Informationen

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