Database JUNKY

MySQL,MariaDBを中心としたブログです

CONNECT STORAGE ENGINEを利用した異なるDBMSへの透過的接続

いきなりですがMariaDB 10.XははCONNECTストレージエンジンなるものを持っており、なんと、他のRDBMS製品にあるテーブルをあたかもMariaDB内テーブルのように見せることができるのです! 今回は、IBM DB2をあたかも、MariaDBのデータベースのように見せる手順を書いてみたいと思います。 以外とすんなりできて感動

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

2014-07-17_212106.jpg

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

環境は以下の通りです。

2014-07-17_212139.jpg

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

  • IBM DB2サーバがあること(あたりまえ)
  • MariaDB 10.0がインストールされていること

[code lang=text]

yum -y install unixODBC

[/code]

  • MariaDB CONNECT Storage Engine がインストールされていること

[code lang=text]

rpm -ivh MariaDB-10.0.10-centos5-x86_64-connect-engine.rpm

[/code]

  • 接続元のクライアントに、DB2クライアントがインストールされていること

http://qiita.com/hit/items/1a149ef7dc5e7e61ec5c

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

http://qiita.com/hit/items/55e696a844a0c17fd30d

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

/etc/odbcinst.ini の編集

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

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

/etc/odbc.ini の編集

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

[code lang=text] [ALIAS_NAME] Description = example database connection Driver = DB2 [/code]

db2cli.ini の編集

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

[code lang=text] $ pwd /home/db2inst/sqllib/cfg

$ vi /home/db2inst/sqllib/cfg/db2cli.ini

[ALIAS_NAME] DBALIAS=ALIAS_NAME UID=db2inst1

PWD=db2inst1pass

[/code]

接続を試してみよう

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

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

  • DB2側でテーブルを作成

[code lang=text] $ db2 "create table test.tab1 (id integer,detail varchar(100)) " DB20000I SQL コマンドが正常に終了しました。 [/code]

  • DB2側のテーブルにデータをINSERTする

[code lang=text] $ db2 "insert into test.tab1 values (1,'TEST1')" DB20000I SQL コマンドが正常に終了しました。 [/code]

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

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

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

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

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

[code lang=text] MariaDB> select * from tab1; +------+--------+ | id | detail | +------+--------+ | 1 | TEST1 | +------+--------+ 1 row in set (0.01 sec) [/code]

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

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

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

では緊張のDB2の結果は?

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

[code lang=text] $ db2 "select * from test.tab1 "

ID DETAIL


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

[/code]

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

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

f:id:hit10231023:20180309125620p:plain