ORA-12154とは

ORA-12154(TNS: 指定された接続識別子を解決できませんでした、TNS:could not resolve the connect identifier specified)はtnsnames.oraが読み込めなかった場合か、読み込めたが指定した接続識別子がtnsnames.oraになかった、または構文エラー等で設定が無視された場合に発生するエラーです。


原因・対処

tnsnames.oraは$ORACLE_HOME/network/admin配下がデフォルトの参照先ですのでこのファイルの記載内容が正しいかをまず確認します。正しい記載方法がわからない場合はnetcaで定義を再作成する方法が簡単です。

sqlplusでは接続することができるがアプリケーションからはORA-12154で接続できないというケースでは、 複数のORACLEをインストールしたことでsqlplusが参照するtnsnames.oraとアプリケーションが参照するtnsnames.oraが異なってしまっていることが原因のケースが多く見られます。

これはsqlplusのtnsnames.oraのデフォルト参照先はsqlplusがインストールされているORACLE_HOME配下になるのに対し、アプリケーションが参照するtnsnames.oraはミドルウエアの種類や環境変数によって変わるためです。 例えば、OO4Oの場合はレジストリに登録されているOO4Oライブラリのパスによって読み込まれるtnsnames.oraは変わり、 Pro*C等ではWindowsの場合は環境変数PATHの値で最も先頭に近いORACLE_HOME、UNIX系の場合は環境変数ORACLE_HOMEの設定等で変わります。

そのほかにもネットワーク関連の設定ファイルパスを直指定する環境変数TNS_ADMINが設定されている場合や、Windowsにおいてはアプリケーションのカレントディレクトリにtnsnames.oraがあることで同様の問題が発生する可能性があります。

確認方法

アプリケーションが実際にどのパスのtnsnames.oraを参照したのかを確認したい場合はWindowsではprocess monitor、Linuxではstrace、AIX等ではtrussといったツールによりシステムコールをトレースしてどのファイルを読み込んだのか確認することができます。

Windows環境でのprocess monitorによる確認 procmon_tnsnames

Linux環境でのstraceによる確認
[ora102@linux1 tmp]$ strace -f -F -tt -o ./strace.txt sqlplus test/test@orcl102

SQL*Plus: Release 10.2.0.4.0 - Production on 金 4月 29 14:31:47 2011

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
に接続されました。
SQL> exit
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing optionsとの接続が切断されました。
[ora102@linux1 tmp]$ cat strace.txt| grep tnsnames
31652 14:31:47.664941 access("/home/ora102/.tnsnames.ora", F_OK) = -1 ENOENT (No such file or directory)
31652 14:31:47.665026 access("/etc/tnsnames.ora", F_OK) = -1 ENOENT (No such file or directory)
31652 14:31:47.665097 access("/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora", F_OK) = 0 読み込まれたtnsnames.ora
31652 14:31:47.665281 stat64("/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora", {st_mode=S_IFREG|0644, st_size=1083, ...}) = 0
31652 14:31:47.665403 open("/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora", O_RDONLY|O_LARGEFILE) = 11
31652 14:31:47.665745 read(11, "# tnsnames.ora Network Configura"..., 4096) = 1083
★ORACLE案件承ります