ORA-12154: TNS:could not resolve the connect identifier specified がでた

ORA-12154 ってエラーを体験しました。Apache のエラーログにこんな感じのエラーログがでてました。

DBI connect('testdb','test',...) failed: ORA-12154: TNS:could not resolve the connect identifier specified (DBD ERROR: OCIServerAttach) at /usr/local/apache/TestApp/Model/test.pm line 12

tnsnames.ora も変更していないのに、「指定された接続識別子を解決できません」なんてエラーが納得いかないんです。で、更に良くアクセスログを調査していきましたら、もう何年も前の古い cgi 内部で環境変数 $ENV を汚染していました。

Oracle を 8.1.6 → 9.2.0 → 10.2.0 と3段階もアップグレードしているので、その都度 ORACLE_HOME とか path 情報が変わります。うっかりと mod_perl とかで古い環境変数が設定された cgi なんかを起動してしまうと、環境変数 $ENV{ORACLE_HOME} 等の oracle 起動・接続に必要な環境変数が汚染されて正常に動作しなくなると言う罠。

ってことで、古い使っていない cgi はとっととサーバ上から削除すべし!というのを学びました。
- スポンサーリンク -


ついでなので、ORA-12154 の解説。どちらかというと、このエラーはデータベース構築中に見かけるエラーかと思います。

ORA-12154: TNS:could not resolve the connect identifier specified

TNS: 指定された接続識別子を解決できませんでした

原因

接続識別子を使用してデータベースまたは他のサービスへの接続時に、指定された接続識別子が解決できない場合に発生。
  1. tnsnames.ora の記述が間違っている
  2. oracle に必要な環境変数が間違っている
  3. tnsnames.ora への OS 上のアクセス権が足りないため参照できない
  4. リスナーがおかしくなっている
が考えられます。

対処方法

上記原因の3点を疑う。データベース構築中であれば、1か3が原因でしょう。運用中に突然発生したならば2か4が原因でしょう。4のリスナーがおかしくなるのは極希かと思います。

疑わしい部分を修正しては tnsping で接続識別子の名前解決ができるかを検証する作業を繰り返せば正常に繋がるようになると思います。なかなか設定がうまく行かない場合は、おとなしく Net Configuration Assistant (netca) を起動して listener.ora と tnsnames.ora を構成するのが良いと思います。

それでもダメなら、リスナーを再起動してみては如何でしょうか。やっぱり Oracle は勉強が大切!

最新Oracle10gマスタリングハンドブック―最強RDBMSアーキテクチャの全貌と構築/運用テクニック
岡本 順孝 サイバネティック
秀和システム (2005/02)
売り上げランキング: 25,711
- スポンサーリンク -