ORA-12543「TNS:接続先ホストに接続できません」の原因と対処法|ping が通るのに接続できないケースも実機で再現

接続先のサーバを変更した直後や、環境を移行した後に、sqlplus からの接続が ORA-12543 で失敗する。
ping を打つと応答が返ってくる。
サーバは動いているように見えるのに、Oracle には接続できない…。

ORA-12543 は「接続先のホストにネットワークで到達できなかった」ことを示すエラーです。
今回は、接続先サーバの停止とファイアウォールの2パターンを実機で再現し、切り分けの手順を実機ログとともに解説します。
リスナー側のエラーである ORA-12541(TNS:リスナーがありません)との違いも整理します。


1. 症状

TNS 接続(@ホスト:ポート/サービス名)を試みると、待たされることなく即座に ORA-12543 が返ります。

$ sqlplus system/oracle@192.168.30.30:1521/v11c19u

ERROR:
ORA-12543: TNS: 接続先ホストに接続できません。

ポイントは「即座に返る」ことです。
長い待ちの後にエラーになる場合は、ORA-12543 ではなく ORA-12170(接続タイムアウト)になります(後述の Q&A を参照)。


2. 原因の仕組み

Oracle への TNS 接続は、次の4段階で進みます。
ORA-12543 は、このうち②「接続先ホストに到達する」段階の失敗です。

① 接続先の情報を解決する(クライアント内)
      │ エントリ名を tnsnames.ora 等で引けない → ORA-12154
      │ エントリ内ホスト名の名前解決に失敗 → ORA-12545
      ▼
② 接続先ホストに到達する(ネットワーク)
      │ 到達できない → ORA-12543 ★本記事(即時)/ ORA-12170(応答がなくタイムアウト)
      ▼
③ リスナーに接続する(ポート 1521)
      │ 接続を拒否される → ORA-12541
      ▼
④ リスナーがサービスへ転送する
      │ サービス名が未登録 → ORA-12514
      ▼
   接続成功

似たエラーの ORA-12541 は③の失敗で、「ホストまでは届いたが、そのポートで接続を拒否された」状態です。
一方、ORA-12543 は②の失敗で、「ホストそのものに到達できなかった」状態です。
つまり、ORA-12543 が出ている時点で、リスナーの状態を調べる以前に、ネットワークレベルで接続先にたどり着けていません。

到達できない原因は、次の2パターンに整理できます。
いずれも実機(Oracle Database 19c(19.28 RU)・Oracle Linux 8.9)で再現して確認したものです。

#原因パターン起きやすい場面
1接続先のホストが停止しているサーバ(OS)の起動忘れ・サーバ自体の障害による停止・移行後に停止済みの旧サーバを向いたまま
2ファイアウォールが「このホストへは通さない」という応答を返している入れ替え後の新サーバで 1521 番ポートの許可が漏れている・ファイアウォールの設定変更で誤って遮断した

パターン2は、接続先のサーバが稼働していても発生します。
ファイアウォールの拒否応答には、「このポートは受け付けない」というポート単位のものと、「このホストへは通さない」というホスト単位のものがあります。
ホスト単位の拒否応答が返ると、クライアントからは「ホストに到達できない」=サーバ停止と同じ見え方になるためです。
どちらの応答を返すかは、ファイアウォール製品や設定によって異なります。


3. パターン1: 接続先のホストが停止している

まず、分かりやすい方のパターンです。
接続先のサーバ(192.168.30.30)が停止している状態で再現しました。

ping を打つと、到達できないことが分かります。

$ ping -c 2 192.168.30.30
PING 192.168.30.30 (192.168.30.30) 56(84) bytes of data.
From 192.168.30.11 icmp_seq=1 Destination Host Unreachable
From 192.168.30.11 icmp_seq=2 Destination Host Unreachable

--- 192.168.30.30 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1006ms

この状態で TNS 接続を試みると、即座に ORA-12543 が返ります。

$ sqlplus system/oracle@192.168.30.30:1521/v11c19u

ERROR:
ORA-12543: TNS: 接続先ホストに接続できません。

サーバ移行後に接続設定が旧サーバ(すでに停止済み)を向いたまま、という形でも同じ状態になります。
接続文字列や tnsnames.ora の HOST が、現在稼働しているサーバを指しているかをあわせて確認します。

tnsnames.ora のエントリは次の形式で、ADDRESS 行の HOST に書かれたホスト名(または IP アドレス)が接続しに行く先です。

V11C19U =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = db-node)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = v11c19u)
    )
  )

この HOST が停止済みのサーバなど到達できない接続先を指していれば、エントリ名で接続したときに ORA-12543 が返ります。
なお、HOST に書かれた名前の名前解決そのものに失敗する場合は、ORA-12543 ではなく ORA-12545 になります(「原因の仕組み」の章の4段階の図の①)。


4. パターン2: ファイアウォールが到達禁止の応答を返している(ホストは稼働中)

次に、判断を誤りやすい方のパターンです。
接続先のサーバは稼働していて、ping には正常に応答します。

$ ping -c 2 192.168.30.254
PING 192.168.30.254 (192.168.30.254) 56(84) bytes of data.
64 bytes from 192.168.30.254: icmp_seq=1 ttl=64 time=0.369 ms
64 bytes from 192.168.30.254: icmp_seq=2 ttl=64 time=0.386 ms

--- 192.168.30.254 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1006ms

ところが、この稼働中のサーバへ TNS 接続を試みると、パターン1と同じ ORA-12543 が即座に返ります。

$ sqlplus system/oracle@192.168.30.254:1521/v11c19u

ERROR:
ORA-12543: TNS: 接続先ホストに接続できません。

このとき何が起きているかは、OS レベルの接続テストで確認できます(次章)。
1521 番ポートへの TCP 接続に対して「このホストへは通さない」というホスト単位の拒否応答(ICMP の到達禁止応答)が返されており、クライアントからは「ホストに到達できない」ように見えている状態です。
この種類の応答を返す代表例が、経路上または接続先サーバのファイアウォールです。
Linux の firewalld は、デフォルトの拒否応答がこのホスト単位の種類(icmp-host-prohibited)のため、firewalld で 1521 番ポートが許可されていないサーバへの接続は ORA-12543 になります。

ファイアウォールが接続を遮断している場合、接続要求はその先のリスナーに届きません。
リスナーが正常に稼働していても、クライアントに返るのは ORA-12543 のままです。
サーバ側の listener.log にもこの接続の試みは記録されないため、調査はクライアント側と経路側から進めることになります。

なお、ファイアウォールの拒否応答がポート単位(「このポートは受け付けない」)の場合は、同じ遮断でもエラーは ORA-12541 になります。
遮断のしかたとエラー番号の対応は、ORA-12541 の記事の「パターン6: ファイアウォールが接続を拒否している」で整理しています。


5. 切り分け手順: /dev/tcp で TCP レベルの応答を確認する

ORA-12543 が「ホスト停止」なのか「ファイアウォールの到達禁止」なのか、そして、そもそも ORA-12541 側の問題ではないのかは、OS レベルの接続テストで切り分けられます。
bash の /dev/tcp 機能を使うと、sqlplus を介さずに素の TCP 接続の結果が見えます。

  • bash には、/dev/tcp/<ホスト>/<ポート> という書き先へリダイレクトすると、そのホストのポートに TCP 接続を試みる機能があります(実ファイルではなく bash の内部機能です)
  • 先頭の timeout 5 は、応答が返らない(破棄されている)場合に 5 秒で打ち切るための保険です
  • telnet や nc がインストールされていないサーバでも、bash さえあれば実行できます

ORA-12543 になる接続先に対して実行すると、「ホストへの経路がありません」が返ります。

$ timeout 5 bash -c 'echo > /dev/tcp/192.168.30.254/1521'
bash: connect: ホストへの経路がありません
bash: /dev/tcp/192.168.30.254/1521: ホストへの経路がありません

一方、ORA-12541 になる接続先(ホストには届くが、ポートで拒否される)では、メッセージが変わります。

$ timeout 5 bash -c 'echo > /dev/tcp/localhost/1526'
bash: connect: 接続を拒否されました
bash: /dev/tcp/localhost/1526: 接続を拒否されました

結果の読み方は次のとおりです。

/dev/tcp の結果意味対応するエラー
ホストへの経路がありませんホスト停止・経路なし・ファイアウォールの到達禁止応答ORA-12543
接続を拒否されましたホストには届くが、そのポートで接続拒否(リスナー不在など)ORA-12541
何も表示されず5秒でタイムアウト応答が破棄されている(ファイアウォールの DROP など)ORA-12170

「ホストへの経路がありません」だった場合は、ping の結果と組み合わせて絞り込みます。
ping も失敗するならホスト停止・経路の問題(パターン1)、ping は通るのに TCP だけ失敗するならファイアウォールの到達禁止応答(パターン2)です。
接続先サーバにログインできるなら、firewalld の設定を firewall-cmd --list-all で確認し、1521 番ポート(またはサービス定義)が許可されているかを見ます。


6. Q&A

Q: ping は通るのに ORA-12543 になるのはなぜですか?

A: ping(ICMP)と TCP 接続は別物だからです。
ファイアウォールは通信の種類ごとに許可・拒否を設定できるため、「ICMP は許可されているが、1521 番ポートへの TCP はホスト単位の応答で拒否される」という状態が成立します。
本記事のパターン2がまさにこの状態で、ping は 0% packet loss なのに TNS 接続は ORA-12543 でした。
ping の結果だけで「ネットワークは正常」と判断せず、/dev/tcp で対象ポートへの TCP 接続を直接確認してください。

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

A: 失敗した段階が異なります。

エラー状態主な原因
ORA-12543接続先ホストにそもそも到達できないホスト停止・経路なし・ファイアウォールの到達禁止応答
ORA-12541ホストには届いたが、ポートで接続を拒否されたリスナー停止・ポート違い・待受アドレスの不一致

ORA-12541 の原因と対処は別記事で6パターンに整理しています。

Q: エラーが即座に返らず、長い待ちの後に接続が失敗する場合も ORA-12543 ですか?

A: いいえ。長い待ちの後に失敗する場合に返るのは、通常 ORA-12170(接続タイムアウト)です。
ORA-12170 は、ファイアウォールが拒否の応答を返さず、パケットを黙って破棄(DROP)している場合などに発生します。
ORA-12543 との違いは「拒否の応答が返ってくるか、何も返ってこないか」で、/dev/tcp のテストなら、即エラーになるかタイムアウトするかで区別できます。

Q: DB サーバ側とクライアント側、どちらから調べるべきですか?

A: ORA-12543 は DB サーバに到達する前の失敗なので、DB サーバのリスナーを調べる前に、クライアント側と経路を確認します。
順序は、①接続文字列・tnsnames.ora の HOST が意図した DB サーバを指しているか、②その DB サーバが稼働しているか、③経路上・DB サーバ OS のファイアウォールが遮断していないか、です。
③まで進んだら、DB サーバの firewalld(firewall-cmd --list-all)や経路上のファイアウォールの設定を確認します。


7. まとめ

ORA-12543 は「接続先のホストにネットワークで到達できない」エラーです。
リスナーの問題(ORA-12541)とは失敗している段階が異なるため、リスナーの調査より先に、接続先の稼働状態とネットワーク経路を確認します。
ping が通っていても、ファイアウォールのホスト単位の拒否応答で発生することがある点に注意してください。

ORA-12543 切り分けフロー

TNS接続で ORA-12543(即時に返る)
        │
        ▼
接続文字列 / tnsnames.ora の HOST は
意図したサーバを指しているか
        │
        ├─ 指していない → HOST を修正(移行後の旧サーバ向きに注意)
        │
        └─ 指している
                │
                ▼
        接続先サーバは稼働しているか
        (ping・コンソール確認)
                │
                ├─ 停止している → パターン1(ホスト停止)
                │                  サーバを起動
                │                  (起動後はリスナーの状態も確認)
                │
                └─ 稼働している
                        │
                        ▼
                timeout 5 bash -c 'echo > /dev/tcp/<ホスト>/1521'
                        │
                        ├─ ホストへの経路がありません
                        │    → パターン2(ファイアウォールの到達禁止応答)
                        │      firewall-cmd --list-all で 1521 の許可を確認
                        │
                        ├─ 接続を拒否されました
                        │    → ORA-12541 側の問題(リスナー停止・ポート違い)
                        │
                        └─ タイムアウト
                             → 応答の破棄(DROP)。ORA-12170 側の問題