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
Aurora PostgreSQL-Compatible
oder Amazon RDS for PostgreSQL AWS DMS Schemakonvertierung
Migrationsarchitektur

Tools
AWS-Services
AWS Database Migration Service (AWS DMS) Die Schemakonvertierung macht Datenbankmigrationen zwischen verschiedenen Datenbanktypen vorhersehbarer. Verwenden Sie es, um die Komplexität Ihrer Migration für Ihren Quelldatenanbieter zu beurteilen und Datenbankschemas und Codeobjekte zu konvertieren. Sie können dann den konvertierten Code auf Ihre Zieldatenbank anwenden.
Amazon Aurora PostgreSQL-Compatible Edition ist eine vollständig verwaltete, ACID-compliant relationale Datenbank-Engine, die Sie bei der Einrichtung, dem Betrieb und der Skalierung von PostgreSQL-Bereitstellungen unterstützt.
Amazon Relational Database Service (Amazon RDS) für PostgreSQL unterstützt Sie bei der Einrichtung, dem Betrieb und der Skalierung einer relationalen PostgreSQL-Datenbank in der. AWS Cloud
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 = 1für Anrufe auf oberster Ebene undreset_vars = 0für interne Unteranrufe verwendet.Behalten Sie alle Standardwerte in der
$initFunktion 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_OUTPUTmit der PostgreSQL-AusgabeRAISE NOTICEvergleichen.Testen Sie in separaten PostgreSQL-Sitzungen, um zu bestätigen, dass Variablen zwischen Aufrufen zurückgesetzt werden.
Epen
| Aufgabe | Description | Erforderliche 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 | DBA, Entwickler |
Testen Sie die Konvertierung. | Stellen Sie die | DBA, Entwickler |
Fehlerbehebung
| Problem | Lösung |
|---|---|
Fehler „Feld existiert nicht“ beim Zugriff auf Paketvariablen. | Stellen Sie sicher, dass die |
Variablen werden nicht zwischen Aufrufen der obersten Ebene zurückgesetzt oder bei internen Unteraufrufen unerwartet zurückgesetzt. | Wird |
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'