Mac で Oracle Database 11g Express Edition (XE) の開発環境をセットアップする
Mac (OS X Mountain Lion)で Oracle 11g の環境を整えたいと思ってセットアップしたんですけど、そこそこ面倒だったので、同じこともう一回調べたくないし、記事にします。
古いけど OS は Mountain Lion で、Apache は Mac 標準のものを使っています。
DB サーバのセットアップ
Mac で Oracle の 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 をコマンド上で使うときには、シェルに環境変数がエクスポートされていれば問題ないですが、Apache の CGI として使う時には、Apache の設定ファイルに SetEnv ORACLE_HOME /opt/oracle/instantclient_11_2
みたいな形で Apache の環境変数を設定する必要があります。
oci8 のインストール
pecl
で oci8 をインストールして、インストール時に出力されたガイドの通りに、php.ini
に extension=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 サーバのセットアップが省略できたものの、思ったより面倒でした。
記憶をたどって書いてるので間違っているかもしれませんが、間違ってたらごめんなさい。
ほなの。