【Oracle】ORA-12541の原因と解決方法|TNS:no listener・リスナーに接続できない時の確認ポイント

【Oracle】ORA-12541の原因と解決方法|TNS:no listener・リスナーに接続できない時の確認ポイント Oracle

ORA-12541: TNS:no listener は、Oracleクライアントが指定したホスト・ポートに接続しようとしたものの、その場所でOracleリスナーが待ち受けていない時に発生するエラーです。典型的には、リスナーが起動していない、ポートが違う、ホスト名が違う、ファイアウォールで遮断されている、別のOracle Homeの設定を見ている、といった原因です。

Oracle公式の説明でも、指定されたホストとポートにリスナープロセスがない場合は、リスナーが起動していて、そのキーで待ち受けているかを確認するよう案内されています。そのため、ORA-12541ではまず「リスナーに到達できているか」を確認します。

先に結論
ORA-12541が出たら、最初にDBサーバー上で lsnrctl status を実行します。リスナーが起動していなければ lsnrctl start、起動しているのに出るなら接続先ホスト、ポート、listener.ora、OSファイアウォール、ネットワーク経路を確認します。
スポンサーリンク

ORA-12541とは

ORA-12541は、接続要求を受けるリスナーが見つからない状態です。同じ接続系でも、ORA-12514 はリスナーに到達した後、サービス名が見つからない状態です。ORA-12541では、その前段階としてリスナーそのものに接続できていない可能性が高いです。

Oracleネットワーク設定の全体像は ネットワーク設定の記事 も参考になります。ただし、エラー対応ではまずリスナーの起動状態とポート待受を確認するのが近道です。

リスナーが停止している

DBは起動していても、リスナーが停止していると外部クライアントから接続できません。

ポート番号が違う

クライアントは1521へ接続しているが、リスナーは1522で待ち受けている、といったケースです。

ホスト名やIPが違う

接続先ホストが古い、DNSが違う、別サーバーを見ている場合があります。

ファイアウォールで遮断されている

サーバー側、ネットワーク機器、クラウドセキュリティグループでポートが閉じていることがあります。

最短チェック順

ORA-12541では、次の順番で見ると原因を分けやすくなります。接続文字列を何度も書き換える前に、リスナーとポートの状態を確認します。

1. DBサーバーでリスナー状態を見る

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

2. リスナーを起動する

停止していれば lsnrctl start で起動します。起動後に再度接続確認します。

3. ポート待受を確認する

1521 など、接続文字列で指定したポートをOSが待ち受けているか確認します。

4. クライアントから疎通を見る

DBサーバー外から、指定ホスト・ポートへ到達できるか確認します。

lsnrctl statusでリスナー状態を確認する

DBサーバー上で、Oracleを起動しているOSユーザー、または適切なOracle環境変数を設定した状態で確認します。

check-listener-status.sh
lsnrctl status

# LISTENERが複数ある場合
lsnrctl status LISTENER

lsnrctl status が失敗する、またはリスナーが起動していない場合は、起動します。リスナー確認の詳しい見方は リスナー確認の記事 を参照してください。

DBサーバー内から接続できるか確認する

外部クライアントからORA-12541になる場合でも、DBサーバー内からは接続できることがあります。サーバー内から接続できるなら、リスナー自体は動いていて、外部ネットワーク、ファイアウォール、接続先ホスト名の問題に絞りやすくなります。

local-connect-test.sh
# DBサーバー上で確認する
sqlplus app_user/password@//localhost:1521/orclpdb1

# ホスト名でも確認する
sqlplus app_user/password@//db.example.com:1521/orclpdb1

localhostで成功する

リスナーはローカルでは動いている可能性があります。外部から失敗するなら待受アドレスやファイアウォールを確認します。

localhostでも失敗する

リスナー停止、ポート違い、Oracle Home違い、listener.ora不備を優先して確認します。

localhostは成功、ホスト名は失敗

名前解決、listener.oraのHOST、OSのhosts、DNS、IPv4/IPv6の違いを確認します。

サーバー内は成功、外部だけ失敗

OSファイアウォール、ネットワークACL、クラウドセキュリティグループ、経路を確認します。

lsnrctl startでリスナーを起動する

リスナーが停止しているなら、まず起動します。複数リスナーを使っている場合は、接続先のリスナー名を間違えないようにします。

start-listener.sh
lsnrctl start

# リスナー名を指定する場合
lsnrctl start LISTENER

自動起動設定や起動しない時の確認は リスナー起動の記事 にまとめています。起動後は lsnrctl status とクライアント接続を再確認します。

OSサービスとして起動しているか確認する

手動で lsnrctl start すると直るのに、OS再起動後にまたORA-12541になる場合は、自動起動設定を確認します。LinuxではsystemdやOracle Restart、WindowsではOracle関連サービスの状態を確認します。

check-listener-service-linux.sh
systemctl status oracle-listener

# Oracle Restart / Grid Infrastructure 環境の例
srvctl status listener
srvctl start listener
check-listener-service-windows.ps1
Get-Service | Where-Object { $_.Name -like '*TNSListener*' }

# サービス名の例
Get-Service OracleOraDB19Home1TNSListener

ポート待受を確認する

リスナーが起動していても、クライアントが接続しているポートとリスナーの待受ポートが違うとORA-12541になります。サーバー側で1521などのポートがLISTENしているか確認します。

check-port-linux.sh
ss -lntp | grep 1521

# 環境によっては netstat を使う
netstat -lntp | grep 1521
check-port-windows.ps1
netstat -ano | findstr :1521

# PowerShellの場合
Get-NetTCPConnection -LocalPort 1521

待受がなければリスナーが起動していない、別ポートで起動している、別Oracle Homeのリスナーを見ている可能性があります。

listener.oraのHOSTとPORTを確認する

listener.oraHOSTPORT が、接続文字列と一致しているか確認します。ホスト名変更、IP変更、サーバー移行後にズレることがあります。

listener-ora-address.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = db.example.com)(PORT = 1521))
    )
  )

listener.ora の場所が分からない場合は listener.oraの場所の記事 を参照してください。複数Oracle Homeがある環境では、編集しているファイルと実際に起動しているリスナーの設定ファイルが違うことがあります。

クライアントからホスト・ポートへ疎通確認する

DBサーバー上ではリスナーが起動していても、クライアント側から到達できない場合があります。サーバー側ファイアウォール、ネットワークACL、クラウドセキュリティグループ、VPN、名前解決を確認します。

test-port-from-client.sh
tnsping ORCLPDB1

# Linux / macOS 例
nc -vz db.example.com 1521

# 名前解決確認
nslookup db.example.com
test-port-from-client.ps1
Test-NetConnection db.example.com -Port 1521

tnsping はOracle Netの接続情報確認に使えますが、DBログインまで保証するものではありません。最終的にはSQL*Plusやアプリで実際に接続確認します。SQL*Plusの基本は SQL*Plusの記事 も参考になります。

接続文字列のHOSTとPORTを確認する

ORA-12541では、SERVICE_NAME より先に HOSTPORT を確認します。リスナーに到達できていない段階では、サービス名の問題まで進んでいない可能性が高いためです。

tnsnames-host-port.ora
ORCLPDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = db.example.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = orclpdb1)
    )
  )

接続識別子自体が解決できない場合は ORA-12154の記事 を確認してください。ORA-12154は接続名の解決段階、ORA-12541は指定ホスト・ポートへの接続段階で失敗している点が違います。

ファイアウォールとクラウド設定を確認する

サーバー上では1521がLISTENしていても、外部から接続できない場合はファイアウォールやネットワーク経路を確認します。オンプレミスではOSファイアウォールやネットワーク機器、クラウドではセキュリティグループやネットワークACLが候補です。

DBサーバー上からは接続できる

ローカル接続が成功し、外部から失敗するなら、ネットワーク経路やファイアウォールを疑います。

特定端末だけ失敗する

端末側のDNS、VPN、プロキシ、セキュリティソフト、ネットワークセグメントを確認します。

特定APサーバーだけ失敗する

APサーバーの名前解決、ルーティング、ファイアウォール、接続先設定を確認します。

クラウド環境

セキュリティグループ、NSG、ネットワークACL、踏み台経由の経路を確認します。

複数Oracle Homeに注意する

サーバーに複数のOracle Homeや複数バージョンがあると、思っているリスナーとは別のリスナーを操作していることがあります。ORACLE_HOMEPATH、起動ユーザー、listener.oraの場所を確認します。

check-oracle-home.sh
echo $ORACLE_HOME
which lsnrctl
lsnrctl status

# listener.ora の候補
find $ORACLE_HOME -name listener.ora 2>/dev/null

WindowsではOracle関連サービスが複数あることもあります。ORA-12560と合わせて見る場合は ORA-12560の記事 も参考になります。

リスナーログを確認する

ORA-12541では、そもそもリスナーに到達していない場合、リスナーログに記録が残らないことがあります。逆にログが残っているなら、少なくともリスナーには到達している可能性があります。

listener-log-location.sh
lsnrctl status

# ADR配下の listener.log / log.xml を確認する
# 例: $ORACLE_BASE/diag/tnslsnr/<host>/listener/trace/listener.log

リスナーログの場所と確認方法は リスナーログの記事 を参照してください。ORA-03135のように接続後に切れるエラーは ORA-03135の記事 も参考になります。

似た接続エラーとの違い

ORA-12541は、指定ホスト・ポートにリスナーがいない、または到達できない状態です。接続エラーは、どの段階で失敗しているかで切り分けます。

ORA-12541

指定したホスト・ポートにリスナーがいません。リスナー起動、ポート待受、ファイアウォールを確認します。

ORA-12514

リスナーには到達していますが、指定サービス名をリスナーが認識していません。詳しくは ORA-12514の記事 を参照してください。

ORA-12154

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

ORA-12560

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

ORA-03135

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

対応手順まとめ

  1. DBサーバーで lsnrctl status を実行する
  2. リスナーが停止していれば lsnrctl start で起動する
  3. OS上で指定ポートがLISTENしているか確認する
  4. 接続文字列の HOSTPORT を確認する
  5. クライアントから指定ホスト・ポートへ疎通確認する
  6. サーバー側/ネットワーク側/クラウド側のファイアウォールを確認する
  7. 複数Oracle Homeや別リスナーを操作していないか確認する
  8. リスナーログに接続要求が残っているか確認する

ORA-12541は、リスナーのサービス登録以前に、リスナーそのものへ接続できていない可能性が高いエラーです。まずDBサーバー上でリスナーが起動しているか、指定ポートで待ち受けているかを確認してください。その後、接続文字列、名前解決、ファイアウォール、複数Oracle Homeを順に見ていくと、原因を切り分けやすくなります。

よくある質問

DBは起動しているのにORA-12541になります

DBインスタンスが起動していても、リスナーが停止していると外部接続はできません。lsnrctl status とポート待受を確認してください。

サーバー上では接続できるのに外部から失敗します

サーバー外からのネットワーク経路やファイアウォールが原因の可能性があります。クライアント側から Test-NetConnectionnc でポート疎通を確認します。

lsnrctl startしても直りません

接続文字列のホスト・ポートが別の値になっていないか、別Oracle Homeのリスナーを起動していないか、OSファイアウォールで遮断されていないか確認します。

ORA-12514との違いは何ですか?

ORA-12541はリスナーへ到達できない状態、ORA-12514はリスナーへ到達した後にサービス名が見つからない状態です。まず lsnrctl status が見えるか、次にサービス一覧に目的サービスがあるかを確認します。

参考