RailsでのOracleの問題はrakeで発生しますが、サイトでは発生しません
-
05-07-2019 - |
質問
Oracleデータベースに接続するRailsサイトで作業しており、最初からサイトを構築したわけではありませんが、メンテナンス作業を行っています。このサイトは delayed_jobs プラグインを使用してバックグラウンドタスクを処理します。開発サーバーで rake jobs:work
を実行して、キュー内のすべてのジョブを定期的に処理します(サーバーの構成により、開発サーバーでデーモンバージョンのスクリプトを実行することはオプションではありません)。ただし、コマンドを実行しようとすると、次の古典的なOracleエラーが表示されます。
error
通常、これは認証の問題(たとえば、database.ymlの認証情報が正しくない)になると思いますが、サイトは正常に稼働しています(そして多くのデータベース処理を行っています)。 RAILS_ENV = production
をパラメーターとして rake
に追加して、実稼働環境で強制的に実行しようとしましたが、同じエラーが発生しました(2つの個別のRailsインストールがあります)サイトの実動バージョンと開発バージョンに対応し、開発のdb configファイルの" development"および" production"資格情報を同一に設定しました。
このエラーの原因は不明であり、レールでOracleを使用した経験はあまりありません。提案はありますか?
どうもありがとう!
ジャスティン
EDIT(10/26/09):ここで問題の原因を突き止めることはできません。アプリは引き続き問題なく実行(およびデータベースと通信)しますが、rakeはDBエラーをスローし続けます。スクリプト/コンソールも同様です。これはプロンプトを表示しますが、最初は同じOracleエラーメッセージで文句を言います。探し続けますが、アイデアが不足しています...
EDIT(10/26/09以降):このリンクのアドバイスに従ってください、tnsnames.oraが存在するディレクトリを指すように ORACLE_HOME
と TNS_ADMIN
の両方を設定します。 ORACLE_HOME
を設定するだけでは明らかな効果はありませんでしたが、 TNS_ADMIN
が適切な場所を指すようになったため、コンソールを開いたりrakeを実行しようとするたびにセグメンテーションエラーが発生し始めました:
/usr/local/lib/ruby/site_ruby/1.8/oci8.rb:184:[BUG] Segmentation Fault
そして、プロンプトに不意に起動します。他にアイデアはありますか?
解決
ついに... ORACLE_HOMEがユーザーアカウントの環境変数として正しく設定されていなかったことが判明しました。現在、rake、スクリプト/コンソールなどが喜んでハミングしています。
他のヒント
Oracleエラーには次のように表示されます。
ORA-12154は、oracleネットワーク層によって生成されます。データベースへのログオンプロセス中にTNSエラーメッセージがスローされます。このエラーは、Oracleの通信ソフトウェア(SQL * NetまたはNet8)が、接続パラメーターで指定されたホスト/サービス名を認識しなかったことを示します。このエラーは、ほとんどの場合、Oracle tnsエントリの構成の誤りを示しています。
sqlplusまたは別のdbツールを使用してOracleインスタンスに接続できますか?
アプリが正常に動作するのは奇妙です。
存在しないデータベースを指す可能性のある場所に$ ORACLE_SIDがありますか?
SQLサーバーでは、実際にprofuilerを実行して、実際に送信されているものを確認します。 Oracle asloにはある種のプロファイリングユーティリティがあると確信しています。私はそれを試してみますが、あなたがそれを使っている資格情報を使用していないことがわかるかもしれません。
まあ、マイクが言ったように、ora-12145はTNSがデータベース識別子を解決できなかったことを意味します(TNSはOracleの名前からデータベースへのマッピングであり、DNSのようなものです)。 tnsnames.oraファイルを見つけることができれば、そこで設定されているデータベースを確認し、database.ymlファイルと比較できます。ただし、コマンドラインからではなく遅延ジョブとして機能するという事実は少し奇妙であり、あるコンテキストで設定されている環境変数が他のコンテキストでは設定されていない可能性があると思わせます。
どちらもうまくいかない場合は、 <にトラブルシューティングの提案の長いリストがあります。 a href = "http://ora-12154.ora-code.com" rel = "nofollow noreferrer"> http://ora-12154.ora-code.com (そのエラーコードに固有)。