【Oracle】ORA-12514の原因と解決方法|listener does not currently know of service requested

ORA-12514: TNS:listener does not currently know of service requested in connect descriptor は、クライアントが指定した SERVICE_NAME を、接続先のOracleリスナーが認識していない時に発生する接続エラーです。ホスト名やポートへ到達できていても、リスナーに目的のサービスが登録されていないと接続できません。

Oracle公式の説明でも、接続要求で指定されたサービス名がリスナーに動的登録されていない、または listener.ora に静的構成されていないことが原因とされています。つまり、ORA-12514では「リスナーが起動しているか」だけでなく、「目的のサービス名をリスナーが知っているか」を確認します。

先に結論
ORA-12514が出たら、まず lsnrctl status でリスナーが認識しているサービス一覧を見ます。その一覧に、接続文字列の SERVICE_NAME がなければ、接続文字列のサービス名ミス、PDBサービス未起動、動的登録未完了、LOCAL_LISTENER 設定不備を疑います。
スポンサーリンク

最短チェック順

ORA-12514では、手当たり次第に設定ファイルを書き換える前に、次の順番で確認します。この順に見ると、接続文字列のミスなのか、リスナー登録の問題なのか、PDBの起動状態なのかを分けやすくなります。

1. 接続文字列を見る

SERVICE_NAME に何を指定しているか確認します。SIDと混同していないかも見ます。

2. リスナーのサービス一覧を見る

lsnrctl status の Services Summary に同じサービス名があるか確認します。

3. DB側のサービスを見る

SHOW PARAMETER service_namesDBA_SERVICES でDB側のサービス名を確認します。

4. PDBと動的登録を見る

PDBがOPENしているか、必要なら ALTER SYSTEM REGISTER で再登録されるか確認します。

ORA-12514とは

ORA-12514は、リスナーには到達できているものの、接続記述子で指定したサービス名が見つからない状態です。リスナー自体が起動していない場合は、別のエラーである ORA-12541: TNS:no listener になることが多いです。

接続エラーは似た番号が多いですが、ORA-12514では HOSTPORT よりも SERVICE_NAME とリスナー登録状態を見るのが近道です。Oracleネットワーク設定の全体像は ネットワーク設定の記事 も参考になります。

リスナーは起動している

lsnrctl status は返るが、目的のサービス名が一覧に出ていない状態です。

接続文字列にサービス名を書いている

SERVICE_NAME = orclpdb1 のような指定が、リスナー側のサービス一覧と一致していない可能性があります。

PDB接続で起きやすい

CDB/PDB環境では、PDBがOPENしていない、PDBサービスが起動していない、サービス名を間違えているケースがあります。

起動直後に出ることがある

DB起動直後、リスナーへの動的登録がまだ反映されていない場合があります。ALTER SYSTEM REGISTER で再登録を促せます。

まずlsnrctl statusでサービス一覧を見る

最初にサーバー側で lsnrctl status を実行し、リスナーが認識しているサービスを確認します。ここに接続したいサービス名がなければ、クライアント側の設定だけを直しても接続できません。

lsnrctl-status.sh
lsnrctl status

# 例: Services Summary に目的のサービス名があるか確認する
# Service "orclpdb1" has 1 instance(s).

リスナー確認の詳しい見方は リスナー確認の記事 を参照してください。リスナーが起動していない場合は リスナー起動の記事 が参考になります。

接続文字列のSERVICE_NAMEを確認する

次に、クライアント側の接続文字列を確認します。特に SIDSERVICE_NAME の混同、PDB名とサービス名の混同、古い tnsnames.ora の参照がよくあります。

tnsnames-service-name.ora
ORCLPDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = db.example.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = orclpdb1)
    )
  )
easy-connect-example.sh
sqlplus app_user/password@//db.example.com:1521/orclpdb1

tnsnames.ora の場所が分からない場合は、listener.oraの場所の記事 と合わせて、TNS_ADMIN やOracle Clientの参照先を確認します。接続識別子自体を解決できない場合は ORA-12154の記事 を参照してください。

DB側でサービス名を確認する

DBへログインできる管理者権限のセッションがある場合は、DB側で現在のサービス名を確認します。接続文字列のサービス名と、DBが提供しているサービス名が一致しているかを見ます。

check-service-names.sql
SHOW PARAMETER service_names;

SELECT name, network_name, pdb, enabled
FROM dba_services
ORDER BY name;

一般ユーザーで DBA_SERVICES が見られない場合は、DBAに確認してもらいます。PDB環境では、接続したいPDBがOPENしているかも重要です。

check-pdb-open-mode.sql
SHOW PDBS;

SELECT name, open_mode
FROM v$pdbs
ORDER BY name;

ALTER SYSTEM REGISTERで再登録する

DB起動直後やリスナー再起動後に、サービスがまだリスナーへ登録されていない場合があります。その場合は、DB側からリスナーへの動的登録を促します。

alter-system-register.sql
ALTER SYSTEM REGISTER;

実行後にもう一度 lsnrctl status を確認し、目的のサービス名が表示されるかを見ます。それでも表示されない場合は、LOCAL_LISTENER、リスナーのホスト/ポート、DBの起動状態、PDBのOPEN状態を確認します。

LOCAL_LISTENERを確認する

動的登録がうまくいかない場合、DBの LOCAL_LISTENER 設定が実際のリスナーに合っていないことがあります。ホスト名変更、ポート変更、複数Oracle Home、コンテナ環境などでは特に注意します。

check-local-listener.sql
SHOW PARAMETER local_listener;

ALTER SYSTEM SET local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=db.example.com)(PORT=1521))' SCOPE=BOTH;
ALTER SYSTEM REGISTER;
LOCAL_LISTENER変更はDBA判断で行う
LOCAL_LISTENER は接続全体に影響します。本番では、既存サービス、RAC/SCAN、複数リスナー、監視設定への影響を確認してから変更してください。

PDBサービスでORA-12514が出る場合

CDB/PDB構成では、CDBへは接続できてもPDBサービスへ接続できないことがあります。PDBがMOUNTEDのまま、サービスが起動していない、接続文字列でCDBのサービス名を指定している、といったケースです。

open-pdb-and-save-state.sql
ALTER PLUGGABLE DATABASE orclpdb1 OPEN;
ALTER PLUGGABLE DATABASE orclpdb1 SAVE STATE;

ALTER SYSTEM REGISTER;
check-pdb-services.sql
ALTER SESSION SET CONTAINER = orclpdb1;

SELECT name, network_name, enabled
FROM dba_services
ORDER BY name;

ALTER SYSTEM REGISTER;

SAVE STATE を使うと、次回CDB起動時にPDBを自動的にOPENする運用にできます。ただし、環境や運用方針により起動制御が異なるため、DBAの方針に合わせてください。

listener.oraに静的登録するケース

通常は動的登録で十分ですが、DBが停止中でも管理接続したい、外部プロシージャや特殊構成がある、といった場合は listener.ora に静的登録することがあります。ただし、静的登録を増やすほど設定管理が複雑になるため、まず動的登録が正しく動くかを確認します。

listener-static-registration.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orclpdb1)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = orcl)
    )
  )

listener.ora の場所や複数Oracle Homeの確認は listener.oraの場所の記事 も参考になります。

ログを確認する

ORA-12514が発生した時刻に、リスナーログへ接続要求の情報が残ることがあります。接続元、接続文字列、サービス名の手がかりを確認します。

listener-log-check.sh
lsnrctl status

# listener.log または log.xml を確認する
# ADR配下の diag/tnslsnr/<host>/<listener>/trace/listener.log など

リスナーログの場所と読み方は リスナーログの記事 を参照してください。

似た接続エラーとの違い

ORA-12514は、リスナーに到達した後、サービス名が見つからない状態です。接続エラーは発生段階で切り分けると分かりやすくなります。

ORA-12514

リスナーは応答していますが、指定したサービス名を認識していません。lsnrctl status のサービス一覧を確認します。

ORA-12154

接続識別子を解決できません。tnsnames.oraやTNS_ADMINを確認します。詳しくは ORA-12154の記事 を参照してください。

ORA-12541

リスナーに到達できない、またはリスナーが起動していない状態です。lsnrctl status やポート待受を確認します。

ORA-12560

TNSプロトコル・アダプタエラーです。Windowsローカル接続や環境変数、サービス状態で見ることがあります。詳しくは ORA-12560の記事 を参照してください。

ORA-03135

接続後に通信が失われた状態です。詳しくは ORA-03135の記事 を参照してください。

対応手順まとめ

  1. lsnrctl status で目的のサービス名が表示されるか確認する
  2. 接続文字列の SERVICE_NAME とリスナーのサービス名を比較する
  3. SIDSERVICE_NAME を混同していないか確認する
  4. PDB接続なら、PDBがOPENしているか確認する
  5. DB側で SHOW PARAMETER service_namesDBA_SERVICES を確認する
  6. ALTER SYSTEM REGISTER で動的登録を促す
  7. 必要に応じて LOCAL_LISTENER を確認する
  8. リスナーログで接続要求のサービス名を確認する

ORA-12514は、リスナーやネットワーク全体が完全に壊れているというより、接続要求で指定したサービス名と、リスナーが認識しているサービス一覧がずれている時に起きやすいエラーです。まず lsnrctl status のサービス一覧と接続文字列を横に並べて確認してください。その上で、PDBのOPEN状態、動的登録、LOCAL_LISTENER、静的登録の要否を順に見ていくと、遠回りせずに原因へ近づけます。

よくある質問

リスナーは起動しているのにORA-12514になります

リスナー起動だけでは不十分です。目的の SERVICE_NAMElsnrctl status のサービス一覧に表示されているか確認してください。

SIDで接続すれば直りますか?

環境によってはSID接続で通ることもありますが、PDBやサービス管理を使う構成では SERVICE_NAME 接続が基本です。アプリの接続先方針に合わせて統一してください。

ALTER SYSTEM REGISTERを実行しても出ます

PDBがOPENしていない、LOCAL_LISTENER が誤っている、接続先リスナーが違う、サービス名自体が違う可能性があります。リスナーのホスト・ポートとDB側設定を再確認します。

SQL DeveloperだけORA-12514になります

SQL Developerが参照している接続名、サービス名、Oracle Client、tnsnames.oraの場所が他ツールと違う可能性があります。Easy Connect形式で直接接続して切り分けると分かりやすいです。

参考