본문으로 건너뛰기

18.1 Oracle → PostgreSQL (ora2pg)

Oracle에서 PostgreSQL로 마이그레이션은 라이선스 비용·자유도·클라우드 친화 때문에 흔히 추진됩니다. 가장 표준적인 도구는 ora2pg(Perl 기반, GPL 오픈소스). ora2pg의 동작과 단계별 마이그레이션 절차를 정리합니다.

마이그레이션 전 평가​

ora2pg가 evaluation report 자동 생성합니다.

ora2pg 설치​

sudo dnf install -y perl-DBI perl-DBD-Oracle perl-DBD-Pg
# Oracle Instant Client 별도 설치 필요

# CPAN 또는 GitHub release
sudo cpan install Ora2Pg
# 또는
git clone https://github.com/darold/ora2pg.git
cd ora2pg && perl Makefile.PL && make && sudo make install

설정 — ora2pg.conf​

# Oracle 연결
ORACLE_DSN dbi:Oracle:host=oracle.example.com;sid=ORCL
ORACLE_USER scott
ORACLE_PWD tiger

# PostgreSQL 출력 (또는 직접 연결)
PG_DSN dbi:Pg:dbname=app_main;host=pg.example.com
PG_USER pgadmin
PG_PWD secret

# 출력
OUTPUT output.sql
TYPE TABLE # TABLE / DATA / TRIGGER / FUNCTION / 등

# 옵션
EXPORT_SCHEMA 1
SCHEMA APPSCHEMA
PG_SCHEMA public

# 데이터 일괄 처리
DATA_LIMIT 10000
BLOB_LIMIT 500
PARALLEL_TABLES 4

단계별 실행​

ora2pg는 type별로 여러 번 실행:

# 1. 평가 report
ora2pg -c ora2pg.conf -t SHOW_REPORT --estimate_cost > report.txt

# 2. 스키마 (DDL)
ora2pg -c ora2pg.conf -t TABLE -o tables.sql
ora2pg -c ora2pg.conf -t SEQUENCE -o sequences.sql
ora2pg -c ora2pg.conf -t INDEX -o indexes.sql
ora2pg -c ora2pg.conf -t VIEW -o views.sql
ora2pg -c ora2pg.conf -t TRIGGER -o triggers.sql
ora2pg -c ora2pg.conf -t FUNCTION -o functions.sql
ora2pg -c ora2pg.conf -t PROCEDURE -o procedures.sql

# 3. 데이터 (가장 오래)
ora2pg -c ora2pg.conf -t COPY # PG로 직접 적용
# 또는
ora2pg -c ora2pg.conf -t COPY -o data.sql

평가 report​

-------------------------------------------------------------------------------
Oracle Database Content Report -- ORA2PG_VERSION 25.0
-------------------------------------------------------------------------------
Object Number Invalid Estimated cost Comments
-------------------------------------------------------------------------------
TABLE 127 0 0
INDEX 341 0 0
TRIGGER 23 0 50 Note: 자동 변환 가능
PROCEDURE 89 0 800 Note: 일부 수동 변경 필요
FUNCTION 156 0 1200 Note: PL/SQL 패키지 의존
SEQUENCE 64 0 0
PACKAGE 34 0 950 Note: PostgreSQL은 package 미지원
SYNONYM 12 0 30
...
-------------------------------------------------------------------------------
Total 3030 3030 cost units

cost 1 unit은 기본 5분 작업량입니다(COST_UNIT_VALUE로 조정 가능). 3030 units는 약 250시간, 약 31 인일 수준입니다.

자동 변환되는 것​

OraclePostgreSQL
NUMBER(p)numeric(p)
VARCHAR2(n)varchar(n)
CLOBtext
BLOBbytea
DATEtimestamp
TIMESTAMP WITH TIME ZONEtimestamptz
sequence MYSEQ.NEXTVALnextval('myseq')
SYSDATEnow()
문자열 결합 연산자(파이프 두 개)같음
DECODE(...)CASE ... END
NVL(a, b)COALESCE(a, b)
ROWNUMLIMIT (또는 window function)
CONNECT BY (계층 쿼리)WITH RECURSIVE

ora2pg가 대부분 자동 변환합니다. 일부 PL/SQL은 수동 검토합니다.

자동 변환 어려운 것​

OraclePostgreSQL 대응
PACKAGE없음 — schema·function 묶음으로
TYPE BODYcomposite type + function
DBMS_*일부 — pg-equivalent 또는 application 로직
외부 procedureextension 또는 외부 service
Global temporary tableCREATE TEMP TABLE (세션 스코프 동일)
AUTONOMOUS_TRANSACTIONdblink 또는 PG의 BEGIN ... COMMIT 외부
MERGEPG 15+ MERGE 지원, 그 전엔 ON CONFLICT
MATERIALIZED VIEW LOGlogical replication 또는 trigger

EDB Postgres Advanced Server (EPAS)​

상용 배포본 — Oracle PL/SQL을 대부분 그대로 실행합니다. 마이그레이션 부담 ↓, 라이선스 비용 ↑.

측면PG + ora2pgEDB EPAS
비용무료EDB 라이선스
호환코드 재작성 필요Oracle PL/SQL 호환
미래표준 PG 길EDB 의존

데이터 마이그레이션 — 무중단 전환​

대용량은 full dump가 시간 너무 큽니다. 무중단 패턴:

1. 스키마 PG로 (ora2pg 자동)
2. 초기 데이터 COPY (대부분 시간 소요)
3. Oracle → PG의 CDC 시작 (Debezium·Striim·자체 trigger 기반)
4. application의 read를 점진 PG로
5. write도 PG로 cut-over
6. Oracle decommission

Oracle에서 PostgreSQL로 무중단 전환하는 흐름

대규모(TB 단위)에서는 3rd party 도구 추천 — Striim·Qlik Replicate·AWS DMS.

AWS DMS (Database Migration Service)​

AWS의 매니지드 마이그레이션 도구입니다. Oracle·SQL Server·MySQL을 PostgreSQL로 옮깁니다.

source endpoint (Oracle)
target endpoint (RDS PostgreSQL)
replication instance
task: full load + ongoing replication (CDC)

대용량 마이그레이션의 표준 옵션입니다.

application 변경​

영역변경
드라이버ojdbc → pgJDBC
connection string다름
Quoted identifierOracle은 모든 대문자, PG는 소문자 — 케이스 주의
empty string vs NULLOracle은 동일, PG는 다름 — 검증 필요
시퀀스 호출SELECT myseq.NEXTVAL FROM dual → SELECT nextval('myseq')
outer join(+) 대신 LEFT JOIN
hint/*+ INDEX(...) */ 동작 안 함 — pg_hint_plan

검증 — row count + checksum​

-- Oracle
SELECT count(*), sum(amount) FROM orders;

-- PostgreSQL — 같은 결과여야
SELECT count(*), sum(amount) FROM orders;

각 테이블마다 row count, sum, hash를 비교하고 자동화합니다.

cutover 절차​

  1. 애플리케이션 트래픽 일시 정지 (수 분)
  2. 마지막 변경 데이터 동기화
  3. 검증 쿼리 실행
  4. application connection을 PG로 전환
  5. read·write 정상 확인
  6. Oracle은 read-only로 두고 일정 기간 관찰
  7. Oracle decommission

정리​

ora2pg는 Oracle에서 PostgreSQL로 옮길 때의 표준 도구로, 평가 report의 cost unit(기본 1 unit = 5분)으로 작업량을 미리 산정합니다. 스키마·시퀀스·trigger·function은 대부분 자동 변환되지만 PACKAGE·DBMS_*·복잡한 PL/SQL은 수동 검토가 필요합니다.

  • 대용량 데이터는 CDC 기반 무중단 마이그레이션으로 진행합니다
  • application은 드라이버·시퀀스·quoting·outer join 등을 변경합니다