前回にて、OracleサンプルテーブルからMySQLへの移行は完了しました。
今回は、気になる結果をチェックしてみたいと思います。
scott.emp表の移行結果
BEFORE : ORACLE DB
SQL> select dbms_metadata.get_ddl('TABLE','EMP','SCOTT') from dual;
DBMS_METADATA.GET_DDL('TABLE','EMP','SCOTT')
--------------------------------------------------------------------------------
CREATE TABLE "SCOTT"."EMP"
( "EMPNO" NUMBER(4,0),
"ENAME" VARCHAR2(10),
"JOB" VARCHAR2(9),
"MGR" NUMBER(4,0),
"HIREDATE" DATE,
"SAL" NUMBER(7,2),
"COMM" NUMBER(7,2),
"DEPTNO" NUMBER(2,0),
CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ENABLE,
CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS"
AFTER : MySQL DB
mysql> show create table emp;
+-------+---------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------+
| Table | Create Table
|
+-------+---------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------+
| emp | CREATE TABLE `emp` (
`empno` int(4) NOT NULL,
`ename` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`job` varchar(9) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`mgr` int(4) DEFAULT NULL,
`hiredate` datetime DEFAULT NULL,
`sal` decimal(7,2) DEFAULT NULL,
`comm` decimal(7,2) DEFAULT NULL,
`deptno` int(2) DEFAULT NULL,
PRIMARY KEY (`empno`),
KEY `fk_deptno` (`deptno`),
CONSTRAINT `fk_deptno` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------+
1 row in set (0.14 sec)
上手に移行されているような印象ですね。単純な移行ではなくてちょっと工夫した?移行をしてる感じです。
例えば:
Oracle : NUMBER(4,0),
MySQL : int(4) NOT NULL,
なんかです。(ただしMySQLではint(4)とやってもストレージの節約にはなりませんが・・)あと、このテーブルに付加されている主キーと、外部キーはきちんとリバースエンジニアリングされて来ています。
Oracle
CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE
MySQL
PRIMARY KEY (`empno`),
KEY `fk_deptno` (`deptno`),
CONSTRAINT `fk_deptno` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptno`) ON DELETE NO ACTION ON UPDATE NO ACTION
次にEMP表のデータをチェックしてみます。きちんと移行されているでしょうか?左が移行されたMySQLデータ、右がオリジナルのOracleデータです。(クリックすると拡大します)
EMP表に関しては完璧ですね。若干表示形式が異なっていますが、これは私が使ったOracleのSQL*Plusの設定(SET~)とNLSの設定がmysqlの表示形式と若干異なっているためです。(完全に同じような表示にすることも設定次第で可能です)
他の表についても参考までに載せておきます。
scott.bonus表の移行結果
BEFORE : ORACLE DB
SQL> select dbms_metadata.get_ddl('TABLE','BONUS','SCOTT') from dual;
DBMS_METADATA.GET_DDL('TABLE','BONUS','SCOTT')
--------------------------------------------------------------------------------
CREATE TABLE "SCOTT"."BONUS"
( "ENAME" VARCHAR2(10),
"JOB" VARCHAR2(9),
"SAL" NUMBER,
"COMM" NUMBER
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS"
AFTER : MySQL DB
mysql> show create table bonus;
+-------+------------------------------------------------------------------
| Table | Create Table
+-------+------------------------------------------------------------------
| bonus | CREATE TABLE `bonus` (
`ename` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`job` varchar(9) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`sal` decimal(22,0) DEFAULT NULL,
`comm` decimal(22,0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------
1 row in set (0.00 sec)
scott.dept表の移行結果
BEFORE : ORACLE DB
SQL> select dbms_metadata.get_ddl('TABLE','DEPT','SCOTT') from dual;
DBMS_METADATA.GET_DDL('TABLE','DEPT','SCOTT')
--------------------------------------------------------------------------------
CREATE TABLE "SCOTT"."DEPT"
( "DEPTNO" NUMBER(2,0),
"DNAME" VARCHAR2(14),
"LOC" VARCHAR2(13),
CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS"
AFTER : MySQL DB
mysql> show create table dept;
+-------+-----------------------------------------------------------------
| Table | Create Table
+-------+-----------------------------------------------------------------
| dept | CREATE TABLE `dept` (
`deptno` int(2) NOT NULL,
`dname` varchar(14) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`loc` varchar(13) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------
1 row in set (0.00 sec)
scott.salgrade表の移行結果
BEFORE : ORACLE DB
SQL> select dbms_metadata.get_ddl('TABLE','SALGRADE','SCOTT') from dual;
DBMS_METADATA.GET_DDL('TABLE','SALGRADE','SCOTT')
--------------------------------------------------------------------------------
CREATE TABLE "SCOTT"."SALGRADE"
( "GRADE" NUMBER,
"LOSAL" NUMBER,
"HISAL" NUMBER
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS"
AFTER : MySQL DB
mysql> show create table salgrade;
+----------+-------------------------------------
| Table | Create Table
+----------+-------------------------------------
| salgrade | CREATE TABLE `salgrade` (
`grade` decimal(22,0) DEFAULT NULL,
`losal` decimal(22,0) DEFAULT NULL,
`hisal` decimal(22,0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------+-------------------------------------
1 row in set (0.00 sec)
全体としては、よく移行できていますね。今回はサンプルテーブルということでシンプルな構成のためですが・・・。(マイグレーション結果は警告なしでした)他にOracleを使用している方は色々な機能を使用していると思いますが(マテリアライズドビュー、シーケンス、シノニム、他)そういったものはやはり手動またはツールのカスタマイズ/作成での移行が必要な場合もあります。あと、テーブル名とカラム名は小文字で出てきてしまうので大文字にしたい場合はもう一工夫必要ですね(※1)。複数ステートメントを含むプロシージャもDELIMITER文を追加するなどマニュアルでの対応は必要です。
※1 Migration Tool Kit 1.1.14の実装ではMaxDB, Oracleからの移行ではテーブル名等のIdentifierは小文字に変換するようになっています。ここを変更したり結果をSQLとして出力してそのSQLに手を加えることでオリジナルCaseでの移行は可能です。MySQLではデフォルト設定でWindows機上のテーブル名の大文字小文字はステートメント中で区別されません。ただしUNIX機でもストレージエンジンにInnoDBを使用する場合はテーブル名は小文字のままが推奨です(またはシステム変数lower_case_table_names=1をセットしてMySQLサーバを起動後create文を発行する)。カラム名は大文字小文字の区別はありません
このツールはあくまでも移行のための手段です。MySQLマイグレーションツールキットの良い点は移行処理中にたくさんの、人間が介入する機会が与えられているところだと思います。つまりどのように使うかは使用する側次第です。(例えば、NUMBER(4,0)ならSMALLINTでも可能、、、とか)しかも移行処理全体をスクリプト化できるので、移行プログラムを作成するよりも非常に少ない工数にて完全カスタマイズされた移行を実現できる可能性を持っていると思います。
さらに、MySQLマイグレーションツールキットの移行主要ロジックはJavaで記述されています。各種DBからの移行部分とリバースエンジニアリングの部分について、既に用意されている基底クラスをextendしてそれらのモジュールを作成できるようになっているので(かつオープンソースなので)、デフォルトのモジュールでは実装されていない部分の移行や、顧客要件に応じたカスタマイズされた移行を実装することが可能です。
Sunプロフェッショナルサービスでは、MySQLベンダーとしてMySQLの移行サービスを提供しています。移行の要件に基づく移行計画/設計、移行環境の構築、移行の実施、テストなどを行うアセスメントサービスとなります。MySQLマイグレーションツールキットのカスタマイズ対応や顧客専用移行ツール作成も可能です(あくまで移行手段の中の一つとしてですが、、、目的は移行そのものです)。是非ご利用をご検討ください。