MTK(Migration Tool Kit) | JeongKeepsCalm

MTK(Migration Tool Kit)

Oracle → EDB PostgreSQL Conversion

테스트 환경

  • Oracle 11g Express Edition
  • EDB PostgreSQL 16.4.0
  • migration toolkit 55.6.1

Oracle 스키마, 테이블, 프로시저, 트리거 생성

1
2
3
4
5
6
7
8
9
-- schema 
create user test_schema identified by 1234;
drop user test_schema cascade;

grant connect to test_schema;
grant create table to test_schema;
grant create trigger to test_schema;
grant create procedure to test_schema;
grant unlimited tablespace to test_schema;

오라클 11g는 Multitenant Architecture를 지원하지 않으므로 CDB(Container Database) 또는 PDB(Pluggable Database) 개념이 없다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- procedure
CREATE OR REPLACE PROCEDURE TEST_SCHEMA.add_test_data
IS
    -- 커밋 주기 설정 (10,000건마다 커밋)
    commit_count CONSTANT NUMBER := 10000; 
BEGIN
    FOR i IN 1..100000000 LOOP
        INSERT INTO test_table2 (id, name, created_at)
        VALUES (i, 'Name_' || i, SYSDATE);

        -- 주기적으로 커밋 수행
        IF MOD(i, commit_count) = 0 THEN
            COMMIT;
        END IF;
    END LOOP;

    -- 최종 커밋
    COMMIT; 
END;

-- procedure 실행
BEGIN
  TEST_SCHEMA.ADD_TEST_DATA;
END;
1
2
3
4
5
6
7
-- trigger
CREATE OR REPLACE TRIGGER test_schema.before_insert_trigger
BEFORE INSERT ON test_schema.test_table
FOR EACH ROW
BEGIN
    :NEW.created_at := SYSDATE;
END;


toolkit.propertries 파일 속성 변경

1
2
3
4
5
6
7
8
SRC_DB_URL=jdbc:oracle:thin:@localhost:1521:xe  # sid 일 경우 
jdbc:oracle:thin:@//localhost:1521/xepdb1       # service name 일 경우
SRC_DB_USER=test_schema
SRC_DB_PASSWORD=1234

TARGET_DB_URL=jdbc:edb://localhost:5444/edb
TARGET_DB_USER=enterprisedb
TARGET_DB_PASSWORD=1234


mtk 명령어

1
2
3
4
5
runMTK.bat -schemaOnly TEST_SCHEMA
runMTK.bat -dataOnly TEST_SCHEMA

# edb가 아닐경우 타겟 db 타입 명시 필요
runMTK.bat -targetdbtype postgresql -dataOnly ${스키마명}
원본 Oracle 데이터베이스 서버에 연결 중...
MTK-11009: Error Connecting Database "Oracle"
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

원본 Oracle 데이터베이스 서버에 연결 중...
Connected to Oracle, version 'Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production'
대상 EDB Postgres 데이터베이스 서버에 연결 중...
Exception in thread "main" java.lang.NoClassDefFoundError: com/edb/Driver

lib > ojdbc 추가
lib > edb-jdbc 추가

테이블, 제약조건, 트리거, 프로시져 모두 마이그레이션 되는 것 확인 완료!



추가 테스트

1. 스키마 내 특정 테이블 및 약 1억개 데이터 옮기기

1
runMTK.bat -tables TEST_TABLE2 TEST_SCHEMA
[test_schema.TEST_TABLE2] 테이블 데이터 로드 요약 정보 : 총 소요 시간(sec): 664.919 총 로드 행 수: 96060000 총 크기(MB): 4101.256
데이터 로드 요약 정보: 총 소요 시간(sec): 664.919 총 로드 행 수: 96060000 총 크기(MB): 4101.256
스키마 TEST_SCHEMA이(가) 성공적으로 임포트되었습니다.

마이그레이션 절차가 성공적으로 완료되었습니다.
Total Elapsed Migration Time (sec): 666.545


2. 파티셔닝된 테이블 옮기기

  • 파티셔닝은 Enterprise Edition 이상에서만 지원된다.
    • Standard Edition 또는 Express Edition이라면, 해당 Edition에서는 파티셔닝 기능을 사용할 수 없어 테스트 불가


3. 이미 옮겨진 데이터를 다시 마이그레이션 했을 경우

pk 제약 조건 위반 에러 발생

2024-11-21 15:22:07 MTK-17001: 테이블로 데이터 로딩중 오류 발생: test_schema.test_table: {1}
DB-23505: com.edb.util.PSQLException: 오류: 중복된 키 값이 "sys_c006997" 고유 제약 조건을 위반함
  Detail: (id)=(1) 키가 이미 있습니다.
  Where: COPY test_table, 1번째 줄: "1	Alice	2024-11-21 10:02:36.0"
2024-11-21 15:22:07 Stack Trace:
com.edb.MTKException: MTK-17001: 테이블로 데이터 로딩중 오류 발생: test_schema.test_table: {1}
DB-23505: com.edb.util.PSQLException: 오류: 중복된 키 값이 "sys_c006997" 고유 제약 조건을 위반함
  Detail: (id)=(1) 키가 이미 있습니다.
  Where: COPY test_table, 1번째 줄: "1	Alice	2024-11-21 10:02:36.0"
	at com.edb.DataLoader.loadDataInFastMode(DataLoader.java:1056) [edb-migrationtoolkit.jar:?]
	at com.edb.DataLoader.run(DataLoader.java:345) [edb-migrationtoolkit.jar:?]
	at java.lang.Thread.run(Thread.java:750) [?:1.8.0_431]
Caused by: com.edb.util.PSQLException: 오류: 중복된 키 값이 "sys_c006997" 고유 제약 조건을 위반함
  Detail: (id)=(1) 키가 이미 있습니다.
	... 1 more


✅ 해결 방안

1
2
# 기존 데이터를 지우고 다시 삽입한다.
runMTK.bat -tables TEST_TABLE -dataOnly -truncLoad TEST_SCHEMA


4. 모든 스키마 삭제 후 스키마 재생성

1
2
3
4
5
# 모든 스키마 삭제 후 스키마 재생성
runMTK.bat -schemaOnly -dropSchema true TEST_SCHEMA

# 해당 테이블에만 데이터를 옮긴다.
runMTK.bat -dataOnly -tables TEST_TABLE TEST_SCHEMA


5. 유저 정보 옮기기

권한 부족 에러 발생

MTK-12001: 권한이 부족하여 사용자/역할 마이그레이션이 실패했습니다.
다음 Oracle 카탈로그에서 사용자에게 SELECT 권한을 부여하십시오.
DBA_ROLES
DBA_USERS
DBA_TAB_PRIVS
DBA_PROFILES
DBA_ROLE_PRIVS
ROLE_ROLE_PRIVS
DBA_SYS_PRIVS


✅ 해결 방안

sysdba 권한으로 접속하여 권한 부여

1
2
3
4
5
6
7
8
9
sqlplus sys as sysdba

GRANT SELECT ON DBA_ROLES TO test_schema;
GRANT SELECT ON DBA_USERS TO test_schema;
GRANT SELECT ON DBA_TAB_PRIVS TO test_schema;
GRANT SELECT ON DBA_PROFILES TO test_schema;
GRANT SELECT ON DBA_ROLE_PRIVS TO test_schema;
GRANT SELECT ON ROLE_ROLE_PRIVS TO test_schema;
GRANT SELECT ON DBA_SYS_PRIVS TO test_schema;
1
runMTK.bat -allUsers -schemaOnly -skipUserSchemaCreation TEST_SCHEMA

오라클에서 유저는 스키마와 일대일로 매핑된다.