通过 IBM Migration Toolkit 支持把数据从 MySQL 迁移到 DB2 和 Informix Dynamic Server
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 时如何利用 MTK 支持,然后讨论从 MySQL 迁移到 IDS 的情况。
第 1 部分:MySQL 到 DB2 迁移支持
从 MySQL 到 DB2 的迁移支持只适用于 DB2 Database for Linux®, UNIX® and Windows® Version 8.2 或更高版本,以及 DB2 Database for iSeries® V5R3 或 V5R4。本文主要关注针对 DB2 Database for Linux, UNIX and Windows 的 MTK 支持。
CREATE TABLE 语句
CREATE TABLE 语句支持包括对 MySQL InnoDB 引擎支持的所有语法进行转换。这包括数据类型映射、数据提取和在 DB2 中部署数据。MTK 还支持 MyISAM 引擎,这种引擎的语法是相似的。但是,不支持应用于 fhs MyISAM 引擎的空间类型。
表 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) 其中: 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) 其中: 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 可选: SMALLINT |
MEDIUMINT UNSIGNED | INTEGER |
INT UNSIGNED | BIGINT 可选: INTEGER |
BIGINT UNSIGNED | DECIMAL(20,0) 可选: BIGINT |
REAL UNSIGNED | DOUBLE 可选: 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 可选: TIME |
YEAR | CHAR(4) |
CHAR(l) | CHAR(l) 可选: VARCHAR |
VARCHAR(l) | VARCHAR(l) 可选: 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) |
清单 1a 和清单 1b 说明 MySQL 数据类型和 create table 语句如何转换为 DB2 语法:
清单 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
);
清单 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 中的等效功能或者发出警告。清单 2a 演示 AUTO_INCREMENT 的转换。
清单 2a. MySQL SQL - 递增函数
CREATE TABLE tab2(
col1 INTEGER NOT NULL AUTO_INCREMENT,
col2 CHAR(20) NOT NULL,
PRIMARY KEY (col1)
);
注意:AUTO INCREMENT:整数列可以具有 AUTO_INCREMENT 属性。在 AUTO_INCREMENT 列中插入 NULL(推荐)或 0 值时,列会被设置为下一个序列值。通常,这个值是表中这个列中当前的最大值加 1。AUTO_INCREMENT 序列从 1 开始。
清单 2b. MTK 转换 - 递增函数
CREATE TABLE tab2(
col1 INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL,
col2 CHAR(20) NOT NULL,
PRIMARY KEY(col1)
);
注意:GENERATED ALWAYS AS IDENTITY:标识列使 DB2 能够为表中添加的每一行自动生成一个惟一的数字值。在创建表时,如果需要惟一地标识表中添加的每一行,那么可以在表中添加一个标识列。要想为表中添加的每一行生成一个惟一的数字值,应该在标识列上定义一个惟一索引,或者把它声明为主键。
清单 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,
);
清单 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
);
带有 KEY 列的 MySQL create table 语句会转换为两个单独的 DB2 语句:CREATE TABLE 语句和 KEY 列上的 CREATE INDEX 语句。
清单 4a. MySQL SQL - KEY
CREATE TABLE tab4 (
empid INTEGER NOT NULL AUTO_INCREMENT,
empname CHAR(20) NOT NULL,
KEY (empname)
);
清单 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 语句
支持把 CREATE INDEX 语句转换为 DB2 语法。
清单 5a. 用 MySQL SQL 创建索引
CREATE UNIQUE INDEX idx1 ON tab1(col1 ASC);
CREATE INDEX idx2 ON tab1 (col2 DESC);
清单 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 语句
支持把带 VALUES 子句的 INSERT DML 语句转换为 DB2 语法。不支持其他选项,比如带 SELECT 的 INSERT。
清单 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);
清单 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 语句
第 2 部分:MySQL 到 IDS 迁移支持
从 MySQL 到 IDS