기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
에서 PostgreSQL로 Oracle ROWID 기능 마이그레이션 AWS
작성자: Rakesh Raghav(AWS) 및 Ramesh Pathuri(AWS)
환경: PoC 또는 파일럿 | 소스: Oracle Database | 대상: 에서 PostgreSQL 데이터베이스 AWS |
R 타입: 리플랫포밍 | 워크로드: Oracle | 기술: 마이그레이션, 데이터베이스 |
AWS 서비스: Amazon Aurora, Amazon RDS, AWS SCT, AWS CLI |
요약
이 패턴은 Oracle Database의 ROWID
의사 열 기능을 PostgreSQL용 Amazon Relational Database Service(Amazon RDS)의 Postgre 데이터베이스SQL, Amazon Aurora Postgre SQL-Compatible Edition 또는 Amazon Elastic Compute Cloud(Amazon )로 마이그레이션하는 옵션을 설명합니다EC2.
Oracle 데이터베이스에서 ROWID
가상 열은 테이블 행의 물리적 주소입니다. 이 가상 열은 테이블에 프라이머리 키가 없더라도 행을 고유하게 식별하는 데 사용됩니다. PostgreSQL에는 라는 유사한 의사 열이 ctid
있지만 로 사용할 수 없습니다ROWID
. PostgreSQL 설명서VACUUM
프로세스 후에 변경될 ctid
수 있습니다.
Postgre에서 ROWID
의사 열 기능을 생성하는 방법은 세 가지가 있습니다SQL.
테이블의 행을 식별하려면
ROWID
대신 프라이머리 키 열을 사용하십시오.테이블의 논리적 프라이머리/고유 키(복합 키일 수 있음)를 사용하십시오.
자동 생성된 값이 있는 열을 추가하고
ROWID
를 모방할 프라이머리/고유 키를 만듭니다.
이 패턴은 세 가지 구현을 모두 안내하고 각 옵션의 장단점을 설명합니다.
사전 조건 및 제한 사항
사전 조건
활성 AWS 계정
프로시저 언어/포스트그레SQL(PL/pgSQL) 코딩 전문 지식
Source Oracle Database
Amazon RDS for PostgreSQL 또는 Aurora Postgre SQL호환 클러스터 또는 PostgreSQL 데이터베이스를 호스팅하는 EC2 인스턴스
제한 사항
이 패턴은
ROWID
기능에 대한 해결 방법을 제공합니다. PostgreSQL는 Oracle DatabaseROWID
에서 와 동등한 를 제공하지 않습니다.
제품 버전
PostgreSQL 11.9 이상
아키텍처
소스 기술 스택
Oracle Database
대상 기술 스택
Aurora Postgre SQL-Compatible, Amazon RDS for Postgre SQL또는 PostgreSQL 데이터베이스가 있는 EC2 인스턴스
구현 옵션
테이블에 기본 키 또는 고유 인덱스SQL, 논리적 기본 키 또는 자격 증명 속성이 있는지 여부에 따라 Postgre 에서 ROWID
지원 부족 문제를 해결할 수 있는 세 가지 옵션이 있습니다. 프로젝트 일정, 현재 마이그레이션 단계, 애플리케이션 및 데이터베이스 코드에 대한 종속성 등에 따라 선택이 달라집니다.
옵션 | 설명 | 장점 | 단점 |
프라이머리 키 또는 고유 인덱스 | Oracle 테이블에 프라이머리 키가 있는 경우 이 키의 속성을 사용하여 행을 고유하게 식별할 수 있습니다. |
|
|
논리적 프라이머리/고유 키 | Oracle 테이블에 논리적 프라이머리 키가 있는 경우 이 키의 속성을 사용하여 행을 고유하게 식별할 수 있습니다. 논리적 프라이머리 키는 행을 고유하게 식별할 수 있는 속성 또는 속성 집합으로 구성되지만 제약 조건을 통해 데이터베이스에 적용되지는 않습니다. |
|
|
ID 속성 | Oracle 테이블에 프라이머리 키가 없는 경우 |
|
|
도구
Amazon Relational Database Service(Amazon RDS) for PostgreSQL는 AWS 클라우드에서 PostgreSQL 관계형 데이터베이스를 설정, 운영 및 확장하는 데 도움이 됩니다.
Amazon Aurora Postgre SQL-Compatible Edition은 PostgreSQL 배포를 설정, 운영 및 확장하는 데 도움이 되는 완전 관리형 ACID규정 준수 관계형 데이터베이스 엔진입니다.
AWS 명령줄 인터페이스(AWS CLI)는 명령줄 쉘의 명령을 통해 AWS 서비스와 상호 작용하는 데 도움이 되는 오픈 소스 도구입니다. 이 패턴에서는 를 사용하여 AWSCLI를 통해 SQL 명령을 실행할 수 있습니다pgAdmin.
pgAdmin
는 Postgre 의 오픈 소스 관리 도구입니다SQL. 데이터베이스 객체를 생성, 유지 관리 및 사용하는 데 도움이 되는 그래픽 인터페이스를 제공합니다. AWS Schema Conversion Tool(AWS SCT)는 소스 데이터베이스 스키마와 사용자 지정 코드의 대부분을 대상 데이터베이스와 호환되는 형식으로 자동 변환하여 이종 데이터베이스 마이그레이션을 지원합니다.
에픽
작업 | 설명 | 필요한 기술 |
---|---|---|
| AWS Schema Conversion Tool(AWS SCT)를 사용하여 - 또는 - Oracle에서는 | DBA 또는 개발자 |
이러한 테이블을 참조하는 코드를 식별합니다. | AWS SCT 를 사용하여 마이그레이션 평가 보고서를 생성하여 의 영향을 받는 절차를 식별합니다 - 또는 - 소스 Oracle 데이터베이스에서 | DBA 또는 개발자 |
작업 | 설명 | 필요한 기술 |
---|---|---|
프라이머리 키가 없는 테이블을 식별합니다. | 소스 Oracle 데이터베이스에서
| DBA 또는 개발자 |
작업 | 설명 | 필요한 기술 |
---|---|---|
정의되거나 논리적인 프라이머리 키가 있는 테이블에 변경 사항을 적용합니다. | 고유한 프라이머리 키를 사용하거나 테이블의 행을 식별하는 논리적 프라이머리 키를 사용하도록 추가 정보 섹션에 표시된 애플리케이션 및 데이터베이스 코드를 변경합니다. | DBA 또는 개발자 |
정의되거나 논리적인 프라이머리 키가 없는 테이블에 필드를 추가합니다. |
| DBA 또는 개발자 |
필요한 경우 인덱스를 추가합니다. | 추가 필드 또는 논리적 기본 키에 인덱스를 추가하여 SQL 성능을 개선합니다. | DBA 또는 개발자 |
관련 리소스
PostgreSQLCTID
(PostgreSQL 설명서) 생성된 열
(PostgreSQL 설명서) ROWID가상 열
(Oracle 설명서)
추가 정보
다음 섹션에서는 Oracle 및 PostgreSQL 코드 예제를 제공하여 세 가지 접근 방식을 보여줍니다.
시나리오 1: 프라이머리 고유 키 사용
다음 예제에서는 emp_id
를 프라이머리 키로 사용하여 testrowid_s1
테이블을 생성합니다.
Oracle 코드:
create table testrowid_s1 (emp_id integer, name varchar2(10), CONSTRAINT testrowid_pk PRIMARY KEY (emp_id)); INSERT INTO testrowid_s1(emp_id,name) values (1,'empname1'); INSERT INTO testrowid_s1(emp_id,name) values (2,'empname2'); INSERT INTO testrowid_s1(emp_id,name) values (3,'empname3'); INSERT INTO testrowid_s1(emp_id,name) values (4,'empname4'); commit; SELECT rowid,emp_id,name FROM testrowid_s1; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3pAAAAAAAMOAAA 1 empname1 AAAF3pAAAAAAAMOAAB 2 empname2 AAAF3pAAAAAAAMOAAC 3 empname3 AAAF3pAAAAAAAMOAAD 4 empname4 UPDATE testrowid_s1 SET name = 'Ramesh' WHERE rowid = 'AAAF3pAAAAAAAMOAAB' ; commit; SELECT rowid,emp_id,name FROM testrowid_s1; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3pAAAAAAAMOAAA 1 empname1 AAAF3pAAAAAAAMOAAB 2 Ramesh AAAF3pAAAAAAAMOAAC 3 empname3 AAAF3pAAAAAAAMOAAD 4 empname4
PostgreSQL 코드:
CREATE TABLE public.testrowid_s1 ( emp_id integer, name character varying, primary key (emp_id) ); insert into public.testrowid_s1 (emp_id,name) values (1,'empname1'),(2,'empname2'),(3,'empname3'),(4,'empname4'); select emp_id,name from testrowid_s1; emp_id | name --------+---------- 1 | empname1 2 | empname2 3 | empname3 4 | empname4 update testrowid_s1 set name = 'Ramesh' where emp_id = 2 ; select emp_id,name from testrowid_s1; emp_id | name --------+---------- 1 | empname1 3 | empname3 4 | empname4 2 | Ramesh
시나리오 2: 논리적 프라이머리 키 사용
다음 예제에서는 논리적 프라이머리 키를 emp_id
로 사용하여 testrowid_s2
테이블을 생성합니다.
Oracle 코드:
create table testrowid_s2 (emp_id integer, name varchar2(10) ); INSERT INTO testrowid_s2(emp_id,name) values (1,'empname1'); INSERT INTO testrowid_s2(emp_id,name) values (2,'empname2'); INSERT INTO testrowid_s2(emp_id,name) values (3,'empname3'); INSERT INTO testrowid_s2(emp_id,name) values (4,'empname4'); commit; SELECT rowid,emp_id,name FROM testrowid_s2; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3rAAAAAAAMeAAA 1 empname1 AAAF3rAAAAAAAMeAAB 2 empname2 AAAF3rAAAAAAAMeAAC 3 empname3 AAAF3rAAAAAAAMeAAD 4 empname4 UPDATE testrowid_s2 SET name = 'Ramesh' WHERE rowid = 'AAAF3rAAAAAAAMeAAB' ; commit; SELECT rowid,emp_id,name FROM testrowid_s2; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3rAAAAAAAMeAAA 1 empname1 AAAF3rAAAAAAAMeAAB 2 Ramesh AAAF3rAAAAAAAMeAAC 3 empname3 AAAF3rAAAAAAAMeAAD 4 empname4
PostgreSQL 코드:
CREATE TABLE public.testrowid_s2 ( emp_id integer, name character varying ); insert into public.testrowid_s2 (emp_id,name) values (1,'empname1'),(2,'empname2'),(3,'empname3'),(4,'empname4'); select emp_id,name from testrowid_s2; emp_id | name --------+---------- 1 | empname1 2 | empname2 3 | empname3 4 | empname4 update testrowid_s2 set name = 'Ramesh' where emp_id = 2 ; select emp_id,name from testrowid_s2; emp_id | name --------+---------- 1 | empname1 3 | empname3 4 | empname4 2 | Ramesh
시나리오 3: 자격 증명 속성 사용
다음 예제에서는 프라이머리 키가 없는 상태에서 자격 증명 속성을 사용하여 testrowid_s3
테이블을 생성합니다.
Oracle 코드:
create table testrowid_s3 (name varchar2(10)); INSERT INTO testrowid_s3(name) values ('empname1'); INSERT INTO testrowid_s3(name) values ('empname2'); INSERT INTO testrowid_s3(name) values ('empname3'); INSERT INTO testrowid_s3(name) values ('empname4'); commit; SELECT rowid,name FROM testrowid_s3; ROWID NAME ------------------ ---------- AAAF3sAAAAAAAMmAAA empname1 AAAF3sAAAAAAAMmAAB empname2 AAAF3sAAAAAAAMmAAC empname3 AAAF3sAAAAAAAMmAAD empname4 UPDATE testrowid_s3 SET name = 'Ramesh' WHERE rowid = 'AAAF3sAAAAAAAMmAAB' ; commit; SELECT rowid,name FROM testrowid_s3; ROWID NAME ------------------ ---------- AAAF3sAAAAAAAMmAAA empname1 AAAF3sAAAAAAAMmAAB Ramesh AAAF3sAAAAAAAMmAAC empname3 AAAF3sAAAAAAAMmAAD empname4
PostgreSQL 코드:
CREATE TABLE public.testrowid_s3 ( rowid_seq bigint generated always as identity, name character varying ); insert into public.testrowid_s3 (name) values ('empname1'),('empname2'),('empname3'),('empname4'); select rowid_seq,name from testrowid_s3; rowid_seq | name -----------+---------- 1 | empname1 2 | empname2 3 | empname3 4 | empname4 update testrowid_s3 set name = 'Ramesh' where rowid_seq = 2 ; select rowid_seq,name from testrowid_s3; rowid_seq | name -----------+---------- 1 | empname1 3 | empname3 4 | empname4 2 | Ramesh