こんにちは。データベースエンジニアのなかつです。
今回は突然oracleに繋がらなくなるエラーである「ORA-12514: TNS: リスナーは現在、接続識別子でリクエストされているサービスを認識していません」の原因と解決方法を紹介します。
この記事には、エラー調査のコマンドや解決するためのコマンドも載せているので、読めば解決に近づけるはずです。
5分ほどで読めるので、エラー解決までお付き合いいただければと思います。
リンクで飛べる目次
ORA-12514: TNS: リスナーは現在、接続識別子でリクエストされているサービスを認識していませんの原因
まず、ORA-12514のエラーについて説明します。
ORA-12514のエラーは「リスナーがクライアントから接続要求を受けた際、接続先となるサービスが存在していない」場合に発生します。(認識していない等も当てはまります)
ORA-12514のエラーメッセージは、以下の通りとなっています。
ORA-12514: TNS: リスナーは接続記述子にあるSERVICE_NAMEを解決できませんでした。
ORA-12514: TNS: リスナーは接続記述子で要求されたサービスを現在認識していません。
ORA-12514: TNS: listener could not resolve SERVICE_NAME given in connect descriptor
ORA-12514: TNS: listener does not currently know of service requested in connect descriptororacleのエラーメッセージより
ORA-12514の原因1 リスナー側の設定の問題
リスナー側の設定に、問題があると接続できませんよね。
記事を読み進めて、リスナー側に問題が無いか確かめましょう!
ORA-12514の原因2 クライアントの接続先設定の問題
クライアントの接続先がずれている場合も同様にエラーが発生します。
記事を読み進めて、クライアントに問題が無いか確かめましょう!
ORA-12514の解決方法1 ホスト側のリスナーに問題が無いか調べよう
はじめにホスト側のリスナーに、問題が無いかを以下の手順で確かめます。
- ホスト側のリスナーが動いているか?
- ホスト側のリスナーの設定があっているか?
順番に説明していきますね!
ORA-12514の解決方法1-1 リスナーが動いているか確認しよう!
まずは、ホスト側のリスナーが動いているかを確かめます。そもそも動いていないと接続することができないので、念のために確認するという認識です。
確かめるコマンドは、以下となっております。
$ lsnrctl status リスナー名
デフォルトの場合は、リスナー名を入力する必要はありません。(あえて指定する場合のみ、リスナー名を入力しましょう!)
もし「リスナーがありません」や「プロトコルアダプタエラー」といった文言が、ターミナルに表示される場合、リスナーが起動していません。
その場合は以下のコマンドを叩いて、再起動させましょう!
$ lsnrctl start リスナー名
リスナー名はこちらもデフォルトと異なる場合に入力すればOKです。(できれば入力しましょう。)
これでリスナーは起動しているはずです。次のステップに進みましょう!
※リスナー起動後は、1分ほど時間をあけてください。
ORA-12514の解決方法1-2 リスナーの設定が合っているか確認しよう
リスナーのサービス名とクライアントの接続先が合っていない場合に、このエラーが発生することが多いです。
そのため、まずはリスナーのサービス名を確認しましょう!下記のコマンドを叩くことで、リスナー側のサービス名を確認することができます。
$ lsnrctl services
これでサービス名の確認ができましたね。それでは引き続き、クライアント側の設定と合っているか確かめていきましょう!
ORA-12514の解決方法2 クライアントの接続先設定を調べよう!
クライアントの接続先設定を調べます。クライアントの接続先は、「tnsnames.ora」に書かれています。
ORA-12514の解決方法2-1 tnsnames.oraを探そう
ここでいうクライアントは設定などにもよりますが、おそらく「DBサーバ」なのでPCのローカルを探さないようにしてください。
DBサーバ→oracleへ接続しに行くので、この場合のクライアントはDBサーバとなりますよね。ターミナル等でDBサーバに接続して、「tnsnames.ora」を探しましょう!
「tnsnames.ora」の配置場所は、プロジェクトによって異なるので、周りの人に聞いてみるのが良いですね。
ちなみにデフォルトでTNS_ADMIN 環境変数が設定されていない場合には、『 $ORACLE_HOME/network/admin』 ディレクトリにあるものを参照するようです。
ORA-12514の解決方法2-2 tnsnames.oraの中身を確認してみよう
「tnsnames.ora」の中身は、以下のようになっています。
mydb =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbserver.rivus.jp)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = my_database)
)
)
「SERVICE_NAME」という項目が、ありますよね?(このソースでは「my_database」となってます。)
これがリスナー側と合っていれば、問題なく繋がるはずです。
ORA-12514: TNS: サービス名を解決できませんでしたの原因と解決方法のまとめ
ORA-12514: TNS: サービス名を解決できませんでしたの原因と解決方法を紹介しました。
読んでいただいた方が、エラーから解消されていれば幸いです。
上記であげた他にも、チェックするべきポイントがあります。
それは「DBのグローバル名」です。
しかしグローバル名が原因で、エラーが起こることは少ないので「サービス名」に特化した記事を作りました。
もしこの記事を読んで解決できていないようであれば、DBのグローバル名で調べてみてください。
\エラーに対して毎回1から調べるのが面倒だよ!という人におすすめ!/
理解しなくてもエラーの対処法や勘所を見つけられるのは、こういうポケットリファレンスなんですよね。
ぜひ一冊手元に置いておこう!