ORA-12514とは

ORA-12514(TNS: リスナーは接続記述子で要求されたサービスを現在認識していません)はクライアントから接続を試みたサービス名がリスナーに登録されていないかった場合に発生するエラーです。


確認事項

クライアントが接続を要求しているサービス名がリスナー側でも登録されていることを確認します。

・クライアント側の確認事項
クライアント側からどのようなサービス名を設定しているか確認します。 サービス名を設定している箇所は各接続インターフェースによって異なりますが、 OCIライブラリを使用しているクライアントからの接続の場合(sqlplus,プリコンパイラ製品、ODP.net、OO4o等)は$ORACLE_HOME/network/admin/tnsnames.ora、 以下のtnsnams.oraの例では「ORCL112」というサービス名が指定されていることがわかります。
ORCL112 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = HOST1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL112)
    )
  )
JDBCでThin接続(Type4接続)を行っている場合はソースやAPサーバのデータソースのプロパティファイルに記載している場合等が多いです。 プロパティファイルでは以下のような形式で指定がされている場合が多く、この例でもORCL112がサービス名となります。
	jdbc:oracle:thin:@HOST1:1521:ORCL112
実際にクライアント側からどのようなサービス名で接続要求があったのかはリスナーログから確認することができます。 以下のログでは、クライアント(HOST1)から「orc112」というサービス名が要求されており結果としてORA-12514が発生したことがわかります
11-3月 -2012 18:43:03 * (CONNECT_DATA=(SERVICE_NAME=orc112)(CID=(PROGRAM=J:\program\oracle\product\11.2.0\dbhome_1\bin\sqlplus.exe)(HOST=HOST1)(USER=user1))) * (ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1762)) * establish * orc112 * 12514
TNS-12514: TNS: リスナーは現在、接続識別子でリクエストされているサービスを認識していません

・サーバ側の確認事項
- データべースに指定したサービス名が登録されているか。
⇒sqlplus で「show parameter service_names」を実行して指定したサービス名を持っているか確認します。

SYS@ORCL112 > show parameter service_names

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
service_names                        string                 ORCL112
- リスナーに指定したサービス名が登録されているか
⇒lsnrctl serviceを実行してリスナに登録されているサービス名を確認します。 以下の例ではCLRExtProc、ORCL112XDB、orcl112という3つのサービスが登録されていることが確認できます。

C:\>lsnrctl service

LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 11-3月 -2012 18:41:25

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=win2)(PORT=1521)))に接続中
サービスのサマリー...
サービス"CLRExtProc"には、1件のインスタンスがあります。
  インスタンス"CLRExtProc"、状態UNKNOWNには、このサービスに対する1件のハンドラがあります...
    ハンドラ:
      "DEDICATED" 確立:0 拒否:0
         LOCAL SERVER
サービス"ORCL112XDB"には、1件のインスタンスがあります。
  インスタンス"orcl112"、状態READYには、このサービスに対する1件のハンドラがあります...
    ハンドラ:
      "D000" 確立:0 拒否:0 現行:0 最大:1022 状態:ready
         DISPATCHER <machine: WIN2, pid: 3836>
         (ADDRESS=(PROTOCOL=tcp)(HOST=win2)(PORT=1620))
サービス"orcl112"には、1件のインスタンスがあります。
  インスタンス"orcl112"、状態READYには、このサービスに対する1件のハンドラがあります...
    ハンドラ:
      "DEDICATED" 確立:0 拒否:0 状態:ready
         LOCAL SERVER
コマンドは正常に終了しました。

解決・対処方法

・データベース起動直後のみ発生し、クライアントが指定しているサービス名はデータベースのSERVICE_NAMEパラメータで定義しているがリスナーにサービスが登録されておらず、 しばらく時間を置くと正常に接続できる
⇒動的登録が済んでいないためです。動的登録とはPMONがにリスナーにサービスを自動登録する仕組みであり登録は1分毎に実施されるためデータベース起動直後は最大1分間接続ができなくなる場合があります。 対応としてはlistener.oraに静的にサービス名を登録するか、データベース起動直後にalter system registerコマンドで 明示的に登録を行うことでデータベースの起動直後に接続可能になります。

・常に発生し、クライアントが指定しているサービス名はデータベースのSERVICE_NAMEパラメータで定義しているがリスナーにはサービスが登録されていない
⇒静的または動的登録の設定がされていません。動的登録の設定はリスナーのポートがデフォルト(1521)の場合は特別な設定をせずとも自動登録してくれますが、 ポートを変更している場合は初期化パラメータであるREMOTE_LISTENERを設定する必要があります。 静的登録の場合はlitener.oraに設定を追加することで静的登録が可能です。

サービスの動的登録、静的登録については クライアントからの接続設定(1)に説明があります。
★ORACLE案件承ります