EDB에서 제공하는 Migration Tool Kit
소스는 Oracle, Mysql , EDB , PG 다 될 수 있고, 타겟은 EDB만 가능
사용가능 DBMS
• PostgreSQL versions 9.5, 9.6, 10,11, and 12 • Advanced Server versions 9.5, 9.6, 10,11 and 12 • Oracle 10g Release 2 • Oracle 11g Release 2 • Oracle 12c Release 1 • SQL Server 2008 • SQL Server 2012 • SQL Server 2014 • MySQL 5.5.36 • Sybase Adaptive Server Enterprise 15.7 |
필요 요구사항 : 자바 1.7이상
EDB 사이트 가입 아이디 필요 (설치 시에 물어 봄)
EDB owner(enterprisedb) Oracle Client 필요.
1. JAVA 설치 (root 유저)
Linux Java 압축 해제
tar xvfz jdk-8u241-linux-x64.tar.gz
Linux를 rpm으로 설치 한 게 아니라서 패스에 등록하기 위한 디렉터리 생성 및 java 파일 이동
mkdir /usr/local/JDK
mv jdk1.8.0_241 /usr/local/JDK/
Java Path 등록
vi /etc/profile (파일 제일 밑에 다음 추가)
#JDK Path
export JAVA_HOME=/usr/local/JDK/jdk1.8.0_241
export PATH=$PATH:$JAVA_HOME/bin
서버 Rebooting 없이 Java 패스 적용
source /etc/profile
Java 확인
which java
/usr/local/JDK/jdk1.8.0_241/bin/java
java -version
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)
2. MTK 설치 (root 유저)
unzip edb-migrationtoolkit-51.0.1-1-linux-x64.run.zip
chmod 777 edb-migrationtoolkit-51.0.1-1-linux-x64.run
./edb-migrationtoolkit-51.0.1-1-linux-x64.run
설치는 영어로 하고, 설치 중간에 EDB 가입 이 메일과 비번 물어보면 입력
기본 설치 경로는 /opt/edb/mtk
소스와 타겟 정보를 설정해 주는 파일 백업
cd /opt/edb/mtk/etc
cp toolkit.properties toolkit.properties.bak (혹시 모르니 백업)
소스와 타겟 DB 설정
vi toolkit.properties (소스,타겟 수정)
소스 : 192.168.56.200 / ora11g / SH유저의 데이터 마이그레이션 예정
타겟 : 192.168.56.110 / tpch DB로 sh 스키마로 데이터 이전 예정
RC_DB_URL=jdbc:oracle:thin:@192.168.56.200:1511:ora11g SRC_DB_USER=system SRC_DB_PASSWORD=oracle TARGET_DB_URL=jdbc:edb://192.168.56.110:5444/tpch TARGET_DB_USER=sh TARGET_DB_PASSWORD=sh |
기타 DB 설정 참고
다른 예) ex) EDB와 PG만 source/target 다 되고 나머지 Oracle,Mysql은 source만 가능 [PG] SRC_DB_URL=jdbc:postgresql://192.168.56.110:5411/postgres SRC_DB_USER=postgres SRC_DB_PASSWORD=root TARGET_DB_URL=jdbc:postgresql://192.168.56.110:5411/postgres TARGET_DB_USER=postgres TARGET_DB_PASSWORD=root [Oracle] SRC_DB_URL=jdbc:oracle:thin:@192.168.56.200:1511:ora11g SRC_DB_USER=sh SRC_DB_PASSWORD=sh [Mysql] SRC_DB_URL=jdbc:mysql://192.168.56.100[:5432]/tpch SRC_DB_USER=soe SRC_DB_PASSWORD=soe |
소스가 Oracle인데 오라클 jar 파일 없으니 다음 파일 업로드 후에 /opt/edb/mtk/lib에 넣어 줌
[root@pgmechine lib]# pwd
/opt/edb/mtk/lib
[root@pgmechine lib]# ls
commons-lang3-3.1.jar edb-commons.jar edb-jdbc17.jar log4j-1.2.17.jar ojdbc6.jar ojdbc7.jar ojdbc8.jar
3. MTK 사용 (root 유저)
cd /opt/edb/mtk/bin
3.1 스키마만 먼저 conversion
./runMTK.sh -schemaOnly SH <-- 유저 명 대문자
3.2 스키마는 다 만들어 졌으니 data만 conversion
./runMTK.sh -dataOnly -fastCopy SH <-- fastCopy는 벌크 로딩으로 속도를 빠르게 하기 위함
CLOB 테이블은 마이그레이션 하는데 다음과 같은 에러 남
Loading Large Objects into table: TEST_CLOB ...
MTK-17001: Error Loading Data into Table: TEST_CLOB
DB-42501: com.edb.util.PSQLException: ERROR: permission denied for relation pg_class
LOB는 fastCopy를 사용하지 못하고 copyViaDBLinkOra를 사용해서 넣어야 함.
3.3 LOB를 가져오기 위해서는 EDB가 기동 될 때 오라클 클라이언트를 물고 기동해야 한다.
오라클 클라이언트 설치 (enterprisedb 유저)
su - enterprisedb
unzip instantclient-basic-linux.x64-19.5.0.0.0dbru.zip
unzip instantclient-sqlplus-linux.x64-19.5.0.0.0dbru.zip
unzip instantclient-sdk-linux.x64-19.5.0.0.0dbru.zip
cd ~
vi .bash_profile
export ORACLE_HOME=/home/enterprisedb/instantclient_19_5 export TNS_ADMIN=/home/enterprisedb/instantclient_19_5 export PATH=$PATH:$ORACLE_HOME export LD_LIBRARY_PATH=$ORACLE_HOME |
3.4 EDB postgresql.conf에 환경변수 oracle_home 설정
vi postgresql.conf
oracle_home ='/home/enterprisedb/instantclient_19_5' |
EDB 재 기동
3.5 Error났던 LOB 테이블만 다시 데이터 밀어 넣기
./runMTK.sh -dataOnly -copyViaDBLinkOra -tables TEST_CLOB SH <-- 테이블 명, 유저 명 대문자
혹시 이 명령어 수행하다가 아래와 같은 에러 나면
MTK-11014: Error connecting to DBLinkOra DB-HV00N: com.edb.util.PSQLException: ERROR: unable to load OCI library: libnnz19.so: cannot open shared object file: No such file Hint: Either the oracle_home guc setting or Oracle library must be in path at the time you start the server. |
enterprisedb 유저의 ORACLE_HOME 설정 과 postgresql.conf에 oracle_home 설정이 제대로 되어 있는지 확인하고, 제대로 되어 있는데도 에러가 나면 수동으로 enterprisedb 재 기동 해줌
서버 start시에 자동으로 edb가 기동되게 되어 있는데 이때 환경변수나 postgresql.conf를 잘 못 읽어 가는 듯 함.
./runMTK.sh -dataOnly -copyViaDBLinkOra -tables TEST_CLOB SH
수행 중 아래 에러가 또 발생 함. LOB를 가져오기 위해서는 super 유저 권한이 필요 함.
MTK-11014: Error connecting to DBLinkOra DB-42501: com.edb.util.PSQLException: ERROR: must be superuser to use dblink_ora |
enterprisedb로 로그인해서 superuser 권한을 SH에게 부여
alter user sh with superuser ; |
./runMTK.sh -dataOnly -copyViaDBLinkOra -tables TEST_CLOB SH --> 정상적으로 마이그레이션이 됨.
4. 다른 유저로 데이터 넘기기
기본적으로 MTK를 사용하면 오라클의 스키마와 같은 스키마로 데이터를 마이그레이션 한다.
SH 유저에 superuser 권한이 부여 되어 있는 상태이니 toolkit.properties 파일은 수정하지 않고 오라클의 SH 유저의 테이블을 EDB의 soe 유저로 옮기는 테스트를 진행해 본다.
넘어 가는 지만 테스트 하면 되니, 일반 테이블과 LOB 테이블 두 개만 테스트 해 보기로 ...
create tablespace tbs2 location '/edb10.5/tbs2' ; create user soe identified by soe ; create database tpcc owner soe tablespace tbs2 ; |
./runMTK.sh -schemaOnly -targetSchema soe -tables CHANNELS,TEST_CLOB SH
toolkit.properties파일에는 EDB 로그인을 SH 유저로 하고 , targetschema는 soe로 했더니
pg_tables를 조회해 보면 chanels와 test_clob 테이블의 스키마는 soe로 되었지만, table_owner는 sh로 됨.
LOB 데이터도 넘겨야 하니 EDB에서 superuser 권한을 soe에게 주고 toolkit.properties 파일의 EDB 로그인 유저를 soe로 바꿔서 다시 수행해 보자.
alter user soe with superuser ; |
SRC_DB_URL=jdbc:oracle:thin:@192.168.56.200:1511:ora11g SRC_DB_USER=system SRC_DB_PASSWORD=oracle TARGET_DB_URL=jdbc:edb://192.168.56.110:5444/tpcc TARGET_DB_USER=soe TARGET_DB_PASSWORD=soe |
./runMTK.sh -schemaOnly -targetSchema soe -tables CHANNELS,TEST_CLOB SH
정상적으로 schema및 tableowner가 soe로 생성 됨.
이제 데이터 넣어보기
./runMTK.sh -dataOnly -fastCopy -targetSchema soe -tables CHANNELS SH
./runMTK.sh -dataOnly -copyViaDBLinkOra -targetSchema soe -tables TEST_CLOB SH
두 개의 테이블 모두 정상적으로 데이터가 들어 감.
5. 스키마의 여러 테이블 중에서 특정 테이블만 넘기기
scott의 여러 테이블 중에서 2개의 테이블만 넘기고자 한다면
./runMTK.sh -tables EMP,DEPT SCOTT
******************** Migration Summary ********************
Tables: 2 out of 2
Total objects: 2
Successful count: 2
Failed count: 0
Invalid count: 0
*************************************************************
위와 같이 넘기면 오로지 테이블 생성과 테이블 데이터만 넘어감. emp와 dept는 각자 PK와 FK를 가지고 있으며, PK에 해당하는 인덱스가 존재 함.
SQL> select constraint_name , table_name , constraint_type from user_constraints ; CONSTRAINT_NAME TABLE_NAME C ------------------------------ ------------------------------ - FK_DEPTNO EMP R PK_DEPT DEPT P PK_EMP EMP P |
SQL> create index emp_idx01 on emp ( empno , sal ) ; Index created. SQL> select index_name , table_name from user_indexes ; INDEX_NAME TABLE_NAME ------------------------------ ------------------------------ PK_EMP EMP EMP_IDX01 EMP PK_DEPT DEPT |
제약 조건 및 인덱스를 생성하고자 다음과 같이 옵션을 주고 다시 시도하면
./runMTK.sh -indexes -constraints -tables EMP,DEPT SCOTT
******************** Migration Summary ********************
Tables: 2 out of 2
Constraints: 3 out of 3
Indexes: 1 out of 1
Total objects: 6
Successful count: 6
Failed count: 0
Invalid count: 0
*************************************************************
위의 결과를 보면 인덱스는 1개 만 마이그레이션 된 것 처럼 보이지만 대한 언급은 없지만 실제 EDB에서 조사를 해 보면 PK에 해당하는 인덱스가 생성 됨
tiger=> /c tiger scott tiger=> \d List of relations Schema | Name | Type | Owner --------+------+-------+------- scott | dept | table | scott scott | emp | table | scott (2 rows) tiger=> \dt+ List of relations Schema | Name | Type | Owner | Size | Description --------+------+-------+-------+------------+------------- scott | dept | table | scott | 8192 bytes | scott | emp | table | scott | 8192 bytes | (2 rows) tiger=> \di List of relations Schema | Name | Type | Owner | Table --------+-----------+-------+-------+------- scott | emp_idx01 | index | scott | emp scott | pk_dept | index | scott | dept scott | pk_emp | index | scott | emp (3 rows) tiger=> \d+ emp Table "scott.emp" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ----------+-----------------------------+-----------+----------+---------+----------+--------------+------------- empno | numeric(4,0) | | not null | | main | | ename | character varying(10) | | | | extended | | job | character varying(9) | | | | extended | | mgr | numeric(4,0) | | | | main | | hiredate | timestamp without time zone | | | | plain | | sal | numeric(7,2) | | | | main | | comm | numeric(7,2) | | | | main | | deptno | numeric(2,0) | | | | main | | Indexes: "pk_emp" PRIMARY KEY, btree (empno) "emp_idx01" btree (empno, sal) Foreign-key constraints: "fk_deptno" FOREIGN KEY (deptno) REFERENCES dept(deptno) tiger=> \d+ dept Table "scott.dept" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description --------+-----------------------+-----------+----------+---------+----------+--------------+------------- deptno | numeric(2,0) | | not null | | main | | dname | character varying(14) | | | | extended | | loc | character varying(13) | | | | extended | | Indexes: "pk_dept" PRIMARY KEY, btree (deptno) Referenced by: TABLE "emp" CONSTRAINT "fk_deptno" FOREIGN KEY (deptno) REFERENCES dept(deptno) tiger=> |
6. MTK 옵션
Feature: | Section | Relevant Options: |
Offline Migration | 7.1 | -offlineMigration |
Import Options | 7.2 | -sourcedbtype, -targetdbtype, -schemaOnly, -dataOnly |
Schema Creation Options | 7.3 | -dropSchema, -targetSchema |
Schema Object Selection Options | 7.4 | -allTables, -tables, -constraints, -ignoreCheckConstFilter, -skipCKConst, -skipFKConst, -skipColDefaultClause, -indexes, -triggers, -allViews, -views, -allSequences, -sequences, -allProcs, -procs, -allFuncs, -funcs, -checkFunctionBodies, -allPackages, -packages, -allRules, |
Migration Options | 7.5 | -truncLoad, -enableConstBeforeDataLoad, -retryCount, -safeMode, -fastCopy, -analyze, vacuumAnalyze, -replaceNullChar, -copyDelimiter, -batchSize, -cpBatchSize, -fetchSize, -filterProp -customColTypeMapping, -customColTypeMappingFile |
Oracle Specific Options | 7.6 | -allUsers, -users, -importPartitionAsTable, -objectTypes, -copyViaDBLinkOra, -allDBLinks -allSynonyms, -allPublicSynonyms, -allPrivateSynonyms, -useOraCase |
Miscellaneous Options | 7.7 | -help, -logDir, -logFileCount, -logFileSize, -logBadSQL -verbose, -version |