2010-03-15

OracleさんとPassenger

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Oracleに対して接続するRailsアプリを作り、Passengerで動かしているのですが、
1日2日ほったらかして久しぶりに接続すると接続タイムエラーになり接続できない感じだったりしました。

ちなみにoracleへの接続は
oracleのinstantclient

oracle_enhanced
を利用しています。

ほんとに接続できないかどうか確認するために
sqlplus

script/consoleでモデルに対してfindを実行
したりするとなんら問題なしだったりします。

そしておかしいなぁと思いつつ
apacheを再起動すると動くのが続きました。

RAILS_ROOTに以下のようなsqlnet.logが記録されていました。

Fatal NI connect error 12170.

VERSION INFORMATION:
TNS for Linux: Version 10.2.0.3.0 - Production
TCP/IP NT Protocol Adapter for Linux: Version 10.2.0.3.0 -
Production
Time: 15-MAR-2010 09:23:21
Tracing not turned on.
Tns error struct:
ns main err code: 12535
TNS-12535: Message 12535 not found; No message file for product=
network, facility=TNS
ns secondary err code: 12560
nt main err code: 505
TNS-00505: Message 505 not found; No message file for product=
network, facility=TNS
nt secondary err code: 110
nt OS err code: 0


最初は、たまたま負荷が高いときに接続していて本当に接続タイムアウトになったのかなと思っていたのでが、どうも環境変数がうまく反映されていないようでした。

ちなみに接続には
tnsnames.ora

/usr/local/oracle/network/admin
に記述して利用しています。
なので
config/database.yml
は以下のような感じです。

production:
adapter: oracle_enhanced
database: test
username: test
password: test


なので環境変数を確実に反映されるために以下のようなシェルスクリプトを
/usr/local/bin/ruby_with_env
として用意しました。

#!/bin/bash
export TNS_ADMIN=/usr/local/oracle/network/admin
export NLS_LANG=Japanese_Japan.UTF8
export ORACLE_HOME=/usr/lib/oracle/10.2.0.3/client
export PATH=${ORACLE_HOME}/bin:${PATH}
export LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${LD_LIBRARY_PATH}
/usr/bin/ruby $*

PATHは設定がなくてもよいと思いますが、なんとなく追加です。

chmod 755 /usr/local/bin/ruby_with_env
としておいて

Passengerの設定のRailsRubyを以下のようにします。
RailsRuby /usr/local/bin/ruby_with_env

参考にしたのは、
http://blog.rayapps.com/2008/05/21/using-mod_rails-with-rails-applications-on-oracle/
です。

これでいけるようになった気がします。
コメントを投稿