sqlplus / as sysdba は繋がるのに TNS 接続だけ失敗する…ORA-12541 の調査と復旧手順

「アプリから DB に繋がらない」という連絡が来た。
確認しようと DB サーバに SSH して sqlplus / as sysdba を叩くとあっさり繋がる。
DB は生きている。なのにアプリからは繋がらない…。

この「直接ログインは可能なのに TNS 接続だけ失敗する」という症状、原因はリスナーの停止かもしれません。今回は ORA-12541(TNS:no listener)の調査手順と復旧方法を実機ログとともに解説します。


1. 症状

TNS 接続(@ホスト:ポート/サービス名)を試みると ORA-12541 が返ります。

$ sqlplus system/oracle@localhost:1521/v11c19u

ERROR:
ORA-12541: TNS: リスナーがありません

一方、BEQ 接続(sqlplus / as sysdba)はリスナーを使わないため、引き続き接続できます。

$ sqlplus / as sysdba

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.28.0.0.0
に接続されました。

SQL> select status from v$instance;

STATUS
------------
OPEN

DB 自体は OPEN 状態で稼働しています。


2. 原因の仕組み

Oracle への接続方式は大きく2つあります。

接続方式コマンド例リスナー使用
BEQ(ローカル IPC)sqlplus / as sysdba使わない
TNS(TCP/IP)sqlplus user/pass@host:port/service使う

BEQ はプロセス間通信(IPC)を使って直接 Oracle プロセスに接続するため、リスナーが停止していても接続できます。一方、TNS 接続はクライアントがまずリスナー(デフォルトポート 1521)に接続し、リスナーが接続先のサーバプロセスに転送する仕組みになっています。リスナーが停止していると、この転送ができないため ORA-12541 が返ります。

つまり、「直接ログインは可能なのに TNS 接続だけ失敗する」という症状はリスナー停止の典型的なサインです。


3. 調査手順

Step 1: lsnrctl status でリスナーの状態を確認する

まず、lsnrctl status でリスナーが動いているかを確認します。

$ lsnrctl status
TNS-12541: TNS: リスナーがありません。
 TNS-12560: TNS: プロトコル・アダプタ・エラー
  TNS-00511: リスナーがありません。
   Linux Error: 111: Connection refused

TNS-12541 が返ればリスナーが停止しています。

Step 2: listener.log でいつ停止したかを確認する

listener.log にはリスナーの起動・停止・接続のタイムスタンプが記録されています。停止した時刻を確認します。

$ tail -50 ${ORACLE_BASE}/diag/tnslsnr/$(hostname)/listener/trace/listener.log
...
07:58:40  リスニングしていません: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)...))
          Listener completed notification to CRS on stop
07:58:40  (COMMAND=stop) * stop * 0

lsnrctl stop が実行されたタイムスタンプが確認できます。計画外の停止であれば、その時刻前後に何があったかをサーバのログや操作履歴と照合します。

Step 3: アラートログで DB の状態を確認する

リスナーが停止していても DB 自体は生きています。アラートログを確認し、DB が正常に稼働していることを確認します。

$ tail -30 ${ORACLE_BASE}/diag/rdbms/${ORACLE_SID}/${ORACLE_SID}/trace/alert_${ORACLE_SID}.log

shutdown や ORA エラーのエントリがなければ DB は正常稼働中です。lsnrctl stop 自体は DB を停止させません。

Step 4: ネットワーク設定ファイルを確認する

リスナーが設定ミスで起動できていない場合も ORA-12541 が発生します。listener.ora と tnsnames.ora を確認し、ホスト名・ポート・SERVICE_NAME に誤りがないかを確認します。

$ cat ${ORACLE_HOME}/network/admin/listener.ora
$ cat ${ORACLE_HOME}/network/admin/tnsnames.ora

listener.ora の確認ポイント

項目確認内容
HOSTサーバのホスト名または IP アドレスと一致しているか
PORTクライアントが接続しているポート(デフォルト 1521)と一致しているか

tnsnames.ora の確認ポイント

項目確認内容
HOSTリスナーが稼働しているホスト名または IP と一致しているか
PORTlistener.ora の PORT と一致しているか
SERVICE_NAMElsnrctl status で表示されるサービス名と一致しているか

4. 復旧手順

リスナーを起動する

$ lsnrctl start

起動直後は「リスナーはサービスをサポートしていません」と表示されます。これはリスナーは起動したが、サービスがまだ登録されていない状態です。

ORA-12514 に注意する

lsnrctl start 直後に TNS 接続を試みると ORA-12514 が返ることがあります。

ERROR:
ORA-12514: TNS:
リスナーは接続記述子でリクエストされたサービスを現在認識していません

ORA-12541(リスナーが停止)とは別物です。リスナーは動いているが、PMON によるサービス登録がまだ完了していない状態を指します。PMON は約60秒間隔で自動的にサービスを登録するため、しばらく待てば接続できるようになります。

今回の実機検証では lsnrctl start から約58秒後に登録が完了し、その後の TNS 接続が成功しました。

すぐに接続したい場合は alter system register

待てない場合は以下のコマンドで PMON によるサービス登録を即時実行できます。

$ sqlplus / as sysdba
SQL> alter system register;

実行後、再度 TNS 接続を試みてください。


5. Q&A

Q: sqlplus / as sysdba は繋がるのに TNS 接続だけ失敗するのはなぜですか?

A: sqlplus / as sysdba はローカル IPC(BEQ)を使って Oracle プロセスに直接接続するため、リスナーを介しません。一方、@ホスト:ポート/サービス名 形式の TNS 接続はリスナー経由のため、リスナーが停止していると失敗します。「直接ログインは可能」という症状はリスナー障害の典型的なサインです。

Q: ORA-12541 と ORA-12514 は何が違いますか?

A: 以下の通りです。

エラー意味主な原因
ORA-12541リスナー自体が停止しているlsnrctl stop 後・プロセスクラッシュなど
ORA-12514リスナーは動いているがサービスが未登録リスナー再起動直後・サービス名の不一致

ORA-12514 はリスナー再起動直後の一時的な状態として発生することが多く、混同しないことが重要です。

Q: lsnrctl start 直後にすぐ TNS 接続したい場合は?

A: alter system register; を使うことで PMON によるサービス登録を即時実行できます。リスナーを起動後、sqlplus / as sysdba から実行してください。

SQL> alter system register;

6. まとめ

ORA-12541 はリスナーの停止が原因で、lsnrctl start で復旧できます。「直接ログインは可能」という症状が添えられていたら、まずリスナーの状態を疑ってください。

ORA-12541 対応フロー

TNS接続で ORA-12541
        │
        ▼
lsnrctl status でリスナー状態を確認
        │
   リスナー停止?
   ├─ YES → lsnrctl start で起動
   │          │
   │          ▼
   │        起動直後に ORA-12514 が出る場合
   │          → しばらく待つ(約60秒)
   │            または alter system register; を実行
   │          │
   │          ▼
   │        TNS 接続成功 → 復旧完了
   │
   └─ NO  → listener.ora / tnsnames.ora の設定を確認
              サービス名・ホスト名・ポートの誤りがないかを確認