あと味

たくさん情報を食べて、たくさん発信すると、あとになって味わい深い。

Mac で Oracle Database 11g Express Edition (XE) の開発環境をセットアップする

MacOS X Mountain Lion)で Oracle 11g の環境を整えたいと思ってセットアップしたんですけど、そこそこ面倒だったので、同じこともう一回調べたくないし、記事にします。

古いけど OS は Mountain Lion で、ApacheMac 標準のものを使っています。

DB サーバのセットアップ

MacOracle の DB サーバ構築するのはそもそも無理ってことを知ったので、VM セットアップしないといけないのか、やだなーと思って、念のため調べてみたら、用途ぴったりの Vagrantfile 提供している人がいて、それを使わせてもらうことにしました。

DB サーバのセットアップの手順が省略できるので楽できました。

上記の README の Installation のセクションの通りにセットアップすれば、vagrant up して VM 立ち上げている間、localhost の 1521 ポートにアクセスすると、ゲスト OS の 1521 ポートに転送されるので便利です。

Instant Client のインストール

Mac 用の Instant Client が Oracle のサイトでダウンロードできるので、ダウンロードします。次工程を進めていく過程でエラーになる度、それらしいファイルをダウンロードするという手順で、結果的に Basic, SQL*Plus, SDK が必要ということになりました。

上記のサイトから 64 bit 版をそれぞれダウンロードして、アーカイブをそのまま展開すると、instantclient_11_2 ディレクトリの中に各種実行ファイル、ライブラリ、ヘッダーファイルなどが配置されるので、上記のページの Installation セクションの通りに、instantclient_11_2 ディレクトリを /opt/oracle/instantclient_11_2 に移動して、シンボリックリンクの作成と環境変数の設定をしました。

Mac 側にクライアント環境が整ったら、sqlplus で表領域や、ユーザー作れば、DB 操作ができるようになります。

DBD::Oracle のインストール

$ORACLE_HOME, $DYLD_LIBRARY_PATH, $PATH 等の環境変数が設定されていれば、インストール自体はコケることなくすんなりできました。

ただ、実際に使ってみると /ade/ 配下の意味不明なパスからライブラリを探そうとしてエラーになりました。

/opt/oracle/instantclient_11_2 配下の各バイナリがそういう設定になっているようなので、各バイナリを otool -L した時に出力されるパス通りにディレクトリ作って、各ライブラリのシンボリックリンクを置きました。

install_name_tool コマンドでライブラリのパスを変えるという方法もあるらしいのですが、パスが書き換わらないファイルがあったので、あきらめました。DBD::Oracle::Troubleshooting::Macos にもそれらしい手順が書いてあったし。

DBD::Oracle をコマンド上で使うときには、シェルに環境変数がエクスポートされていれば問題ないですが、ApacheCGI として使う時には、Apache の設定ファイルに SetEnv ORACLE_HOME /opt/oracle/instantclient_11_2 みたいな形で Apache環境変数を設定する必要があります。

oci8 のインストール

pecl で oci8 をインストールして、インストール時に出力されたガイドの通りに、php.iniextension=oci8.so を指定しても、php -m では oci8 が認識されてるのに、Apache の 公開パスに置いた PHP ファイルで phpinfo を出力しても、その結果の中には oci8 が反映されてなくて、よくわからなかったので、phpenv と、php-build で、5.4.x を --with-oci8 オプションを指定した(Apache で使うので、--with-apxs2 オプションも指定しました)状態でビルドし、インストールしたら正しく認識されました。

ただ、Apache の公開パスに oci8 を使って DB 接続するプログラムを置いたら、ORACLE_HOME が設定されてないみたいなエラーになりました。

同じプログラムをシェルで実行すると問題なかったので、Apache環境変数がエクスポートされている状態にならないといけないということを理解しました。

調べてみたところ、グローバルに環境変数を設定する場合は、/etc/launchd.conf環境変数を設定すれば良いということがわかったので、ORACLE_HOME やら、DYLD_LIBRARY_PATH やらを設定して解決しました。

利用シーンによって読み込む環境変数が違っていて、面倒な話ですが、シェル、Apache、システム全体の 3 箇所で同じような環境変数を設定する羽目になりました。

まとめ

DB サーバのセットアップが省略できたものの、思ったより面倒でした。

記憶をたどって書いてるので間違っているかもしれませんが、間違ってたらごめんなさい。

ほなの。