2014年12月10日水曜日

MariaDB 10.0のCONNECTストレージエンジンからOracle DBに接続してみる

この記事は JPOUG Advent Calendar 2014 の10日目の記事です。

MariaDB 10.0には CONNECTストレージエンジン という MS Accessでいうところのリンクテーブルなストレージエンジンが搭載されていて、リンクの方法にCSVとかXMLとかODBCとか色々あるようです。MySQLに昔から入っているFEDERATEDストレージエンジンはMySQLプロトコルしかしゃべれないのでリンク先は必ずMySQLサーバーでないといけないという制約がありますが、ODBCなら色々できるわけですよね。

というわけでさっくり試してみました。
unixODBC-develと OracleのInstant Client (とりあえず、basic, odbc, develの3つをrpmで突っ込みました)は予めインストールしてあります。

$ wget "https://downloads.mariadb.org/f/mariadb-10.0.15/source/mariadb-10.0.15.tar.gz/from/http%3A/ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb?serve" -O mariadb-10.0.15.tar.gz
$ tar xzf mariadb-10.0.15.tar.gz
$ cmake -DWITH_CONNECT_STORAGE_ENGINE=ON .
$ make
$ make install


ODBCドライバーの設定をしておきます。

$ sudo vim /etc/odbcinst.ini
..
[Oracle 12c ODBC driver]
Description     = Oracle ODBC driver for Oracle 12c
Driver          = /usr/lib/oracle/12.1/client64/lib/libsqora.so.12.1

$ vim ~/.odbc.ini
[JPOUG]
Driver       = Oracle 12c ODBC driver
ServerName   = xxx.xxx.xxx.xxx:1521/HOGE
DSN          = JPOUG


ではCONNECTテーブルの作成。

mysql> CREATE TABLE connect_test Engine= Connect TABLE_TYPE=ODBC tabname='TABLE_1' CONNECTION='DSN=JPOUG;UID=xxxx;PWD=xxxx';
ERROR 1105 (HY000): [unixODBC][Driver Manager]Can't open lib '/usr/lib/oracle/12.1/client64/lib/libsqora.so.12.1' : file not found

( ゚д゚) ファッ
ライブラリーパスが通ってなさそうなパスに入れたんですね○racleさん。。


$ export LD_LIBRARY_PATH=/usr/lib/oracle/12.1/client64/lib
$ bin/mysqladmin shutdown
$ bin/mysqld_safe &

取りあえずLD_LIBRARY_PATHに突っ込んでmysqldを再起動。


mysql> CREATE TABLE connect_test Engine= Connect TABLE_TYPE=ODBC tabname='TABLE_1' CONNECTION='DSN=JPOUG;UID=xxxx;PWD=xxxx';
Query OK, 0 rows affected (2.21 sec)

通ったー。


mysql> SELECT * FROM connect_test LIMIT 3;
+---------+-----------+--------+-----------+--------------+------------+---------------------+---------------+--------+
| USER_ID | ACTION_ID | SERIAL | REMOTE_IP | HTTP_REFERER | USER_AGENT | START_TIME          | COMPLETE_TIME | STATUS |
+---------+-----------+--------+-----------+--------------+------------+---------------------+---------------+--------+
|  277385 |       159 |      1 | NULL      | NULL         | NULL       | 2014-10-29 04:43:40 | NULL          |      1 |
+---------+-----------+--------+-----------+--------------+------------+---------------------+---------------+--------+
1 row in set (0.11 sec)


xxxx@test-db03>SELECT * FROM TABLE_1;

   USER_ID  ACTION_ID     SERIAL REMOTE_IP
---------- ---------- ---------- ---------------
HTTP_REFERER
--------------------------------------------------------------------------------
USER_AGENT
--------------------------------------------------------------------------------
START_TI COMPLETE     STATUS
-------- -------- ----------
    277385        159          1


14-10-29                   1

取り合えずテスト用のDBを間借りしただけなので何のデータも入ってないけど、同じデータが引けてはいるぽい。

こんなことして何が嬉しいかというと、MariaDBをオペレーター用(Not アプリケーション用)のプロキシとして使うことで
* Oracle側で設定するよりも柔軟にアクセス制限が出来る(かも知れない)
  * MySQL(MariaDB)はカラム単位までアクセス制限ができる
  * 接続元IPアドレスが違えば別ユーザーとして扱える
  * MariaDBならPAM Auditプラグインが入っているので、既存のLDAPと連携できるかも
* Oracle側でやる気にならなさそうな全件クエリーログとかできる
  * アプリケーション用のクエリーは別の方法を模索するとして、内部アクセスの証左にするぶんならgeneral_logとPAM Auditを使えば結構イケるんじゃね?
なあたりのユースケースが無いかなぁと思っている所存。

0 件のコメント :

コメントを投稿