程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 通過 IBM Migration Toolkit 支持把數據從 MySQL 遷移到 DB2 和 Informix Dynamic Server

通過 IBM Migration Toolkit 支持把數據從 MySQL 遷移到 DB2 和 Informix Dynamic Server

編輯:DB2教程

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 數據庫遷移更加輕松、靈活和強大。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved