View a markdown version of this page

Migre los paquetes Pragma SERIALLY_REUTILIZABLE de Oracle a Amazon Aurora o Amazon RDS para PostgreSQL - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Migre los paquetes Pragma SERIALLY_REUTILIZABLE de Oracle a Amazon Aurora o Amazon RDS para PostgreSQL

Vinay Paladi, Amazon Web Services

Resumen

Este patrón proporciona un enfoque gradual para migrar paquetes de Oracle que utilizan el Pragma SERIALLY_REUTILIZABLE a Amazon PostgreSQL-Compatible Aurora Edition o Amazon RDS for AWS PostgreSQL, manteniendo la funcionalidad original.

El PRAGMA SERIALLY_REUTILIZABLE indica que el estado del paquete solo es necesario durante una llamada al servidor (por ejemplo, un bloque PL/SQL anónimo o una llamada a un procedimiento almacenado a través de un enlace de base de datos). Tras esta llamada, se puede reutilizar el almacenamiento de las variables del paquete, lo que reduce el consumo de memoria.

PostgreSQL no admite de forma nativa el concepto de SERIALLY_REUTILIZABLE Pragma. Para lograr una funcionalidad equivalente, este patrón utiliza un enfoque de función contenedora combinado con la función () de conversión de esquemas AWS Database Migration Service (AWS DMS SC AWS DMS) para migrar la estructura del paquete. El script de ejemplo proporcionado demuestra cómo conservar el comportamiento de restablecimiento en cada llamada en PostgreSQL.

Para obtener más información, consulte SERIALLY_REUSABLE Pragma en la documentación de Oracle.

Requisitos previos y limitaciones

  • Un activo Cuenta de AWS

  • Acceso al servicio de conversión de AWS DMS esquemas

  • Una base de datos de Amazon Aurora PostgreSQL-Compatible Edition o una base de datos de Amazon RDS for PostgreSQL

  • Base de datos Oracle versión 10g o posterior

Arquitectura

Pila de tecnología de origen

  • On-premises Base de datos Oracle

Pila de tecnología de destino

Arquitectura de migración

Migre los paquetes Pragma SERIALLY_REUTILIZABLE de Oracle a Amazon Aurora o Amazon RDS para PostgreSQL

Tools (Herramientas)

Servicios de AWS

Otras herramientas

  • pgAdmin es una herramienta de gestión de código abierto para PostgreSQL. Proporciona una interfaz gráfica que permite crear, mantener y utilizar objetos de bases de datos.

Prácticas recomendadas

  • Utilícelo siempre reset_vars = 1 para las llamadas de alto nivel y para las subllamadas internas. reset_vars = 0

  • Mantenga todos los valores predeterminados de la $init función como una única fuente de información.

  • Haga coincidir los nombres de las variables de Oracle en PostgreSQL para garantizar la trazabilidad.

  • Valide comparando los resultados de Oracle DBMS_OUTPUT con los de RAISE NOTICE PostgreSQL.

  • Realice pruebas en distintas sesiones de PostgreSQL para confirmar que las variables se restablecen entre llamadas.

Epics

TareaDescripciónHabilidades requeridas

Configure AWS DMS SC.

Configure AWS DMS la conectividad con la base de datos de origen. Para obtener más información, consulte Convertir esquemas de bases de datos mediante la conversión de esquemas de DMS.

Administrador de base de datos, desarrollador

Convierta el script.

Utilice AWS DMS SC para convertir el paquete de Oracle seleccionando la base de datos de destino como Aurora PostgreSQL-Compatible.

Administrador de base de datos, desarrollador

Guarde los archivos.sql.

Antes de guardar el archivo.sql, modifique la opción de configuración del proyecto en AWS DMS SC a un solo archivo por etapa. Esto se configura AWS DMS para separar el archivo.sql en varios archivos.sql según el tipo de objeto.

Administrador de base de datos, desarrollador

Cambie el código.

Abra la init función generada por AWS DMS SC y cámbiela como se muestra en el ejemplo de la sección de información adicional. Añadirá una variable para lograr la funcionalidad de reset_vars = 0.

Administrador de base de datos, desarrollador

Pruebe la conversión.

Implemente la init función en la PostgreSQL-Compatible base de datos de Aurora y pruebe los resultados.

Administrador de base de datos, desarrollador

Resolución de problemas

ProblemaSolución

El campo no existe un error al acceder a las variables del paquete.

Asegúrese de que la condición de la $init función utilice IF v_need_init o de reset_vars = 1 manera que las variables se creen siempre en el primer acceso de una sesión.

Las variables no se restablecen entre las llamadas de nivel superior o se restablecen inesperadamente durante las subllamadas internas.

reset_vars = 1Utilízalas para llamadas directas de alto nivel y reset_vars = 0 transfiérelas para llamadas internas de función a función.

Recursos relacionados

Información adicional

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