[DB] Oracle To Postgresql Migration - ora2pg 사용법

식빵·2026년 4월 24일

postgresql-memo

목록 보기
40/40
post-thumbnail

최근 Oracle 11 에 있는 데이터를 Postgresql 18 로 옮기는 작업을 업무를 했습니다.
이때 ora2pg 라는 도구를 docker 를 통해서 사용해봤는데 굉장히 좋았습니다.
제가 업무에서 사용했던 방법을 이 게시물에 기록합니다.


🖥️ 작업 환경

  • OS: Window 11 Pro
  • WSL2 + Docker Desktop 설치
  • CLI TOOL: Window Powershell
    • 참고로 Window Powershell 은 new line 이 백틱 `(=백틱) 입니다.
    • bash 쓰시는 분들은 아래에서 백틱을 \ 로 바꿔서 사용하시면 됩니다.

🎯 목표

  1. Oracle DB --> Postgresql DB 1:1 로 매칭되는 테이블 생성
  2. Oracle DB --> Postgresql DB 로 매핑된 테이블에 데이터 COPY

🍞 docker image pull

ora2pg 쉽게 사용하기 위해서 컨테이너 이미지를 pull 합니다.

인터넷 되는 환경

docker pull georgmoser/ora2pg

인터넷 안되는 환경

# 1. 인터넷 되는 환경에서 아래처럼 하고...
docker pull georgmoser/ora2pg
docker save georgmoser/ora2pg -o ora2pg.tar

# 2. 생성된 ora2pg.tar 파일을 USB 를 통해 옮긴 후에 아래처럼 이미지 load
docker load -i ora2pg.tar



🍞 ora2pg.conf 작성

ora2pg 는 ora2pg.conf 라는 설정파일을 통해서 전반적인 작업 내역을
작성할 수 있습니다. 저는 아래와 같이 작성해봤습니다.

# Oracle 접속 정보
ORACLE_DSN      dbi:Oracle:host=192.168.56.10;sid=XE;port=1521
ORACLE_USER     system
ORACLE_PWD      system

# ORACLE 소스 스키마 및 테이블
SCHEMA          MY_SCHEMA

# ORACLE 스키마에서 추출할 테이블 선정 (Optional), 안 하면 전부 타겟팅
# TABLES          MY_TB1,MY_TB2

# PostgreSQL 접속 정보
PG_DSN          dbi:Pg:dbname=bo_db;host=192.168.56.11;port=5432;password=postgres
PG_USER         postgres
PG_PWD          postgres

# (중요) PG_SCHEMA 에 작성된 스키마는 반드시 DB 에 미리 생성해놔야 합니다
PG_SCHEMA       public
PG_VERSION      18


# (중요) ora2pg 기본적으로 Oracle 에서 Precision 정보가 없는 Number 타입을 
# postgres 의 BIGINT 타입으로 전환합니다. 이를 방지하기 위해서 아래처럼 작성합니다.
DEFAULT_NUMERIC     numeric


# Oracle -> Postgresql 테이블 이름 매핑 (필요하면)
# REPLACE_TABLES  MY_TB1:MY_POST_TB1

# 여러개 하려면 띄워쓰기로 연달아서 작성
# REPLACE_TABLES  MY_TB1:MY_POST_TB1 MY_TB2:MY_POST_TB2

# 데이터만 복사 (테이블 건드리지 않음)
DROP_TABLE      0 # 테이블 DROP 안함!
TRUNCATE_TABLE  0 # truncate 도 안함!
DATA_LIMIT      10000 # (기본값) 10000 개씩 트랜잭션 커밋

잘모르겠지만 PG_PWD 가 안 먹혀서 PG_DSN 에서 password=root 를 추가했습니다.

ora2pg 설정 파일 작성법을 더 알고 싶다면 아래 링크를 참고하세요.
https://github.com/darold/ora2pg

이 설정 파일은 추후에 ora2pg 명령어를 통해서 DDL 추출데이터 COPY
2가지 작업에서 모두 사용됩니다. 잘 작성하시기 바랍니다!


🍞 Postgresql DDL 추출

Oracle DB 테이블과 매칭되는 Postgresql DB 테이블들을 생성하기 위해서
DDL 을 먼저 추출하겠습니다. 앞서 작성한 ora2pg.conf 파일을 사용해서 말이죠.

아래와 같이 docker 로 ora2pg 를 실행합니다.

docker run --rm `
  -v ${PWD}/ora2pg.conf:/etc/ora2pg/ora2pg.conf `
  -v ${PWD}/output:/data `
  georgmoser/ora2pg `
  sh -c "ora2pg -t TABLE -c /etc/ora2pg/ora2pg.conf -o /data/postgre_ddl.sql"

이러면 output/postgre_ddl.sql 파일이 생성되니 가볍게 내용을 참고하시길 바랍니다.
참고로 Oracle DB 에서 데이터가 많은 테이블의 경우에는 CREATE UNLOGGED TABLE
문으로 작성됩니다.

참고로 DDL 에 Primary key, index 등의 생성문도 있는데, 이를 원하지 않으면
아래 powershell 명령어로 지우세요!

Get-Content postgre_ddl.sql |
Where-Object {
	$_ -notmatch '^CREATE INDEX' -and $_ -notmatch 'ADD PRIMARY KEY'
} | Set-Content postgre_ddl_fix.sql

🍞 Postgresql Table 생성

$env:PGPASSWORD="postgres" # 환경변수를 통한 Postgresql 비번 설정
psql -h localhost -U postgres -d postgres -f postgre_ddl.sql

🍞 Oracle -> Postgresql COPY

아래와 같이 docker 로 ora2pg 를 실행합니다.

docker run --rm `
  -v ${PWD}/ora2pg.conf:/etc/ora2pg/ora2pg.conf `
  georgmoser/ora2pg `
  ora2pg -t COPY -c /etc/ora2pg/ora2pg.conf

POSTGRESQL COPY 명령어를 사용하므로 일반적인 INSERT 문 보다 빠릅니다!



✨ 참고 링크

profile
백엔드 개발자로 일하고 있는 식빵(🍞)입니다.

0개의 댓글