Oracleデータベースに接続しようとした際に、ORA-12170: TNS: 接続タイムアウトが発生しました というエラーが出ることがあります。
このエラーは、クライアントからデータベースへの接続要求がタイムアウトした場合に発生します。ネットワーク障害や設定不備、ファイアウォールの影響など原因は多岐にわたります。この記事では、調査のポイントをステップごとに解説します。
1. エラーメッセージの確認
まずは実際のエラーメッセージを確認しましょう。例えば以下のように出力されます。
sqlplus
やアプリケーションログに記録されることが多いので、詳細をログからもチェックしておきます。
2. ネットワークレベルの確認
接続タイムアウトの多くはネットワーク経路に起因します。以下を確認しましょう。
-
ping でホストに疎通できるか
-
tnsping でOracleリスナーの応答があるか
-
ファイアウォールやセキュリティグループで 1521/TCP(デフォルトポート)がブロックされていないか
-
VPNやプロキシ経由の場合、経路に問題がないか
3. Oracle Listenerの確認
データベース側でリスナーが正常に動作しているか確認します。
-
状態が
READY
になっているか -
正しいホスト名・ポートで待ち受けているか
-
リスナーログにエラーが出ていないか
4. SQL*Net / TNS設定の確認
クライアント側の tnsnames.ora
や接続文字列の設定を見直します。
-
HOST名/IPアドレス が正しいか
-
SERVICE_NAME / SID が一致しているか
-
環境変数
ORACLE_HOME
やTNS_ADMIN
の設定が適切か
また、サーバ側の sqlnet.ora
にて SQLNET.INBOUND_CONNECT_TIMEOUT や SQLNET.OUTBOUND_CONNECT_TIMEOUT が過剰に短く設定されていないかも確認します。
5. ファイアウォール / OS設定の確認
サーバOS側の設定も見直す必要があります。
-
OSファイアウォール(iptables / firewalld / Windows Defender Firewall)がポート1521を許可しているか
-
クラウド環境の場合、セキュリティグループやネットワークACL が接続をブロックしていないか
-
複数NICやロードバランサーを経由している場合に経路の設定が正しいか
6. タイムアウト値の調整
原因が不明な場合、タイムアウト値の調整も検討できます。
-
クライアント側:
sqlnet.ora
のSQLNET.OUTBOUND_CONNECT_TIMEOUT
-
サーバ側:
sqlnet.ora
のSQLNET.INBOUND_CONNECT_TIMEOUT
-
Listener側:
listener.ora
のINBOUND_CONNECT_TIMEOUT_LISTENER
ただし、根本原因がネットワークや設定不備である場合は、単なる延命策になってしまう点に注意が必要です。
まとめ
ORA-12170 が発生した場合の調査手順は以下の流れで進めると効率的です。
-
ネットワーク疎通確認(ping / tnsping)
-
リスナー稼働状況確認(lsnrctl status)
-
接続設定(tnsnames.ora / 接続文字列)の確認
-
サーバ側ファイアウォールやクラウドセキュリティ設定の確認
-
タイムアウト設定の調整
多くの場合、ネットワーク経路やファイアウォールが原因となるケースが多いため、まずは通信経路の確認から着手するのがポイントです。