
최근 Oracle 11 에 있는 데이터를 Postgresql 18 로 옮기는 작업을 업무를 했습니다.
이때 ora2pg 라는 도구를 docker 를 통해서 사용해봤는데 굉장히 좋았습니다.
제가 업무에서 사용했던 방법을 이 게시물에 기록합니다.
OS: Window 11 ProWSL2 + Docker Desktop 설치CLI TOOL: Window Powershell\ 로 바꿔서 사용하시면 됩니다.Oracle DB --> Postgresql DB 1:1 로 매칭되는 테이블 생성Oracle DB --> Postgresql DB 로 매핑된 테이블에 데이터 COPYora2pg 쉽게 사용하기 위해서 컨테이너 이미지를 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 는 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가지 작업에서 모두 사용됩니다. 잘 작성하시기 바랍니다!
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
$env:PGPASSWORD="postgres" # 환경변수를 통한 Postgresql 비번 설정
psql -h localhost -U postgres -d postgres -f postgre_ddl.sql
아래와 같이 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문 보다 빠릅니다!