| 난이도 : 초급 Sailaja Navvluru, Software Engineer, IBM Hardik Patel, Software Engineer, IBM
2008 년 8 월 19 일 IBM®
Migration Toolkit의 기능이 향상되어 MySQL에서 DB2® 또는 Informix® Dynamic Server로
마이그레이션하는 데 새로운 기능이 포함되었습니다. 이 기술 자료에서는 툴킷을 사용하여 DDL 및 DML 문을 마이그레이션하는
방법과 데이터 유형 매핑 방법을 소개합니다.
MySQL 마이그레이션 지원
2007
년 초 IBM Migration Toolkit 2.0.2.0(MTK)은 MySQL 4.x, 5.x로부터 DB2 및
Informix Dynamic Server(IDS) 대상으로의 제한된 마이그레이션 지원을 구현했다. 이후 계속되는 MTK의
분기별 릴리스가 초기 지원에 추가되었다. 이러한 향상된 지원에는 일부 DDL 및 DML 문의 마이그레이션이 포함되어 있다.
MTK는 다음 MySQL SQL 문의 전체 변환을 지원한다.
- CREATE TABLE 문
- CREATE INDEX 문
MTK는 또한 다음 MySQL SQL 문을 대부분 지원한다.
- INSERT 문
- ALTER TABLE 문
- DROP TABLE 문
- SELECT 문
- DELETE 문
- UPDATE 문
다음 절에서는 먼저 MySQL을 DB2로 마이그레이션한 다음 MySQL에서 IDS로 마이그레이션할 때 이 지원의 역할에 대해 알아본다.
Part 1: MySQL에서 DB2로의 마이그레이션 지원
MySQL로부터의 마이그레이션은 DB2 Database for Linux®, UNIX®, Windows® 버전 8.2 이상 및
DB2 Database for iSeries® V5R3 또는 V5R4로만 지원된다. 이 기술 자료에서는 DB2 Database
for Linux, UNIX, Windows에 대한 MTK 지원을 주로 다룬다.
CREATE TABLE 문
CREATE TABLE 문 지원에는 MySQL InnoDB 엔진에서 지원되는 모든 구문의 변환이 포함된다. 여기에는 데이터 유형
매핑, 데이터 추출 및 DB2로의 데이터 배포가 포함되어 있다. 또한 MTK는 구문이 비슷한 MyISAM 엔진을 지원한다.
MyISAM 엔진에 적용할 수 있는 spatial 유형은 지원되지 않는다.
표 1에서는 MySQL 데이터 유형이 DB2 데이터 유형에 매핑되는 방식을 보여준다. 또한 특정 데이터 유형에 대한 선택적 매핑(MTK에서 선택한 기본 매핑을 사용자가 다시 정의하는 데 사용할 수 있음)을 보여준다.
표 1. 데이터 유형 매핑
MySQL 데이터 유형 | DB2 데이터 유형 |
---|
TINYINT | SMALLINT |
---|
SMALLINT | SMALLINT |
---|
MEDIUMINT | INTEGER |
---|
INT | INTEGER |
---|
INTEGER | INTEGER |
---|
BIGINT | BIGINT |
---|
REAL | DOUBLE |
---|
DOUBLE | DOUBLE |
---|
FLOAT | DOUBLE |
---|
DECIMAL(p,s)
Where: s > 0 && p >= s
s > 0 && p < s s
< 0 |
DECIMAL(min(p,31), min(s,31)) DECIMAL(min(p,31),
min(s,31)) DECIMAL(min(p,31),0) |
---|
NUMERIC(p,s)
Where: s > 0 && p >= s
s > 0 && p < s s
< 0 |
DECIMAL(min(p,31), min(s,31)) DECIMAL(min(p,31),
min(s,31)) DECIMAL(min(p,31),0) |
---|
TINYINT UNSIGNED | SMALLINT |
---|
SMALLINT UNSIGNED | INTEGER
optional: SMALLINT |
---|
MEDIUMINT UNSIGNED | INTEGER |
---|
INT UNSIGNED | BIGINT
optional: INTEGER |
---|
BIGINT UNSIGNED | DECIMAL(20,0)
optional: BIGINT |
---|
REAL UNSIGNED | DOUBLE
optional: DOUBLE |
---|
DOUBLE UNSIGNED | DECIMAL(p,s) |
---|
FLOAT UNSIGNED | DOUBLE |
---|
DECIMAL UNSIGNED | DECIMAL(p,s) |
---|
NUMERIC UNSIGNED | DECIMAL(p,s) |
---|
DATE | DATE |
---|
TIME | TIME |
---|
TIMESTAMP | TIMESTAMP |
---|
DATETIME | TIMESTAMP
optional: TIME |
---|
YEAR | CHAR(4) |
---|
CHAR(l) | CHAR(l)
optional: VARCHAR |
---|
VARCHAR(l) | VARCHAR(l)
optional: CLOB |
---|
TINYBLOB | BLOB(255) |
---|
BLOB | BLOB(65535) |
---|
MEDIUMBLOB | BLOB(16777215) |
---|
LONGBLOB | BLOB(2000000000) |
---|
TINYTEXT | CLOB(255) |
---|
TEXT | CLOB(65535) |
---|
MEDIUMTEXT | CLOB(16777215) |
---|
LONGTEXT | CLOB(2000000000) |
---|
Listing 1a와 1b에서는 MySQL 데이터 유형 및 create table이 DB2로 변환되는 방식을 보여준다.
Listing 1a. MySQL SQL - CREATE TABLE
CREATE TABLE tab1 ( col1 CHAR(20), col2 VARCHAR(30), col3 SMALLINT(20), col4 TINYINT(30), col5 MEDIUMINT(20), col6 INT(10), col7 INTEGER(20), col8 BIGINT(20), col9 REAL, col10 DOUBLE, col11 FLOAT, col12 DECIMAL(10,4), col13 NUMERIC(10,4), col14 DATE, col15 TIME, col16 TIMESTAMP, col17 DATETIME, col18 YEAR, col19 BIT ); |
Listing 1b. MTK 변환 - CREATE TABLE
CREATE TABLE tab1( col1 CHAR(20), col2 VARCHAR(30), col3 SMALLINT, col4 SMALLINT, col5 INTEGER, col6 INTEGER, col7 INTEGER, col8 BIGINT, col9 DOUBLE, col10 DOUBLE, col11 DOUBLE, col12 DECIMAL(10,4), col13 DECIMAL(10,4), col14 DATE, col15 TIME, col16 TIMESTAMP, col17 TIMESTAMP, col18 CHAR(4), col19 SMALLINT ); |
MTK
는 모든 열 레벨과 테이블 레벨 제약 조건을 일대일로 매핑되는 해당 DB2로 변환한다. 일대일로 매핑되는 것이 없는 경우
MTK는 구문을 DB2의 해당 기능으로 매핑하거나 경고를 내보낸다. Listing 2a에서는 AUTO_INCREMENT 변환을
표시한다.
Listing 2a. MySQL SQL - increment 함수
CREATE TABLE tab2( col1 INTEGER NOT NULL AUTO_INCREMENT, col2 CHAR(20) NOT NULL, PRIMARY KEY (col1) );
|
주: AUTO
INCREMENT: integer 열에 추가 속성인 AUTO_INCREMENT를 사용할 수 있다. 인덱싱된
AUTO_INCREMENT 열에 NULL(권장됨) 또는 0 값을 삽입하면 열이 다음 시퀀스 값으로 설정된다. 일반적으로 이 값은
현재 테이블에 있는 열에서 가장 큰 값인 값+1이 된다. AUTO_INCREMENT 시퀀스는 1부터 시작된다.
Listing 2b. MTK 변환 - increment 함수
CREATE TABLE tab2( col1 INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL, col2 CHAR(20) NOT NULL, PRIMARY KEY(col1) );
|
주: GENERATED
ALWAYS AS IDENTITY: identity 열은 DB2에서 테이블에 추가될 각 행에 대해 고유한 숫자 값을 자동으로
생성할 수 있게 한다. 테이블에 추가될 각 행을 고유하게 식별해야 하는 경우 테이블을 만들 때 테이블에 identity 열을
추가할 수 있다. 테이블에 추가될 각 행에 대한 고유한 숫자 값을 생성하려면 identity 열에 고유한 인덱스를 정의하거나
해당 열을 primary key로 선언해야 한다.
Listing 3a. MySQL SQL - PRIMARY KEY
CREATE TABLE tab3 ( col1 INT NOT NULL col2 DATE UNIQUE, col3 FLOAT PRIMARY KEY, col4 INTEGER REFERENCES tab1(col1) ON DELETE CASCADE, );
|
Listing 3b. MTK 변환(일대일 매핑) - PRIMARY KEY
CREATE TABLE tab3( col1 INTEGER NOT NULL, col2 DATE NOT NULL UNIQUE, col3 DOUBLE NOT NULL PRIMARY KEY, col4 INTEGER REFERENCES tab1(col1) ON DELETE CASCADE );
|
MySQL은 KEY 열이 있는 테이블 문을 생성하는데 하나의 작업이 KEY 열에서 별개의 DB2 문 두 개, 즉 CREATE TABLE 문과 CREATE INDEX로 변환된다.
Listing 4a. MySQL - KEY
CREATE TABLE tab4 ( empid INTEGER NOT NULL AUTO_INCREMENT, empname CHAR(20) NOT NULL, KEY (empname) );
|
Listing 4b. MTK 변환(일대일 매핑) - KEY
CREATE TABLE tab4( empid INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL, empname CHAR(20) NOT NULL );
CREATE INDEX mysqlidx ON tab4(empname);
|
CREATE INDEX 문
DB2로의 변환에서 CREATE INDEX 문이 지원된다.
Listing 5a. MySQL SQL에서 인덱스 작성
CREATE UNIQUE INDEX idx1 ON tab1(col1 ASC); CREATE INDEX idx2 ON tab1 (col2 DESC);
|
Listing 5b. 인덱스 작성 - MTK 변환
CREATE UNIQUE INDEX idx1 ON tab1(col1 ASC); CREATE INDEX idx2 ON tab1(col2 DESC);
|
데이터 이동
여
러 가지 방법을 사용하여 MySQL에서 DB2로 데이터를 마이그레이션할 수 있다. 하지만 MTK의 데이터 마이그레이션 유틸리티를
사용하는 경우에는 데이터를 이동할 때 DB2 LOAD 또는 IMPORT 중 하나가 사용된다. 데이터 마이그레이션에 대한 자세한
내용은 MTK 문서에서 참조할 수 있다.
INSERT 문
DB2로 마이그레이션할 때 VALUES 절이 있는 INSERT DML 문이 지원된다. SELECT가 있는 INSERT 같은 기타 옵션은 지원되지 않는다.
Listing 6a. MySQL SQL - VALUES가 있는 INSERT
CREATE TABLE tab6(c1 integer, c2 double);
INSERT INTO tab6 VALUES(1, 1.1); INSERT INTO tab6(col1,col2) VALUES(1,1.1); INSERT INTO tab6(col1,col2) VALUES (1,1.1),(2,2.2),(3,3.3);
|
Listing 6b. MTK 변환 - VALUES가 있는 INSERT
CREATE TABLE tab6(c1 integer, c2 double);
INSERT INTO tab6 VALUES(1,1.1); INSERT INTO tab6(col1,col2) VALUES(1,1.1); INSERT INTO tab6(col1,col2) VALUES (1,1.1),(2,2.2),(3,3.3);
|
지원되는 MySQL 문
MTK는 또한 다음 MySQL SQL 문을 대부분 지원한다.
- ALTER TABLE 문
- DROP TABLE 문
- SELECT 문
- DELETE 문
- UPDATE 문
Part 2: MySQL에서 IDS로의 마이그레이션 지원
MySQL로부터의 마이그레이션은 Informix Dynamic Server 버전 7, 9.4, 10 이상에서만 지원된다.
MTK는 다음 MySQL SQL 문의 전체 변환을 지원한다.
- CREATE TABLE 문
- CREATE INDEX 문
MTK는 또한 다음 MySQL SQL 문을 대부분 지원한다.
- INSERT 문
- ALTER TABLE 문
- DROP TABLE 문
- SELECT 문
- DELETE 문
- UPDATE 문
CREATE TABLE 문
create table 지원은 DB2와 비슷하다. 유일한 차이점은 데이터 유형을 IDS 데이터 유형에 매핑하며 또한 IDS 해당
구문에도 매핑한다는 데 있다. 이 기술 자료에서는 MySQL 구문에서 IDS 해당 구문으로의 MTK 변환을 보여 준다.
표 2에서는 MySQL 데이터 유형이 IDS 데이터 유형에 매핑되는 방식을 표시한다. 또한 특정 데이터 유형에 대한 선택적 매핑도 보여 준다.
표 2. 데이터 유형 매핑
MySQL 데이터 유형 | IDS 데이터 유형 |
---|
TINYINT | SMALLINT |
---|
SMALLINT | SMALLINT |
---|
MEDIUMINT | INTEGER |
---|
INT | INTEGER |
---|
INTEGER | INTEGER |
---|
BIGINT | INT8 |
---|
REAL | DOUBLE PRECISION |
---|
DOUBLE | DOUBLE PRECISION |
---|
FLOAT | DOUBLE PRECISION |
---|
DECIMAL(p,s)
Where: s > 0 && p >= s
s > 0 && p < s s
< 0 |
DECIMAL(min(p,32), min(s,32)) DECIMAL(min(p,32),
min(s,32)) DECIMAL(min(p,32),0) |
---|
NUMERIC(p,s)
Where: s > 0 && p >= s
s > 0 && p < s s
< 0 |
DECIMAL(min(p,32), min(s,32)) DECIMAL(min(p,32),
min(s,32)) DECIMAL(min(p,32),0) |
---|
TINYINT UNSIGNED | SMALLINT |
---|
SMALLINT UNSIGNED | INTEGER
optional: SMALLINT |
---|
MEDIUMINT UNSIGNED | INTEGER |
---|
INT UNSIGNED | INT8
optional: INTEGER |
---|
BIGINT UNSIGNED | DECIMAL(20,0)
optional: INT8 |
---|
REAL UNSIGNED | DOUBLE PRECISION |
---|
DOUBLE UNSIGNED | DECIMAL(p,s)
optional: DOUBLE PRECESION |
---|
FLOAT UNSIGNED | DOUBLE PRECISION |
---|
DECIMAL UNSIGNED | DECIMAL(p,s) |
---|
NUMERIC UNSIGNED | DECIMAL(p,s) |
---|
DATE | DATE |
---|
TIME | DATETIME HOUR TO FRACTION |
---|
TIMESTAMP | DATETIME YEAR TO FRACTION |
---|
DATETIME | DATETIME YEAR TO FRACTION
optional: DATE |
---|
YEAR | CHAR(4) |
---|
CHAR(l) | CHAR(l) |
---|
VARCHAR(l) | VARCHAR(l)
optional: LVARCHAR
optional: CLOB |
---|
TINYBLOB | BYTE
optional: BLOB |
---|
BLOB | BLOB
optional: BYTE |
---|
MEDIUMBLOB | BYTE
optional: BLOB |
---|
LONGBLOB | BYTE
optional: BLOB |
---|
TINYTEXT | TEXT |
---|
TEXT | TEXT |
---|
MEDIUMTEXT | TEXT |
---|
LONGTEXT | TEXT |
---|
Listing 7에서는 MySQL 데이터 유형 및 CREATE TABLE이 IDS로 변환되는 방식을 표시한다.
Listing 7a. MySQL SQL - CREATE TABLE
CREATE TABLE tab7( col1 CHAR(20), col2 VARCHAR(30), col3 SMALLINT(20), col4 TINYINT(30), col5 MEDIUMINT(20), col6 INT(10), col7 INTEGER(20), col8 BIGINT(20), col9 REAL, col10 DOUBLE, col11 FLOAT, col12 DECIMAL(10,4), col13 NUMERIC(10,4), col14 DATE, col15 TIME, col16 TIMESTAMP, col17 DATETIME, col18 YEAR, col19 BIT ); |
Listing 7b. MTK 변환 - IDS에 대한 CREATE TABLE
CREATE TABLE tab7( col1 CHAR(20), col2 VARCHAR(30), col3 SMALLINT, col4 SMALLINT, col5 INTEGER, col6 INTEGER, col7 INTEGER, col8 INT8, col9 DOUBLE PRECISION, col10 DOUBLE PRECISION, col11 DOUBLE PRECISION, col12 DECIMAL(10,4), col13 DECIMAL(10,4), col14 DATE, col15 DATETIME HOUR TO FRACTION (5), col16 DATETIME YEAR TO FRACTION (5), col17 DATETIME YEAR TO FRACTION (5), col18 CHAR(4), col19 SMALLINT );
|
Listing 8은 제약 조건을 IDS로 변환하는 예제다.
Listing 8a. MySQL - 제약 조건
CREATE TABLE tab8 ( col1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP, col2 SMALLINT );
CREATE TABLE unq( c1 INTEGER, c2 CHAR(10), CONSTRAINT ccc UNIQUE KEY(c1) );
|
Listing 8b. MTK 변환 - IDS의 제약 조건
CREATE TABLE tab8( col1 DATETIME YEAR TO FRACTION (5) DEFAULT CURRENT YEAR TO FRACTION (5), col2 SMALLINT );
CREATE TABLE unq( c1 INTEGER, c2 CHAR(10), UNIQUE(c1) CONSTRAINT ccc );
|
CREATE INDEX 문
Listing 9에서는 CREATE INDEX 지원 및 IDS 대상으로의 MTK 변환 예를 표시한다.
Listing 9a. MySQL SQL - 고유 인덱스 작성
CREATE TABLE tab9 ( col1 INT, col2 FLOAT );
CREATE UNIQUE INDEX idx1 ON tab9(col1 ASC);
|
Listing 9b. IDS에 대한 MTK 변환 - 고유 인덱스 작성
CREATE TABLE tab9( col1 INTEGER, col2 DOUBLE PRECISION );
CREATE UNIQUE INDEX idx1 ON tab9(col1 ASC);
|
INSERT 문
IDS는 여러 VALUE 절이 있는 INSERT 문을 지원하지 않는다. 따라서 IDS를 대상으로 선택하면 MTK는 MySQL로부터 이러한 문을 변환하지 않는다. 이 경우 MySQL INSERT 문을 수동으로 변환해야 한다.
다음 예에서는 MTK에서 경고를 내보내고 SQL INSERT 문을 무시하는 시나리오를 보여 준다.
Listing 10a. MySQL SQL - 여러 values 절이 있는 INSERT
CREATE TABLE tab10( c1 INT, c2 CHAR(1) );
INSERT INTO tab1 VALUES (1,'A'),(2,'B'),(3,'C');
|
Listing 10b. IDS에 대한 MTK 변환 - 여러 values 절이 있는 INSERT
CREATE TABLE tab10( c1 INTEGER, c2 CHAR(1) );
--* [600292]"insert.sql"(2:2)-(2:49)Ignored the multiple INSERT statement because Informix Dynamic Server does not support it.
|
주: DB2 마이그레이션에서 설명된 나머지 INSERT 구문은 IDS 마이그레이션에서도 지원된다.
맺음말
MTK 2.0.2.0의 향상된 기능과 후속 MTK 릴리스로 인해 많은 MySQL DDL과 대다수의 DML 문을 변환할 수 있게
되었다. MTK 2.0.2.0과 후속 MTK 릴리스는 MySQL에서 데이터베이스를 더 쉽고 유연하며 강력하게 마이그레이션할 수
있게 한다. 더욱 자세한 내용과 예제는 MTK 문서에서 참조할 수 있다.
참고자료 교육
제품 및 기술 얻기
토론
필자소개
|