【完全ガイド】ORA-12170: TNS:Connect timeout occurred の原因と解決方法|Firewall・タイムアウト・JDBC/Python 徹底解説

【完全ガイド】ORA-12170: TNS:Connect timeout occurred の原因と解決方法|Firewall・タイムアウト・JDBC/Python 徹底解説

Oracle 開発者・DBA がネットワーク接続時に頻繁に遭遇する重要エラー:

ERROR:
ORA-12170: TNS:Connect timeout occurred

Oracle 21c 以降は、より詳細なメッセージ:

ORA-12170: Cannot connect. TCP connect timeout of 30s for host 10.9.7.5 
port 1522. (CONNECTION_ID=1ABcDEabCd1aB+AbCdE1aB==)

**「接続タイムアウト」**というシンプルなメッセージ。アプリケーションが DB に接続できない深刻な問題です:

  • 業務アプリ全体の停止
  • バッチ処理の失敗
  • ユーザーからの問い合わせ集中
  • ネットワーク or DB の問題判別が難しい
  • DBA + ネットワーク管理者の協力が必要

このエラーの本質は、指定時間内に TCP 接続 or Oracle ハンドシェイクが完了しない:

接続の流れ:
1. クライアントが Listener の TCP ポート(通常 1521)に接続要求
2. TCP ハンドシェイク(3-way handshake)
3. Oracle プロトコルネゴシエーション
4. 認証
5. セッション確立

どこかで指定時間を超過 → ORA-12170
目次

3 種類のタイムアウト(21c+ で詳細化)

Oracle 21c 以降のエラーメッセージは 3 種類に分類:

TCP connect timeout:      TCP レベルの接続失敗
Outbound connect timeout: クライアント側の全体タイムアウト
Receive timeout:          サーバー応答待ちタイムアウト

どの段階で失敗したかにより対処が異なります。

接続系エラー 5 種の位置づけ

Oracle 接続系エラーの完全比較:

ORA-12541: TNS:no listener
  → Listener が起動していない
  → 即座に失敗(タイムアウトなし)

ORA-12154: TNS:could not resolve the connect identifier
  → tnsnames.ora の service name が見つからない
  → クライアント側の名前解決失敗

ORA-12514: TNS:listener does not currently know of service
  → Listener は起動しているが service_name 未登録

ORA-12170: TNS:Connect timeout occurred  ← 本記事
  → ネットワーク or 応答遅延でタイムアウト

ORA-01017: invalid username/password
  → 認証失敗(接続自体は成功)

現場で最も典型的なパターン:

  • Firewall がポート 1521 をブロック(最頻出)
  • ネットワーク遅延(VPN、WAN、Cloud)
  • Listener 過負荷(大量接続要求)
  • SQLNET.INBOUND_CONNECT_TIMEOUT が短すぎる(サーバー側)
  • SQLNET.OUTBOUND_CONNECT_TIMEOUT が短すぎる(クライアント側)
  • DNS 解決の遅延
  • サーバー CPU 100%(応答返せず)
  • VPN 接続の問題
  • AWS/Azure/GCP Security Group の設定ミス
  • Listener log ファイル肥大化(意外な原因)

多くの日本語記事が「Firewall を確認せよ」で終わりますが、実務では:

  • 接続系エラー5種の厳密な区別
  • 3種類のタイムアウト(TCP / Outbound / Receive)の理解
  • tnsping vs telnet vs nc による段階的診断
  • SQLNET.INBOUND_CONNECT_TIMEOUT vs OUTBOUND_CONNECT_TIMEOUT
  • TCP.CONNECT_TIMEOUT パラメータ
  • JDBC の oracle.net.CONNECT_TIMEOUT / setLoginTimeout()
  • Python oracledb の tcp_connect_timeout
  • Cloud(AWS RDS / Azure / GCP)Security Group
  • listener.log の肥大化による接続遅延
  • Rails ActiveRecord checkout_timeout

さらに、Oracle 公式が推奨する診断アプローチ:

1. tnsping で TNS レベル確認
2. telnet or nc でポート開放確認
3. lsnrctl status で Listener 確認
4. listener.log でエラー確認
5. sqlnet.ora のタイムアウト設定確認
6. Firewall / Security Group 確認

本記事では、ORA-12170: TNS:Connect timeout occurred完全な原因と解決方法を、リファレンスとして実用的に整理します。10大発生パターン、3種類のタイムアウト、6つの解決策、Cloud 対応、Rails/Java/Python 対応、実践シナリオ、FAQまで完全網羅。この1本で ORA-12170 に冷静に的確に対処できるようになります。


結論:Firewall/タイムアウト設定確認

時間がない方向けに、最速の対処を先に示します。

エラーメッセージの読み方(21c+)

ORA-12170: Cannot connect. <type> timeout of <sec>s for host <ip> port <port>.
                              ↑            ↑            ↑        ↑
                         タイムアウト種類  秒数       ホスト  ポート

<type>:
- TCP connect: TCP 接続失敗
- Outbound connect: クライアント全体タイムアウト
- Receive: サーバー応答遅延

最速の診断手順

# STEP 1: TNS レベル確認
$ tnsping ORCL

# STEP 2: TCP ポート確認
$ telnet dbserver 1521
# または
$ nc -zv dbserver 1521

# STEP 3: DNS 解決確認
$ nslookup dbserver
$ ping dbserver

# STEP 4: Listener 状態(DB サーバーで)
$ lsnrctl status

# STEP 5: listener.log 確認
$ tail -100 $ORACLE_BASE/diag/tnslsnr/*/listener/trace/listener.log

6つの解決策

#手法使う場面
Firewall 設定ポートブロック
INBOUND_CONNECT_TIMEOUTサーバー側
OUTBOUND_CONNECT_TIMEOUTクライアント側
JDBC 設定Java アプリ
Python oracledb 設定Python アプリ
Listener 再起動Listener 問題

接続系エラー 5 種

エラー意味
ORA-12541Listener 未起動
ORA-12154TNS 名前解決失敗
ORA-12514Service 未登録
ORA-12170接続タイムアウト
ORA-01017認証失敗

詳細は以下で解説します。


Oracle 接続の仕組み

接続の全体フロー

アプリケーション
     ↓ oracledb.connect()
Oracle ドライバ
     ↓ tnsnames.ora 参照
Service Name → Host + Port + Service
     ↓ TCP 接続要求
Firewall / Security Group  ← 通過必要
     ↓
Listener (port 1521)
     ↓ Service 検索
Oracle Server プロセス
     ↓ 認証
セッション確立

3 種類のタイムアウトの詳細

Oracle 21c+ の分類:

TCP connect timeout:
- OS レベルの TCP 接続タイムアウト
- 通常 30秒
- 対処: TCP.CONNECT_TIMEOUT

Outbound connect timeout:
- クライアントからサーバーへの全体タイムアウト
- Oracle Net の上位レベル
- 対処: SQLNET.OUTBOUND_CONNECT_TIMEOUT

Receive timeout:
- サーバーからの応答待ち
- ハンドシェイク中
- 対処: SQLNET.RECV_TIMEOUT

タイムアウトパラメータの階層

サーバー側 (sqlnet.ora on DB server):

  • SQLNET.INBOUND_CONNECT_TIMEOUT
  • SQLNET.SEND_TIMEOUT
  • SQLNET.RECV_TIMEOUT

クライアント側 (sqlnet.ora on client):

  • SQLNET.OUTBOUND_CONNECT_TIMEOUT
  • TCP.CONNECT_TIMEOUT
  • SQLNET.RECV_TIMEOUT

接続文字列 (Easy Connect / tnsnames.ora):

  • CONNECT_TIMEOUT
  • TRANSPORT_CONNECT_TIMEOUT

優先順位: 接続文字列 > sqlnet.ora。


【原因①】Firewall ブロック(最頻出)

症状

$ tnsping ORCL
TNS-12170: TNS:Connect timeout occurred

$ telnet dbserver 1521
Trying dbserver...
# 応答なし、タイムアウト

診断

A. サーバー側 Firewall(Linux):

# firewalld
$ sudo firewall-cmd --list-all

# iptables
$ sudo iptables -L -n | grep 1521

B. Windows Firewall:

Get-NetFirewallRule | Where-Object DisplayName -like "*Oracle*"

C. クラウド Security Group:

  • AWS: EC2 Console → Security Groups → Inbound rules
  • Azure: NSG → Inbound security rules
  • GCP: VPC → Firewall rules

解決

A. Linux firewalld でポート開放:

$ sudo firewall-cmd --permanent --add-port=1521/tcp
$ sudo firewall-cmd --reload

B. iptables:

$ sudo iptables -A INPUT -p tcp --dport 1521 -j ACCEPT
$ sudo iptables-save

C. AWS Security Group:

Inbound rule:
Type: Custom TCP
Port: 1521
Source: <クライアント IP>

接続系は ORA-12541: no listener の記事、ORA-12154: TNS could not resolve の記事も参照してください。


【原因②】ネットワーク遅延(VPN/WAN)

症状

$ ping dbserver
# RTT が数百ms以上、パケットロス

$ traceroute dbserver
# 多数のホップ、途中で遅延

診断

# レイテンシ確認
$ ping -c 10 dbserver

# 経路確認
$ traceroute dbserver

# 帯域確認
$ iperf3 -c dbserver

解決

A. タイムアウト拡張:

sqlnet.ora (client):

SQLNET.OUTBOUND_CONNECT_TIMEOUT = 60
TCP.CONNECT_TIMEOUT = 60
SQLNET.RECV_TIMEOUT = 60

tnsnames.ora:

ORCL =
  (DESCRIPTION =
    (CONNECT_TIMEOUT = 60)
    (TRANSPORT_CONNECT_TIMEOUT = 60)
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
    (CONNECT_DATA = (SERVICE_NAME = ORCL))
  )

B. ネットワーク最適化(VPN 見直し等)。


【原因③】Listener 過負荷

症状

$ lsnrctl status
# STATUS レスポンスが遅い
# Number of Connections が異常に高い

listener.log に大量のエラー:

TNS-12518: TNS:listener could not hand off client connection

解決

A. Listener 再起動:

$ lsnrctl stop
$ lsnrctl start

B. LOCAL_LISTENER 分散:

ALTER SYSTEM SET LOCAL_LISTENER = 
  '(ADDRESS=(PROTOCOL=TCP)(HOST=host1)(PORT=1521))';

C. 接続プール使用(アプリ側)。


【原因④】SQLNET.INBOUND_CONNECT_TIMEOUT

シナリオ(サーバー側)

サーバーの sqlnet.ora:
SQLNET.INBOUND_CONNECT_TIMEOUT = 60

このタイムアウト内にクライアントが認証完了しないと ORA-12170
alert.log に該当ログ

診断

# サーバー側の sqlnet.ora
$ cat $ORACLE_HOME/network/admin/sqlnet.ora | grep INBOUND

解決

サーバー側で拡張:

SQLNET.INBOUND_CONNECT_TIMEOUT = 120

設定後、Listener 再起動:

$ lsnrctl reload

【原因⑤】SQLNET.OUTBOUND_CONNECT_TIMEOUT

シナリオ(クライアント側)

クライアントの sqlnet.ora:
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 30

この時間内に接続確立しないと ORA-12170

解決

クライアント側で拡張:

SQLNET.OUTBOUND_CONNECT_TIMEOUT = 60
TCP.CONNECT_TIMEOUT = 60

【原因⑥】DNS 解決の遅延

症状

$ nslookup dbserver
# 応答遅い、または失敗

$ time ping -c 1 dbserver
# DNS 解決に時間かかる

解決

A. /etc/hosts に静的登録:

192.168.1.100  dbserver dbserver.example.com

B. tnsnames.ora で IP アドレス直接指定:

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
    (CONNECT_DATA = (SERVICE_NAME = ORCL))
  )

【原因⑦】サーバー CPU 100%

症状

# サーバーで
$ top
# CPU 100%、応答遅延

診断

-- 高負荷 SQL
SELECT sql_id, sql_text, executions, cpu_time/1000000 AS cpu_sec
FROM v$sql
ORDER BY cpu_time DESC
FETCH FIRST 10 ROWS ONLY;

解決

A. 高負荷 SQL の解消B. リソース増強C. 監視スクリプト設置

リソース関連は ORA-00020: maximum number of processes の記事、ORA-04031: unable to allocate shared memory の記事も参照してください。


【原因⑧】VPN 接続の問題

シナリオ

自宅からVPN経由でDB接続
VPNが不安定 → 接続タイムアウト

解決

A. VPN 再接続B. Split Tunneling で最適化C. タイムアウト大きめ設定


【原因⑨】Cloud Security Group

AWS の例

シナリオ:

オンプレのアプリ → AWS RDS Oracle
Security Group で 1521 が blocked

解決:

AWS Console → RDS → Security Groups → Inbound
Type: Custom TCP
Port: 1521
Source: <アプリの IP or CIDR>

Azure / GCP も同様。


【原因⑩】listener.log 肥大化

シナリオ(実際にある!)

listener.log が数 GB に肥大化
→ Listener の処理遅延
→ 接続タイムアウト

診断

$ ls -la $ORACLE_BASE/diag/tnslsnr/*/listener/trace/listener.log
# 数 GB になっていないか

解決

# Listener 停止
$ lsnrctl stop

# ログローテーション
$ mv listener.log listener.log.$(date +%Y%m%d)

# Listener 起動
$ lsnrctl start

# 自動ローテーション設定(19c+)
# ADR で自動管理

診断ツール完全リファレンス

tnsping

# TNS レベル確認
$ tnsping ORCL

# 詳細
$ tnsping ORCL 5   # 5 回試行

# 結果例
TNS-12170: TNS:Connect timeout occurred

telnet

# ポート開放確認
$ telnet dbserver 1521

# 成功時
Trying 192.168.1.100...
Connected to dbserver.
Escape character is '^]'.

# 失敗時(Firewall or Listener 停止)
# タイムアウト

nc (netcat)

# ポート開放確認(telnet より軽量)
$ nc -zv dbserver 1521

# 成功
Connection to dbserver 1521 port [tcp/*] succeeded!

# タイムアウト付き
$ nc -zv -w 5 dbserver 1521

lsnrctl status

# DB サーバーで
$ lsnrctl status

STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   Oracle Database 21c Enterprise Edition
Start Date                27-AUG-2026 10:00:00
Uptime                    0 days 6 hr. 12 min. 34 sec
Trace Level               off
Security                  ON: Local OS Authentication
Services Summary...
Service "ORCL" has 1 instance(s).

traceroute

# 経路確認
$ traceroute dbserver

# 遅延が大きいホップ特定

sqlnet.log

# クライアント側のログ
$ cat $ORACLE_HOME/network/log/sqlnet.log

listener.log

# サーバー側
$ tail -100 $ORACLE_BASE/diag/tnslsnr/*/listener/trace/listener.log

6つの解決策 完全リファレンス

解決策① Firewall 設定

Linux (firewalld):

$ sudo firewall-cmd --permanent --add-port=1521/tcp
$ sudo firewall-cmd --reload

Linux (iptables):

$ sudo iptables -A INPUT -p tcp --dport 1521 -j ACCEPT

AWS Security Group:

Type: Custom TCP, Port: 1521, Source: <IP>

解決策② SQLNET.INBOUND_CONNECT_TIMEOUT(サーバー側)

サーバーの sqlnet.ora:

SQLNET.INBOUND_CONNECT_TIMEOUT = 120
SQLNET.SEND_TIMEOUT = 60
SQLNET.RECV_TIMEOUT = 60

Listener reload:

$ lsnrctl reload

解決策③ SQLNET.OUTBOUND_CONNECT_TIMEOUT(クライアント側)

クライアントの sqlnet.ora:

SQLNET.OUTBOUND_CONNECT_TIMEOUT = 60
TCP.CONNECT_TIMEOUT = 60
SQLNET.RECV_TIMEOUT = 60

または tnsnames.ora:

ORCL =
  (DESCRIPTION =
    (CONNECT_TIMEOUT = 60)
    (TRANSPORT_CONNECT_TIMEOUT = 60)
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
    (CONNECT_DATA = (SERVICE_NAME = ORCL))
  )

解決策④ JDBC 設定(Java)

Properties props = new Properties();
props.setProperty("user", "scott");
props.setProperty("password", "tiger");

// 接続タイムアウト(ミリ秒)
props.setProperty("oracle.net.CONNECT_TIMEOUT", "60000");
props.setProperty("oracle.net.OUTBOUND_CONNECT_TIMEOUT", "60000");

// または DriverManager
DriverManager.setLoginTimeout(60);

Connection conn = DriverManager.getConnection(
    "jdbc:oracle:thin:@dbserver:1521:ORCL", props
);

解決策⑤ Python oracledb 設定

import oracledb

# tcp_connect_timeout(秒)
conn = oracledb.connect(
    user="scott",
    password="tiger",
    dsn="dbserver:1521/ORCL",
    tcp_connect_timeout=60
)

# 接続プール
pool = oracledb.create_pool(
    user="scott",
    password="tiger",
    dsn="dbserver:1521/ORCL",
    tcp_connect_timeout=60,
    min=1, max=10
)

解決策⑥ Listener 再起動

$ lsnrctl stop
$ lsnrctl start

# または reload(設定変更後)
$ lsnrctl reload

Rails / Java / Python 対応

Rails ActiveRecord

database.yml でタイムアウト:

production:
  adapter: oracle_enhanced
  host: dbserver
  port: 1521
  database: ORCL
  username: <%= ENV['DB_USER'] %>
  password: <%= ENV['DB_PASSWORD'] %>
  
  # タイムアウト設定
  timeout: 60000  # ミリ秒
  checkout_timeout: 30
  
  # 接続プール
  pool: 5

リトライロジック:

class OracleConnection
  MAX_RETRIES = 3
  
  def self.with_retry
    retries = 0
    begin
      yield
    rescue ActiveRecord::ConnectionTimeoutError => e
      if e.message.include?("ORA-12170") && retries < MAX_RETRIES
        retries += 1
        Rails.logger.warn "Connection timeout, retry #{retries}"
        sleep(2 ** retries)  # exponential backoff
        retry
      end
      raise
    end
  end
end

Rails 8 系の詳細は Rails 8 アップグレードガイドの記事も参照してください。

Java (JDBC)

Properties props = new Properties();
props.setProperty("user", "scott");
props.setProperty("password", "tiger");
props.setProperty("oracle.net.CONNECT_TIMEOUT", "60000");
props.setProperty("oracle.net.OUTBOUND_CONNECT_TIMEOUT", "60000");
props.setProperty("oracle.net.READ_TIMEOUT", "120000");

try {
    Connection conn = DriverManager.getConnection(
        "jdbc:oracle:thin:@dbserver:1521:ORCL", props
    );
} catch (SQLException e) {
    if (e.getErrorCode() == 12170) {
        logger.error("Connection timeout: " + e.getMessage());
        // リトライロジック
    }
}

Python (oracledb)

import oracledb
import time

def connect_with_retry(max_retries=3):
    for attempt in range(max_retries):
        try:
            return oracledb.connect(
                user="scott",
                password="tiger",
                dsn="dbserver:1521/ORCL",
                tcp_connect_timeout=60
            )
        except oracledb.DatabaseError as e:
            error_obj, = e.args
            if error_obj.code == 12170 and attempt < max_retries - 1:
                print(f"Timeout, retry {attempt + 1}")
                time.sleep(2 ** attempt)
                continue
            raise

実践シナリオ

シナリオ1:初回接続確認

# 1. TNS ping
$ tnsping ORCL

# 2. TCP ポート
$ nc -zv dbserver 1521

# 3. 実接続
$ sqlplus scott/tiger@ORCL

# 全てタイムアウトなら Firewall or ネットワーク問題

シナリオ2:Firewall 診断と対処

# サーバー側
$ sudo firewall-cmd --list-all
# public zone に 1521/tcp があるか

# 追加
$ sudo firewall-cmd --permanent --add-port=1521/tcp
$ sudo firewall-cmd --reload

# クライアントから確認
$ nc -zv dbserver 1521
Connection to dbserver 1521 port [tcp/*] succeeded!

シナリオ3:AWS RDS 接続時

# AWS Security Group で Port 1521 追加
# アプリの IP or CIDR を Source に

# 接続テスト
$ nc -zv myrds.abc123.us-east-1.rds.amazonaws.com 1521

# 成功なら
$ sqlplus admin/pw@myrds.abc123.us-east-1.rds.amazonaws.com:1521/ORCL

シナリオ4:Rails 本番デプロイ

# config/database.yml
production:
  adapter: oracle_enhanced
  host: <%= ENV['DB_HOST'] %>
  port: 1521
  database: <%= ENV['DB_SERVICE'] %>
  username: <%= ENV['DB_USER'] %>
  password: <%= ENV['DB_PASSWORD'] %>
  timeout: 60000
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

Rails 8 系の詳細は Rails 8 アップグレードガイドの記事、Kamal 2 デプロイの記事も参照してください。

シナリオ5:Java Spring Boot

# application.yml
spring:
  datasource:
    url: jdbc:oracle:thin:@dbserver:1521:ORCL
    username: ${DB_USER}
    password: ${DB_PASSWORD}
    hikari:
      connection-timeout: 60000
      maximum-pool-size: 10
      connection-init-sql: SELECT 1 FROM DUAL

シナリオ6:Python 監視スクリプト

import oracledb
import time

def health_check():
    try:
        start = time.time()
        conn = oracledb.connect(
            user="monitor",
            password=pw,
            dsn=dsn,
            tcp_connect_timeout=10
        )
        elapsed = time.time() - start
        conn.close()
        return {"status": "OK", "response_time": elapsed}
    except oracledb.DatabaseError as e:
        error_obj, = e.args
        if error_obj.code == 12170:
            return {"status": "TIMEOUT", "error": error_obj.message}
        return {"status": "ERROR", "error": error_obj.message}

if __name__ == "__main__":
    result = health_check()
    print(result)

シナリオ7:CI/CD 統合

- name: Wait for DB
  run: |
    for i in {1..30}; do
      if nc -zv -w 5 dbserver 1521; then
        echo "DB accessible"
        break
      fi
      echo "Waiting... ($i/30)"
      sleep 10
    done

シナリオ8:Docker Oracle 接続

# コンテナ内から確認
docker exec -it app-container bash

$ nc -zv oracle-db 1521
# 成功なら接続可能

Docker 関連は docker daemon 接続エラーの記事、Docker no space left on device の記事も参照してください。

シナリオ9:VPN 経由の接続

# VPN 接続後
$ nc -zv dbserver.internal 1521

# 遅い場合はタイムアウト拡張
# sqlnet.ora:
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 60
TCP.CONNECT_TIMEOUT = 60

シナリオ10:Autonomous DB (OCI)

Autonomous DB は Wallet 認証
- Instance Wallet ダウンロード
- Client 設定で Wallet 使用
- TCPS (SSL) で接続
- タイムアウトは短めに設定可能

トラブルシューティング

tnsping 成功、実接続失敗

認証問題 or サーバー内部問題sqlnet.log 確認。

telnet 成功、tnsping 失敗

tnsnames.ora の service name 確認、Listener の service 登録確認。

特定クライアントのみ失敗

そのクライアントの Firewall / ルーティング確認。

断続的な失敗

ネットワーク不安定 or Listener 過負荷、リトライロジック実装。

VPN 環境

タイムアウト拡張 + Split Tunneling 検討。

PostgreSQL からの移行

PG のデフォルトポートは 5432、Oracle は 1521。Firewall 設定注意。


よくある質問(FAQ)

Q1. ORA-12170 と ORA-12541 の違い

  • 12170: 接続タイムアウト(ネットワーク遅延)
  • 12541: Listener 未起動(即座失敗)

Q2. INBOUND vs OUTBOUND

  • INBOUND: サーバー側受信タイムアウト
  • OUTBOUND: クライアント側送信タイムアウト

Q3. デフォルトタイムアウト

60 秒(多くの環境)、10-30 秒の場合も。

Q4. Firewall ポート 1521

Oracle 標準ポート、変更可能。

Q5. Cloud Security Group

AWS/Azure/GCP で必須設定。

Q6. VPN 環境の推奨

タイムアウト大きめ、リトライロジック。

Q7. Rails での対応

timeout: 60000ms 設定、リトライ実装。

Q8. Java での対応

oracle.net.CONNECT_TIMEOUT 設定。

Q9. Python での対応

tcp_connect_timeout パラメータ。

Q10. Listener log 肥大化

定期的にローテーション、19c+ は ADR 自動管理。

Q11. Autonomous DB での挙動

Wallet 認証、TCPS 使用、タイムアウト短めに可能。

Q12. 予防策

  • 適切なタイムアウト設定
  • ネットワーク監視
  • Firewall ルール文書化
  • 接続プール使用
  • リトライロジック

参考リンク

Oracle 公式


まとめ

ORA-12170: TNS:Connect timeout occurred の要点を再整理します。

エラーの本質

指定時間内に TCP 接続 or Oracle ハンドシェイクが完了しない
→ Firewall / ネットワーク遅延 / Listener 過負荷 / タイムアウト設定
→ アプリケーション接続不能
→ 業務停止

エラーメッセージ(21c+)

ORA-12170: Cannot connect. <type> timeout of <sec>s for host <ip> port <port>.
              ↑            ↑         ↑            ↑        ↑
      cannot connect   タイムアウト種   秒       ホスト   ポート

<type>:
- TCP connect: TCP 接続失敗
- Outbound connect: クライアント全体
- Receive: サーバー応答遅延

接続系エラー 5 種

エラー意味
ORA-12541Listener 未起動
ORA-12154TNS 名前解決失敗
ORA-12514Service 未登録
ORA-12170接続タイムアウト
ORA-01017認証失敗

診断の 5 ステップ

# STEP 1: TNS ping
tnsping ORCL

# STEP 2: TCP ポート
nc -zv dbserver 1521

# STEP 3: DNS 解決
nslookup dbserver

# STEP 4: Listener 状態(サーバーで)
lsnrctl status

# STEP 5: listener.log 確認
tail -100 listener.log

10大原因

#原因対処
Firewall ブロックポート開放
ネットワーク遅延タイムアウト拡張
Listener 過負荷再起動
INBOUND_CONNECT_TIMEOUTサーバー側拡張
OUTBOUND_CONNECT_TIMEOUTクライアント側拡張
DNS 解決遅延hosts 静的登録
サーバー CPU 100%負荷解消
VPN 問題再接続
Cloud Security Groupルール追加
listener.log 肥大ローテーション

6つの解決策

# ① Firewall 設定
sudo firewall-cmd --permanent --add-port=1521/tcp
sudo firewall-cmd --reload
# ② サーバー sqlnet.ora
SQLNET.INBOUND_CONNECT_TIMEOUT = 120

# ③ クライアント sqlnet.ora
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 60
TCP.CONNECT_TIMEOUT = 60
// ④ JDBC
props.setProperty("oracle.net.CONNECT_TIMEOUT", "60000");
# ⑤ Python oracledb
conn = oracledb.connect(dsn=dsn, tcp_connect_timeout=60)
# ⑥ Listener 再起動
lsnrctl stop && lsnrctl start

診断コマンド Top 5

tnsping ORCL              # TNS レベル
nc -zv dbserver 1521      # TCP ポート
lsnrctl status            # Listener 状態
tail listener.log         # Listener ログ
traceroute dbserver       # 経路

予防のポイント

1. 適切なタイムアウト設定(server + client)
2. Firewall / Security Group 文書化
3. Listener 定期監視
4. ネットワークレイテンシ監視
5. リトライロジック実装(Rails/Java/Python)
6. 接続プール活用
7. listener.log ローテーション
8. DNS キャッシュ活用
9. VPN 環境ではタイムアウト大きめ
10. Cloud では Security Group 定期見直し

これらの知識は、Oracle DBA の本番運用・障害対応・ネットワーク設計・Rails / Java / Python アプリ運用・Cloud(AWS/Azure/GCP)・Autonomous DB 運用・監視設計・CI/CD パイプラインなど、あらゆる場面で活用できます。本記事をブックマークしておけば、ORA-12170 に出会っても冷静に的確に対処できるようになります。


本記事は2026年6月時点の情報をもとに、Oracle Database 19c〜26ai での動作確認・公式ドキュメントに基づき作成しています。Oracle のバージョンにより挙動が異なる場合があるため、最新の情報は Oracle 公式ドキュメント(docs.oracle.com)もあわせてご確認ください。