perlのMOD_PERL2の環境で、DBD::OracleからOracleに接続しようとすると以下のエラーが出力されます。


DBI connect('Host=localhost;SID=XE','user',...) failed: ERROR OCIEnvNlsCreate. Check ORACLE_HOME env var, NLS settings, permissions, etc. at test.cgi line 66

不思議なことにMOD_PERL2でない環境ではエラーになりません。

色々試してみたのですが、自分の力ではどうにも解決できそうになく、どんな些細なことでも結構ですので、どなたか助言して頂けないでしょうか?

どうぞ宜しくお願いします。

以下、環境です。

OS: Fedora7
DB: OracleXE
Perl: 5.8.8
DBI: 1.605
DBD::Oracle: 1.21
Apache::DBI 1.07

%ENVの実行結果(一部抜粋)
ORACLE_HOME /usr/lib/oracle/xe/app/oracle/product/10.2.0/server
NLS_LANG JAPANESE_JAPAN.JA16EUC
ORACLE_SID XE
TWO_TASK XE
ORACLE_BASE /usr/lib/oracle/xe/app/oracle
LD_LIBRARY_PATH /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/lib
MOD_PERL mod_perl/2.0.3

なお以前の似たような質問は既に確認済みです。
http://q.hatena.ne.jp/1128054654

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/07/04 01:28:54
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:shintabo No.2

回答回数45ベストアンサー獲得回数10

ポイント100pt

RETRY:

# 確かに数年前、mod_perlとDBD::Oracleのバグはあったように思いますが

# せっかくなので、XEを入れて試してみました

# http://modperlis.bounceme.net/work/ora.cgi

# 頭に出してるHashを見ると、接続できているようです

#!/usr/bin/perl

use strict;

use warnings;

use DBI;

my $dsn = 'dbi:Oracle:XE';

my $user = 'xxxxx';

my $password = 'xxxxx';

my $dbh = DBI->connect($dsn, $user, $password) or die $!;

print "Content-type:text/html\n\n";

print "$dbh<br>\n";

foreach (keys %ENV) {

print "$_ => $ENV{$_}<br>\n";

}

__END__

# もしかして、コンテンツハンドラ以外ですか?

# 一度、rootでコマンドラインから実行できるように修正して

# httpd.confに以下を追加して、restartするとどうですか?

PassEnv PATH LD_LIBRARY_PATH ORACLE_SID ORACLE_HOME

/usr/local/apache2/bin/apachectl restart

# できれば、そのソースを教えてもらえますか?

goto RETRY;

id:jhappyclub

回答ありがとうございます。

恥ずかしいことにサーバーをリブートしたことで、解決してしまいました。

長らくリブートしていなかったので、古い環境変数を参照していたのかもしれません。

ご迷惑おかけしました。

サンプルの環境まで作って頂いて本当にありがとうございました。助かりました。

2008/07/04 01:24:59

その他の回答1件)

id:shintabo No.1

回答回数45ベストアンサー獲得回数10

# mod_perl環境でない場合に実行するユーザと、

# mod_perl環境での実行ユーザ(httpd?apache?)は一緒ですか?

# 通常kickされるPerl-CGIと、mod_perlでは実行ユーザが違います

# mod_perl環境でない場合に実行するユーザをapacheのユーザにして動作しますか?

id:jhappyclub

回答ありがとうございます。

> # mod_perl環境でない場合に実行するユーザと、

> # mod_perl環境での実行ユーザ(httpd?apache?)は一緒ですか?

どちらもnobodyで試しました。

> # 通常kickされるPerl-CGIと、mod_perlでは実行ユーザが違います

> # mod_perl環境でない場合に実行するユーザをapacheのユーザにして動作しますか?

httpd.confでapacheユーザに変更して、DBD::Oracle.pm で、Oracle OCI の logon関数を呼び出す直前に、getpwuid($>) を実行してみたところ、どちらの環境もapacheユーザで動作も同じでした。

getpwuid($>)を`id`に変更してもどちらの環境も同じapacheユーザでした。なおnobodyもapacheも第2グループにdbaグループを設定しています。

おかしい点がありましたらご指摘頂けると幸いです。宜しくお願いします。

2008/07/03 10:34:17
id:shintabo No.2

回答回数45ベストアンサー獲得回数10ここでベストアンサー

ポイント100pt

RETRY:

# 確かに数年前、mod_perlとDBD::Oracleのバグはあったように思いますが

# せっかくなので、XEを入れて試してみました

# http://modperlis.bounceme.net/work/ora.cgi

# 頭に出してるHashを見ると、接続できているようです

#!/usr/bin/perl

use strict;

use warnings;

use DBI;

my $dsn = 'dbi:Oracle:XE';

my $user = 'xxxxx';

my $password = 'xxxxx';

my $dbh = DBI->connect($dsn, $user, $password) or die $!;

print "Content-type:text/html\n\n";

print "$dbh<br>\n";

foreach (keys %ENV) {

print "$_ => $ENV{$_}<br>\n";

}

__END__

# もしかして、コンテンツハンドラ以外ですか?

# 一度、rootでコマンドラインから実行できるように修正して

# httpd.confに以下を追加して、restartするとどうですか?

PassEnv PATH LD_LIBRARY_PATH ORACLE_SID ORACLE_HOME

/usr/local/apache2/bin/apachectl restart

# できれば、そのソースを教えてもらえますか?

goto RETRY;

id:jhappyclub

回答ありがとうございます。

恥ずかしいことにサーバーをリブートしたことで、解決してしまいました。

長らくリブートしていなかったので、古い環境変数を参照していたのかもしれません。

ご迷惑おかけしました。

サンプルの環境まで作って頂いて本当にありがとうございました。助かりました。

2008/07/04 01:24:59
  • id:Catfish
    かなり昔(7年くらい前)の経験なんですが、MOD_PERLの環境ではいろいろなモジュールで不具合が出て、MOD_PERLを外したことがあります。
    CGIモジュールなどは、CGIのディレクトリにコピーしたり、ファイルパスを直接指定して無理矢理動かした記憶がありますが、DBD::Oracleはうまく動きませんでした。

    MOD_PERL2環境でのみ動かないのであれば、MOD_PERL2特有の問題でしょう。
    MOD_PERLはスクリプトから機械語に変換した内容をキャッシュするため、速く動作します。
    モジュールをかませた場合は、毎回機械語に変換されないと、モジュール側の細かい変化がキャッシュに邪魔されてエラーになる場合があるのでは?・・と考えています。

    ご参考まで。
  • id:jhappyclub
    コメントありがとうございます。
    確かにキャッシュも要因の一つかもしれませんね。
    参考にさせて頂きます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません