Oracle 10g + Perl DBD-Oracle で結構ハマッた・・・
引き続き、Oracle 10g ネタ。今度は、Perl DBD-Oracle でハマッた。なんっつーか、Oracle って移行するたびにバッドノウハウが必要。MySQL とかオープンソースなデータベースの方がよっぽど簡単といつも思い知らされる。
そうか、自分が Perl 使いだからか・・・Java で JDBC とか使えばこんなに苦労しないのかも・・・とちょっと思ったりしましたが、Lightweight Language が好きなので文句を言っても仕方がない。シコシコと頑張る。
failed: ERROR OCIEnvNlsCreate
初めに出たエラーは、こんな感じ。今までこのエラーはよく見てきました。ORACLE まわりの環境変数を Apache の conf に記述しなかったときによく見るエラー。つまりは、httpd.conf で
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 をリコンパイルする際の手順は下記の感じで。
- 古い Oracle 9i をディレクトリ名を変更するなり、削除するなりしておく。
- /etc/bashrc などでの環境変数の設定値は移行後の 10g のパスに変更。
- /etc/ld.so.conf から古い Oracle 9i のライブラリパスを削除して新しい Oracle 10g のライブラリパスを追加。
その後、/sbin/ldconfig を実行。 - サーバを再起動してから DBD-Oracle のリコンパイル。
さて、コレで上手くいくかと思いきやまだダメ。
libclntsh.so.10.1: cannot open shared object file
次は、こんなエラーがでました。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 な環境は整いました。
コメントやシェアをお願いします!
gold46
お世話になります。
自分の環境では
/home/oracle/app/oracle/OraHome_2/libが該当しているようでしたので、
この内容を/etc/ld.so.confに追加・再起動としました。
oracleは立ち上がったのですが、./httpd startで失敗となってしまいました。
とりあえず元に戻しました。
エレガントな解決策は、Apache user のセカンドグループを dba にして、グループの読み取り実行権限を付与すればOK。
とありましたので、
id apache
と入力すると
uid=48(apache) gid=48(apache) 所属グループ=(apache),501(oinstall),502(dba)
と出力されます。
ただ「グループの読み取り実行権限を付与すればOK。」の箇所が理解できない状況です。
お忙しいところ、申し訳ございませんが、もしお時間ございましたら、教えて頂けないでしょうか。
失礼致します。
gold46
お世話になります。
こんなに早くコメントを頂けるとは思いませんでした。
ありがとうございます。
これから確認させて頂きます。
結果は後ほどご連絡致します。
本当にありがとうございました。
失礼致します。
drk
gold46 さん>Oracle を入れた後に、/etc/ld.so.conf に
/db/oracle/product/10.2.0/db/lib
/db/oracle/product/10.2.0/db/lib32
/db/oracle/product/10.2.0/db/instantclient
※パス情報は適当に変更下さい。
みたいなのを追加して、/sbin/ldconfig -v
とでもしてからサーバ再起動してみては如何でしょうか?
gold46
始めまして、
時々参考にさせて頂いております。
実は自分も
----
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'
----
といった同様のエラーが出てしまい、直せず、非常に困っております。
環境
サーバ redhat es ver4 update3
apache 2
データベース oracle10g (10.1.0.3)
dbi-1.20
dbd-1.12
といった環境で作業しております。
あまりlinuxは得意でありません。
そのため書かれております対処方法も自分なりに行ってみたのですが、解決致しません。
大変お忙しいところ、申し訳ございませんが、
もしお時間ございますようでしたら、ヒントを頂けないでしょうか。
宜しくお願い致します。
失礼致します。