Oracle 10g + Perl DBD-Oracle で結構ハマッた・・・

引き続き、Oracle 10g ネタ。今度は、Perl DBD-Oracle でハマッた。なんっつーか、Oracle って移行するたびにバッドノウハウが必要。MySQL とかオープンソースなデータベースの方がよっぽど簡単といつも思い知らされる。

そうか、自分が Perl 使いだからか・・・Java で JDBC とか使えばこんなに苦労しないのかも・・・とちょっと思ったりしましたが、Lightweight Language が好きなので文句を言っても仕方がない。シコシコと頑張る。

- スポンサーリンク -

failed: ERROR OCIEnvNlsCreate

初めに出たエラーは、こんな感じ。

DBI connect('TESTDB','orcl',...) failed: ERROR OCIEnvNlsCreate (check ORACLE_HOME and NLS settings etc.) at /apache/cgi-bin/cron/db_test.cgi line 41

今までこのエラーはよく見てきました。ORACLE まわりの環境変数を Apache の conf に記述しなかったときによく見るエラー。つまりは、httpd.conf で

SetEnv ORACLE_HOME /oracle/product/10.2.0
SetEnv NLS_LANG JAPANESE_JAPAN.JA16EUC
SetEnv ORACLE_SID TESTDB

なんてのを定義しましょうってこと。が、しかし、今回も当然ながらこの点はちゃんとクリアしてました。かなり悩んだあげく判明した原因は、DBD-Oracle のコンパイル時に古い Oracle 9i を見に行ってコンパイルされていたようです。したがって、Oracle 9i の include-file でコンパイルされた DBD-Oracle が 10g の nls/data/ を見に行って、何か変だ!と怒っていたのですね。

Oracle を移行して、DBD-Oracle をリコンパイルする際の手順は下記の感じで。

  1. 古い Oracle 9i をディレクトリ名を変更するなり、削除するなりしておく。
  2. /etc/bashrc などでの環境変数の設定値は移行後の 10g のパスに変更。
  3. /etc/ld.so.conf から古い Oracle 9i のライブラリパスを削除して新しい Oracle 10g のライブラリパスを追加。
    その後、/sbin/ldconfig を実行。
  4. サーバを再起動してから DBD-Oracle のリコンパイル。


さて、コレで上手くいくかと思いきやまだダメ。

libclntsh.so.10.1: cannot open shared object file

次は、こんなエラーがでました。

install_driver(Oracle) failed:
Can't load '/usr/local/lib/perl5/site_perl/5.8.6/x86_64-linux-thread-multi/auto/DBD/Oracle/Oracle.so'
for module DBD::Oracle: libclntsh.so.10.1: cannot open shared object file: No such file or directory
at /usr/local/lib/perl5/5.8.6/x86_64-linux-thread-multi/DynaLoader.pm line 230.
at (eval 300) line 3\nCompilation failed in require at (eval 300) line 3.
Perhaps a required shared library or dll isn't installed where expected\n at /apache/cgi-bin/cron/db_test.cgi line 41

むっはーって感じですが、Apache user が Oracle ディレクトリの読み取り実行権限が無いことが原因でした。エレガントな解決策は、Apache user のセカンドグループを dba にして、グループの読み取り実行権限を付与すればOK。

面倒なら chmod -R 755 oracle あたりで如何でしょうかと言う感じ。

取りあえず、すんなりとは行かなかったものの、無事に Oracle 10g + Perl DBD-Oracle な環境は整いました。

- スポンサーリンク -