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
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;
# mod_perl環境でない場合に実行するユーザと、
# mod_perl環境での実行ユーザ(httpd?apache?)は一緒ですか?
# 通常kickされるPerl-CGIと、mod_perlでは実行ユーザが違います
# mod_perl環境でない場合に実行するユーザをapacheのユーザにして動作しますか?
回答ありがとうございます。
> # 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グループを設定しています。
おかしい点がありましたらご指摘頂けると幸いです。宜しくお願いします。
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;
回答ありがとうございます。
恥ずかしいことにサーバーをリブートしたことで、解決してしまいました。
長らくリブートしていなかったので、古い環境変数を参照していたのかもしれません。
ご迷惑おかけしました。
サンプルの環境まで作って頂いて本当にありがとうございました。助かりました。
回答ありがとうございます。
恥ずかしいことにサーバーをリブートしたことで、解決してしまいました。
長らくリブートしていなかったので、古い環境変数を参照していたのかもしれません。
ご迷惑おかけしました。
サンプルの環境まで作って頂いて本当にありがとうございました。助かりました。