기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
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 데이터베이스
대상 기술 스택
Aurora PostgreSQL-Compatible
또는 Amazon RDS for PostgreSQL AWS DMS 스키마 변환
마이그레이션 아키텍처

도구
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 변수 이름을 일치시킵니다.
Oracle
DBMS_OUTPUT과 PostgreSQLRAISE 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에서 생성한 | DBA, 개발자 |
변환을 테스트합니다. | Aurora PostgreSQL-Compatible 데이터베이스에 | DBA, 개발자 |
문제 해결
| 문제 | Solution |
|---|---|
패키지 변수에 액세스할 때 필드가 존재하지 않습니다. | 함수 |
변수가 최상위 호출 간에 재설정되지 않거나 내부 하위 호출 중에 예기치 않게 재설정되지 않습니다. | 직접 최상위 호출 |
관련 리소스
추가 정보
-------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'