こんにちは小林です。
OracleDBにリモート接続する際の定番のエラー「ORA-12154」の原因が分からず苦労しました。初歩的なミスなんですが皆さんが同じミスをしないように自分の失敗談を記載します。
前提
DBサーバ:RDS for Oracle
クライアント:PC(Windows11)
状況:簡易接続はできるがローカルネーミング接続
ORA-12154とは?
以下の記述がORACLE公式のエラー説明文です。接続識別子が間違っているか、認識できていない。ということはtnsnames.oraあたりが怪しい、というのは理解できました。
接続識別子を解決できない
データ・ストアに接続しようとすると、ORA-12154「TNS: 指定された接続識別子を解決できませんでした」が表示されることがあります。
この問題は、Cache ConnectとOracleを同じマシン上で使用するときに、TNS_ADMIN環境変数がOracleの正しいTNSNAMES.ORAファイルを指していない場合に発生することがあります。たとえば、ラップトップでOracleデータベースの複数のインスタンスが稼働している場合に、この問題が発生することがあります。
tnsnames.ora(間違った書き方)
さっそくtnsnames.oraの確認をしてみました。以下がエラーが発生する書き方です。間違っている箇所は分かりますか?
(HOSTの箇所は※で伏せています)
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = database-oracle.※※※.rds.amazonaws.com)(PORT = 1521))
(CONNECT_DATA =
(SID = ORCL)
)
)
2行目にインデント(字下げ)が入っていないのが原因みたいです。。。
以下がOracle公式の説明です。
リンクにtnsnames.oraの記述ルールが記載されているのでインデントを修正しても直らない場合は参考にしてみてください。
インデントによって、キーワード値ペアの親または所有者がどのキーワードであるかわかるように、構成ファイルを設定します。次のようにファイルにインデントを選択しない場合、折り返した行を少なくとも1つの空白でインデントする必要があります。インデントされていないと、その行は新しいパラメータとして誤って読み込まれます。次の構文を使用できます。
tnsnames.ora(正しい書き方)
以下が修正したtnsnames.oraです。目視ではわかりづらいかもしれませんんが二行目にインデントを追記しています。
自分の個人環境なので問題ありませんでしたが、原因に気付くのに二日ぐらいかかりました
みなさんは私みたいになるな!(笑)
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = database-oracle.※※※.rds.amazonaws.com)(PORT = 1521))
(CONNECT_DATA = (SID = ORCL)
)
)