Skip to content

Latest commit

 

History

History
319 lines (237 loc) · 11.2 KB

README.adoc

File metadata and controls

319 lines (237 loc) · 11.2 KB

Ora2pg Migration Tool

Ora2pg는 Oracle Database 를 PostgreSQL Database 로 Migration 하는데 사용되는 무료 도구입니다.

Oracle Database 를 연결하고 자동으로 스캔하여 오브젝트와 데이터를 Export 하고 PostgreSQL에 Import 할 수 있는 SQL Scripts를 생성할 수 있습니다.

데이터 같은 경우 SQL Scripts로 Export 할 수도 있고, Oracle과 다이렉트 연결 하여 직접 데이터 Migration 을 할 수도 있습니다.

Oracle 함수, 프로시저, 패키지 및 트리거 등 Export 시 Oracle 의 특정 PL/SQL 코드는 PostgreSQL 의 PL/pgSQL 구문과 일치하는지 검토 해야합니다.

  • HyperSQL for PostgreSQL 표준 설치를 기준으로 가이드를 작성하였음.*

1. Postgresql Client 설치 또는 PostgreSQL Server 가 설치되어 있어야함
PostgreSQL 설치 방법

2. Oracle Instant Client 설치 또는 Oracle Server 가 설치되어 있어야함
* Oracle 다운로드 센터에서 다운로드 및 설치 ( Oracle Server 와 동일 버전으로 설치할 것 )

# rpm -ivh oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm

# rpm -ivh oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm

# rpm -ivh oracle-instantclient12.2-jdbc-12.2.0.1.0-1.x86_64.rpm

# rpm -ivh oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm

3. perl 모듈 설치

yum install -y perl-DBD-Pg perl perl-DBI  perl-CPAN git

4. 환경 변수 설정

4-1. hypersql 유저에게 sudo 권한 부여

# echo "hypersql  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers

4-2. hypersql 유저로 접속

#  su - hypersql

4-3. Oracle 환경 변수 설정

$ vi .bash_profile

export ORACLE_HOME=/usr/lib/oracle/12.2/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH

$ . .bash_profile

5. DBD::Oracle 설치

5-1. hypersql User 에서 실행 Enter 3번

$ sudo cpan -f -i DBD:Oracle

6. ora2pg Github 다운로드 및 설치

$ git clone https://github.com/darold/ora2pg.git
$ cd ora2pg/
$ perl Makefile.PL
$ make
$ sudo make install

1. Project 생성

$ ora2pg --project_base $Project_PATH --init_project $Project_NAME

2. Project 설정

Oracle Database Migration 전체 프로세스는 ora2pg.conf 파일 구성을 통해 이루어집니다.

해당 파일 형식은 대문자 지시어와 지시어 뒤 탭 문자와 값으로 구성됩니다.

지시어 같은 경우 ora2pg 바이너리 실행 시 옵션을 주면 config 에 지시어 값을 덮어 쓸 수 있습니다.

아래와 같은 형식으로 Oracle DSN 지시어 및 스키마 정보 등을 작성합니다.

# 기본 동작을 확인하기 위한 주요 파라미터 설정
$ vi ora2pg.conf

ORACLE_HOME $ORACLE_HOME
ORACLE_DSN  dbi:ORACLE:host=192.168.123.123;sid=DB_SID;port=1521
ORACLE_USER system
ORACLE_PWD  1234

SCHEMA TEST_SCHEMA

3. Oracle DSN 연결 확인

$ ora2pg -t SHOW_VERSION -c ora2pg.conf

[2022-08-11 11:27:47] Ora2Pg version: 23.1
[2022-08-11 11:27:47] Export type: SHOW_VERSION
[2022-08-11 11:27:47] Geometry export type: INTERNAL
[2022-08-11 11:27:47] ORACLE_HOME = /usr/lib/oracle/12.2/client64
[2022-08-11 11:27:47] NLS_LANG = AMERICAN_AMERICA.AL32UTF8
[2022-08-11 11:27:47] NLS_NCHAR = AL32UTF8
[2022-08-11 11:27:47] Trying to connect to database: dbi:Oracle:host=172.27.0.220;sid=hypersql;port=1521
[2022-08-11 11:27:47] Isolation level: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
[2022-08-11 11:27:47] Showing Database Version...
[2022-08-11 11:27:47] Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
ora2pg 는 모든 데이터베이스 object, 모든 function 및 procedure 를 검사하여 ora2pg 에서 자동으로 변환할 수 없는 일부 object 및 PL/SQL 코드가 있는지 검사합니다.

오브젝트 유형에 따른 비용을 할당 하고, 오브젝트의 총 수, 추가 설명 등 기타 세부 정보도 Ora2pg Migration Report 를 제공합니다.

Report 를 제공 받기 위해 수행 방법을 ora2pg.conf 파일에서 직접 설정할 수도 있고 ora2pg 바이너리 수행 시 옵션으로 설정할 수도 있습니다.

아래는 ora2pg 바이너리 수행 시 옵션에 대한 내용입니다. ora2pg.conf 파일에서 더 자세히 설정하고 싶다면 ASSESSMENT SECTION 을 참고하세요.
  • 수행 예시

ora2pg -c ora2pg.conf -t SHOW_REPORT --estimate_cost --dump_as_html --cost_unit_value 5 > report.html

ora2pg -c ora2pg.conf -t SHOW_TABLE > table.txt

ora2pg -c ora2pg.conf -t SHOW_COLUMN > columns.txt

--estimate_cost :

마이그레이션 비용 평가를 활성화합니다.
SHOW_REPORT TYPE 과 함께 사용해야 합니다.
FUNCTION, PROCEDURE, PACKAGE 및 QUERY Export TYPE 에만 설정할 수 있습니다.
기본값은 비활성화되어 있습니다.
이 지시문을 활성화하면 PLSQL_PGSQL이 강제로 활성화됩니다.

--dump_as_html :

마이그레이션 비용 평가가 활성화 되면 리포트가 단순한 텍스트로 남지만, 해당 옵션을 적용하면 HTML 형식으로 리포트를 저장할 수 있습니다.

--dump_as_csv      :

위와 같지만 CSV 형식으로 Report 를 덤프하도록 ora2pg를 실행합니다.

--dump_as_sheet    :

데이터베이스당 하나의 CSV 행으로 마이그레이션 평가를 보고합니다.

--cost_unit_value :

마이그레이션 비용 평가 단위의 값을 분 단위로 설정합니다.
기본값은 Unit 당 5분입니다.

Export 작업은 단일 구성 지시어 'TYPE’에 따라 수행됩니다.

TYPE Describtion

TABLE

indexes, primary keys, unique keys, foreign keys and check constraints 를 포함한 모든 table 을 추출합니다.

VIEW

views 만 추출합니다.

GRANT

Pg 그룹, 사용자 및 모든 개체에 대한 권한 부여로 변환된 역할을 추출합니다.

SEQUENCE

모든 sequence 와 마지막 위치를 추출합니다.

TABLESPACE

table 및 index에 대한 storage space 를 추출합니다(Pg >= v8).

TRIGGER

trigger 를 추출합니다.

FUNCTION

function 를 추출합니다.

PROCEDURE

procedure 를 추출합니다.

PACKAGE

packages / package bodies 를 추출합니다.

INSERT

INSERT 구문으로 data 를 추출합니다.

COPY

COPY 구문으로 data 를 추출합니다.

PARTITION

range / list Oracle partitions 을 subpartitions 과 함께 추출합니다.

TYPE

user defined Oracle type 을 추출합니다.

FDW

Export Oracle tables as foreign table for oracle_fdw.

MVIEW

Export materialized view.

QUERY

Try to automatically convert Oracle SQL queries.

KETTLE

Generate XML ktr template files to be used by Kettle.

DBLINK

Generate oracle foreign data wrapper server to use as dblink.

SYNONYM

Export Oracle’s synonyms as views on other schema’s objects.

DIRECTORY

Export Oracle’s directories as external_file extension objects.

LOAD

Dispatch a list of queries over multiple PostgreSQl connections.

TEST

perform a diff between Oracle and PostgreSQL database.

TEST_COUNT

perform a row count diff between Oracle and PostgreSQL table.

TEST_VIEW

perform a count on both side of number of rows returned by views.

TEST_DATA

perform data validation check on rows at both sides.

Usage: ora2pg [-dhpqv --estimate_cost --dump_as_html] [--option value]

아래 자료의 Ora2Pg usage 참고

https://ora2pg.darold.net/documentation.html#Optional
  • 수행 예시

ora2pg -p -t FUNCTION -o functions2.sql -b %namespace%/schema/functions -c %namespace%/config/ora2pg.conf
ora2pg -p -t PACKAGE -o packages.sql -b %namespace%/schema/packages -c %namespace%/config/ora2pg.conf
ora2pg -p -t PARTITION -o partitions.sql -b %namespace%/schema/partitions -c %namespace%/config/ora2pg.conf
ora2pg -p -t PROCEDURE -o procs.sql -b %namespace%/schema/procedures -c %namespace%/config/ora2pg.conf
ora2pg -p -t SEQUENCE -o sequences.sql -b %namespace%/schema/sequences -c %namespace%/config/ora2pg.conf
ora2pg -p -t SYNONYM -o synonym.sql -b %namespace%/schema/synonyms -c %namespace%/config/ora2pg.conf
ora2pg -p -t TABLE -o table.sql -b %namespace%/schema/tables -c %namespace%/config/ora2pg.conf
ora2pg -p -t TABLESPACE -o tablespaces.sql -b %namespace%/schema/tablespaces -c %namespace%/config/ora2pg.conf
ora2pg -p -t TRIGGER -o triggers.sql -b %namespace%/schema/triggers -c %namespace%/config/ora2pg.conf
ora2pg -p -t TYPE -o types.sql -b %namespace%/schema/types -c %namespace%/config/ora2pg.conf
ora2pg -p -t VIEW -o views.sql -b %namespace%/schema/views -c %namespace%/config/ora2pg.conf

4. ora2pg Project 내부 자동화 쉘 사용

  • Oracle 스키마 Export

자세한 내용은 쉘 스크립트 확인
./export_schema.sh
  • Export 후 스키마 전체 Import

자세한 내용은 쉘 스크립트 확인
./import_all.sh

DDL

Type

호환성

비고

GLOBAL TEMPORARY TABLE

X

INDEX

O

INDEX PARTITION

O

INDEX SUBPARTITION

O

TABLE

O

set default_tablespace 구문 추가 필요

TABLE PARTITION

O

TABLE SUBPARTITION

O

SEQUENCE

O

TRIGGER

X

FUNCTION

X

PROCEDURE

X

PACKAGE

X

데이터 이관시 주의 사항

TABLE SUBPARTITION HASH 은 PARTITION 마다 SUBPARTITION이 지정되어 있지 않다면, PARTITION에 해당되는 dummy_SUBPARTITION 을 생성

※ RANGE, LIST 무관 합니다.

## Range - HASH Partition table
CREATE TABLE SUB_PART
(
	COLUMN_1 NUMBER		NOT NULL,
	COLUMN_2 VARCHAR2(4),
	COLUMN_3 VARCHAR2(4),
	COLUMN_4 VARCHAR2(2),
	COLUMN_5 VARCHAR2(2),
	COLUMN_6 NUMBER
)
TABLESPACE TBS_hans
PARTITION BY RANGE ( COLUMN_3)
SUBPARTITION BY HASH ( COLUMN_5 )
(
	PARTITION P_200801 VALUES LESS THAN ('2007'),
	PARTITION P_200802 VALUES LESS THAN ('2008'),
	PARTITION P_200803 VALUES LESS THAN ('2009')
		(
		SUBPARTITION  P_200803_S1  ,
		 SUBPARTITION  P_200803_S2 ,
		 SUBPARTITION  P_200803_S3 ,
		 SUBPARTITION  P_200803_S4 ,
		 SUBPARTITION  P_200803_S5 ,
		 SUBPARTITION  P_200803_S6 ,
		 SUBPARTITION  P_200803_S7 ,
		 SUBPARTITION  P_200803_S8
		),
	PARTITION P_200804 VALUES LESS THAN ('2010')
);

위에 SQL문을 보셨을때 RANGE PARTITION 지정한 후 P_200803에 파티션에 대해서만 SUBPARTITION 을 지정을 했지만 해당 테이블 DDL을 export 하게 된다면 각각의 RANGE PARTITION에 대해 sub_part_p_200801_sys_subp633 등의 dummy_subpartition이 생성이 됩니다.

Invalid Objects

AS-IS ( Oracele ) 에서의 Invalid Object 들은 export 대상이 아닙니다.