View a markdown version of this page

Oracle SERIALLY_REUSABLE Pragma 패키지를 Amazon Aurora 또는 Amazon RDS for PostgreSQL로 마이그레이션 - 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Oracle SERIALLY_REUSABLE Pragma 패키지를 Amazon Aurora 또는 Amazon RDS for PostgreSQL로 마이그레이션

Vinay Paladi, Amazon Web Services

요약

이 패턴은 원래 기능을 AWS유지하면서 SERIALLY_REUSABLE Pragma를 사용하는 Oracle 패키지를 Amazon Aurora PostgreSQL 호환 버전 또는 Amazon RDS for PostgreSQL on으로 마이그레이션하기 위한 step-by-step 접근 방식을 제공합니다.

PRAGMA SERIALLY_REUSABLE은 서버에 대한 한 번의 호출 기간 동안에만 패키지 상태가 필요함을 나타냅니다(예: PL/SQL 익명 블록 또는 데이터베이스 링크를 통한 저장 프로시저 호출). 이 호출 후 패키지 변수의 스토리지를 재사용하여 메모리 소비를 줄일 수 있습니다.

PostgreSQL은 기본적으로 SERIALLY_REUSABLE Pragma의 개념을 지원하지 않습니다. 동일한 기능을 달성하기 위해이 패턴은 AWS Database Migration Service (AWS DMS) Schema Conversion(AWS DMS SC) 기능과 결합된 래퍼 함수 접근 방식을 사용하여 패키지 구조를 마이그레이션합니다. 제공된 예제 스크립트는 PostgreSQL에서 reset-on-each-call 동작을 보존하는 방법을 보여줍니다.

자세한 내용은 Oracle 설명서의 SERIALLY_REUSABLE 프라그마를 참조하십시오.

사전 조건 및 제한 사항

  • 활성 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를 준수하는 완전 관리형 관계형 데이터베이스 엔진입니다.

  • Amazon Relational Database Service(RDS) for PostgreSQL는 AWS Cloud에서 관계형 데이터베이스를 설정, 운영 및 규모를 조정하는 데 도움이 됩니다.

기타 도구

  • pgAdmin은 PostgreSQL을 위한 오픈 소스 관리 도구입니다. 데이터베이스 객체를 생성, 유지 관리 및 사용하는 데 도움이 되는 그래픽 인터페이스를 제공합니다.

모범 사례

  • 항상 reset_vars = 1 최상위 호출 및 내부 하위 호출reset_vars = 0에를 사용합니다.

  • $init 함수의 모든 기본값을 단일 사실 소스로 유지합니다.

  • 추적성을 위해 PostgreSQL의 Oracle 변수 이름을 일치시킵니다.

  • OracleDBMS_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, 개발자

변환을 테스트합니다.

Aurora PostgreSQL-Compatible 데이터베이스에 init 함수를 배포하고 결과를 테스트합니다.

DBA, 개발자

문제 해결

문제Solution

패키지 변수에 액세스할 때 필드가 존재하지 않습니다.

함수 $init 조건이 세션의 첫 번째 액세스 시 변수가 항상 생성reset_vars = 1되도록 IF v_need_init 또는를 사용하는지 확인합니다.

변수가 최상위 호출 간에 재설정되지 않거나 내부 하위 호출 중에 예기치 않게 재설정되지 않습니다.

직접 최상위 호출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'