スゴ技!IBM DB2のテーブルを、MariaDBから参照する方法!


いきなりですがMariaDB 10.XははCONNECTストレージエンジンなるものを持っており、なんと、他のRDBMS製品にあるテーブルをあたかも、MariaDB内テーブルのように見せることができるのです!
Maria CONNECTで接続できるリソースは、Oracle,PostgreSQL,SQL Server,Ms-Accessとおそらく全てのデータベースを網羅しているのはもちろんのこと、CSVおよび、EXCEL等も接続することが可能な模様です。
この手法は、メーカーによって言いまわしが変わっており。 IBMでは、Federated (連合データベース)、Oracleだとリンクテーブルとかいったっけかな?・・たしかそんなだったと思います。
ただし、どの製品も基本同じDBMSをリンクするための技術であって異なるRDBMS製品の接続はサポートされていないか、もしくは、有償で提供しているのが現状かと思います。

今回、私のやりたかったことは、MariaDBから、IBM DB2サーバに接続し、あたかもMariaDB内のテーブルのように見せるという方法を試したかったので、やってみました。(ちょっと情報少なさすぎで苦労しました)
きっといつか何かに役立ってくれる!!!!

環境は以下の通りです。

なお、MariaDB -> IBM DB2のコネクトを進めるにあたり以下の作業が完了していることが前提となります。

  • IBM DB2サーバがあること(あたりまえ)
  • MariaDB 10.0がインストールされていること
# yum -y install unixODBC
  • MariaDB CONNECT Storage Engine がインストールされていること
# rpm -ivh MariaDB-10.0.10-centos5-x86_64-connect-engine.rpm
  • 接続元のクライアントに、DB2クライアントがインストールされていること

  • 接続元のクライアントから、DB2サーバにコネクトできる設定になっていること

です。上記の環境がそろっていることを前提にその手順について説明したいと思います。

/etc/odbcinst.ini の編集

unixodbcがインストールされますと、/etc/odbcinst.iniができておりますのでその中に、以下の記載を追記します、
なお、Driver のモジュールファイルのパスにつきましては、環境によりまちまちかと思いますので、適宜変更してください

[DB2]
Description             = IBM DB2 Adapter
Driver                  = /opt/ibm/db2/V10.5/lib64/libdb2.so
FileUsage               = 1
DontDLClose             = 1

/etc/odbc.ini の編集

前回、こちらで作成したデータソースを例に説明します。前回は、ALIAS_NAMEという名前でDSNを作成しました。今回のodbc.iniの中の[***]には、ALIAS_NAMEという名前を指定します

[ALIAS_NAME]
Description = example database connection
Driver = DB2

db2cli.ini の編集

このファイルは、存在しないかもしれません。存在しない場合は作成する必要があります、作成するパスは、
/home/<<インスタンスオーナー>>/sqllib/cfg/ になります。[*]の箇所は、DSN名になります。

$ pwd
/home/db2inst/sqllib/cfg
$ vi /home/db2inst/sqllib/cfg/db2cli.ini
----------------------------
[ALIAS_NAME]
DBALIAS=ALIAS_NAME
UID=db2inst1
PWD=db2inst1pass
-----------------------------

一旦MySQLを再起動

一度MySQLの再起動が必要っぽい

# /etc/init.d/mysql restart

接続を試してみよう

上記の設定が全て済んでいれば、もうDB2に接続できる環境になったはずです。

試しに、こんなテーブルをDB2上に作ってみました。

  • DB2側でテーブルを作成
$ db2 "create table test.tab1 (id integer,detail varchar(100))  "
DB20000I  SQL コマンドが正常に終了しました。
  • DB2側のテーブルにデータをINSERTする
$ db2 "insert into test.tab1 values (1,'TEST1')"
DB20000I  SQL コマンドが正常に終了しました。

では、いよいよ、MariaDB 側にCONNECT ストレージエンジンを利用したテーブルを作成みたいと思います

CREATE TABLE 構文はいままでと同じです。注目すべき点は、ストレージエンジンの指定(CONNECT)、CONNECTIONの指定(DSN=ALIAS_NAME)です。ようは、MySQLの定義としてテーブルを登録するけど、”データの実体”はDB2のテーブルだよ!という意味です。

MariaDB>
CREATE TABLE tab1
(
id int,
detail varchar(100)
) ENGINE=CONNECT DEFAULT CHARSET=utf8 CONNECTION='DSN=ALIAS_NAME' `table_type`=ODBC `tabname`='TEST.TAB1' ;

実際テーブルはどのように入っているか?

さきほど、DB2でINSERTしたデータが反映されているのが理解いただけたかと思います

MariaDB>
select * from tab1;
+------+--------+
| id   | detail |
+------+--------+
|    1 | TEST1  |
+------+--------+
1 row in set (0.01 sec)

ではインサートはどうか?

MariaからINSERTした場合も、DB2に反映されるんじゃね?なんて期待しつつINSERTしてみました。とりあえず登録はできました。
ちょっと意地悪して、日本語も入れてみました

insert into tab1 values (2,'キータ用のデータ登録テスト(mariadbから)') ;
Query OK, 1 row affected (0.01 sec)

では緊張のDB2の結果は?

おぉおおおお、入っている、、、しかもちゃんと日本語で!!!!!!!

$ db2 "select * from test.tab1  "

ID          DETAIL                                                                                              
----------- ----------------------------------------------------------------------------------------------------
          1 TEST1                                                                                               
          2 キータ用のデータ登録テスト(mariadbから)                                                             

てな感じで喜んでいるのは、実は、こちらのDB2の環境は、EUC文字コードの環境なのですが、Mariaは、UTF-8 つまり、暗黙的に文字コード変換してくれているってことですね。感動

結構、いろいろなところで活躍できそうなので、これから考えていきます。まじで、mariaDBは、最高に良いDBなのでぜひ皆様もつかってください!!!!