MySQL에서 DB2와 Informix Dynamic Server로 데이터 마이그레이션을 하기 위한 IBM Migration Toolkit 지원

2008. 12. 8. 17:59Database

MySQL에서 DB2와 Informix Dynamic Server로 데이터 마이그레이션을 하기 위한 IBM Migration Toolkit 지원

새로 향상된 기능

developerWorks
문서 옵션

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.

수평출력으로 설정

이 페이지 출력

이 페이지를 이메일로 보내기

이 페이지를 이메일로 보내기

영어원문

영어원문


제안 및 의견
피드백

난이도 : 초급

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 데이터 유형
TINYINTSMALLINT
SMALLINTSMALLINT
MEDIUMINTINTEGER
INTINTEGER
INTEGERINTEGER
BIGINTBIGINT
REALDOUBLE
DOUBLEDOUBLE
FLOATDOUBLE
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 UNSIGNEDSMALLINT
SMALLINT UNSIGNEDINTEGER

optional: SMALLINT
MEDIUMINT UNSIGNEDINTEGER
INT UNSIGNEDBIGINT

optional: INTEGER
BIGINT UNSIGNEDDECIMAL(20,0)

optional: BIGINT
REAL UNSIGNEDDOUBLE

optional: DOUBLE
DOUBLE UNSIGNEDDECIMAL(p,s)
FLOAT UNSIGNEDDOUBLE
DECIMAL UNSIGNEDDECIMAL(p,s)
NUMERIC UNSIGNEDDECIMAL(p,s)
DATEDATE
TIMETIME
TIMESTAMPTIMESTAMP
DATETIMETIMESTAMP

optional: TIME
YEARCHAR(4)
CHAR(l)CHAR(l)

optional: VARCHAR
VARCHAR(l)VARCHAR(l)

optional: CLOB
TINYBLOBBLOB(255)
BLOBBLOB(65535)
MEDIUMBLOBBLOB(16777215)
LONGBLOBBLOB(2000000000)
TINYTEXTCLOB(255)
TEXTCLOB(65535)
MEDIUMTEXTCLOB(16777215)
LONGTEXTCLOB(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 데이터 유형
TINYINTSMALLINT
SMALLINTSMALLINT
MEDIUMINTINTEGER
INTINTEGER
INTEGERINTEGER
BIGINTINT8
REALDOUBLE PRECISION
DOUBLEDOUBLE PRECISION
FLOATDOUBLE 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 UNSIGNEDSMALLINT
SMALLINT UNSIGNEDINTEGER

optional: SMALLINT
MEDIUMINT UNSIGNEDINTEGER
INT UNSIGNEDINT8

optional: INTEGER
BIGINT UNSIGNEDDECIMAL(20,0)

optional: INT8
REAL UNSIGNEDDOUBLE PRECISION
DOUBLE UNSIGNEDDECIMAL(p,s)

optional: DOUBLE PRECESION
FLOAT UNSIGNEDDOUBLE PRECISION
DECIMAL UNSIGNEDDECIMAL(p,s)
NUMERIC UNSIGNEDDECIMAL(p,s)
DATEDATE
TIMEDATETIME HOUR TO FRACTION
TIMESTAMPDATETIME YEAR TO FRACTION
DATETIMEDATETIME YEAR TO FRACTION

optional: DATE
YEARCHAR(4)
CHAR(l)CHAR(l)
VARCHAR(l)VARCHAR(l)

optional: LVARCHAR
optional: CLOB
TINYBLOBBYTE

optional: BLOB
BLOBBLOB

optional: BYTE
MEDIUMBLOBBYTE

optional: BLOB
LONGBLOBBYTE

optional: BLOB
TINYTEXTTEXT
TEXTTEXT
MEDIUMTEXTTEXT
LONGTEXTTEXT

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 문서에서 참조할 수 있다.




참고자료

교육

제품 및 기술 얻기
  • MTK를 다운로드한다.

  • DB2 Enterprise 9의 무료 평가판을 다운로드한다.

  • 이제 DB2를 무료로 다운로드할 수 있다. DB2 Express-C를 다운로드한다. 이 제품은 DB2 Express Edition과 같은 핵심 데이터 기능을 제공하며 애플리케이션을 빌드하고 배포하기 위한 확고한 기초를 제공하는 커뮤니티용 무료 DB2 Express Edition이다.

  • Informix Dynamic Server의 무료 평가판을 다운로드한다.


토론


필자소개


Sailaja Navvluru는 IBM Lenexa 연구소의 소프트웨어 엔지니어로 IBM Migration Toolkit Team의 개발자다.



Hardik Patel은 IBM Lenexa 연구소의 소프트웨어 엔지니어로 IBM Migration Toolkit Team의 개발자다.