通过 IBM Migration Toolkit 支持把数据从 MySQL 迁移到 DB2 和 Informix Dynamic Server
2008-11-10 16:32:38 来源:WEB开发网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 的迁移支持只适用于 Informix Dynamic Server Version 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 语法到 DB2 等效语法的 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) 其中: 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) 其中: 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 可选: SMALLINT |
MEDIUMINT UNSIGNED | INTEGER |
INT UNSIGNED | INT8 可选: INTEGER |
BIGINT UNSIGNED | DECIMAL(20,0) 可选: INT8 |
REAL UNSIGNED | DOUBLE PRECISION |
DOUBLE UNSIGNED | DECIMAL(p,s) 可选: 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 可选: DATE |
YEAR | CHAR(4) |
CHAR(l) | CHAR(l) |
VARCHAR(l) | VARCHAR(l) 可选: LVARCHAR 可选: CLOB |
TINYBLOB | BYTE 可选: BLOB |
BLOB | BLOB 可选: BYTE |
MEDIUMBLOB | BYTE 可选: BLOB |
LONGBLOB | BYTE 可选: BLOB |
TINYTEXT | TEXT |
TEXT | TEXT |
MEDIUMTEXT | TEXT |
LONGTEXT | TEXT |
清单 7 说明 MySQL 数据类型和 CREATE TABLE 语句如何转换为 IDS 语法:
清单 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
);
清单 7b. MTK 转换 - CREATE TABLE(IDS)
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
);
清单 8 是一个把约束转换为 IDS 语法的示例。
清单 8a. MySQL SQL - 约束
CREATE TABLE tab8 (
col1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
col2 SMALLINT
);
CREATE TABLE unq(
c1 INTEGER,
c2 CHAR(10),
CONSTRAINT ccc UNIQUE KEY(c1)
);
清单 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 语句
清单 9 给出 CREATE INDEX 语句支持和 MTK 转换的示例。
清单 9a. MySQL SQL - 创建惟一索引
CREATE TABLE tab9 (
col1 INT,
col2 FLOAT
);
CREATE UNIQUE INDEX idx1 ON tab9(col1 ASC);
清单 9b. 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 语句。
清单 10a. MySQL SQL - 带多个 VALUE 子句的 INSERT
CREATE TABLE tab10(
c1 INT,
c2 CHAR(1)
);
INSERT INTO tab1 VALUES (1,'A'),(2,'B'),(3,'C');
清单 10b. MTK 转换 - 带多个 VALUE 子句的 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 数据库迁移更加轻松、灵活和强大。
赞助商链接