【完全ガイド】ORA-12170: TNS:Connect timeout occurred の原因と解決方法|Firewall・タイムアウト・JDBC/Python 徹底解説
- 作成日 2026.08.28
- Oracle Database その他
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
- 1. 結論:Firewall/タイムアウト設定確認
- 2. Oracle 接続の仕組み
- 3. 【原因①】Firewall ブロック(最頻出)
- 4. 【原因②】ネットワーク遅延(VPN/WAN)
- 5. 【原因③】Listener 過負荷
- 6. 【原因④】SQLNET.INBOUND_CONNECT_TIMEOUT
- 7. 【原因⑤】SQLNET.OUTBOUND_CONNECT_TIMEOUT
- 8. 【原因⑥】DNS 解決の遅延
- 9. 【原因⑦】サーバー CPU 100%
- 10. 【原因⑧】VPN 接続の問題
- 11. 【原因⑨】Cloud Security Group
- 12. 【原因⑩】listener.log 肥大化
- 13. 診断ツール完全リファレンス
- 14. 6つの解決策 完全リファレンス
- 15. Rails / Java / Python 対応
- 16. 実践シナリオ
- 17. トラブルシューティング
- 18. よくある質問(FAQ)
- 19. 参考リンク
- 20. まとめ
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)の理解
tnspingvstelnetvsncによる段階的診断SQLNET.INBOUND_CONNECT_TIMEOUTvsOUTBOUND_CONNECT_TIMEOUTTCP.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-12541 | Listener 未起動 |
| ORA-12154 | TNS 名前解決失敗 |
| ORA-12514 | Service 未登録 |
| 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_TIMEOUTSQLNET.SEND_TIMEOUTSQLNET.RECV_TIMEOUT
クライアント側 (sqlnet.ora on client):
SQLNET.OUTBOUND_CONNECT_TIMEOUTTCP.CONNECT_TIMEOUTSQLNET.RECV_TIMEOUT
接続文字列 (Easy Connect / tnsnames.ora):
CONNECT_TIMEOUTTRANSPORT_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 公式
- Oracle Database Error Messages: ORA-12170
- Oracle Net Services Administrator’s Guide: ORA-12170
- Oracle Net Services Reference: SQLNET.OUTBOUND_CONNECT_TIMEOUT
- Oracle JDBC Developer’s Guide: Connection Properties
まとめ
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-12541 | Listener 未起動 |
| ORA-12154 | TNS 名前解決失敗 |
| ORA-12514 | Service 未登録 |
| 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)もあわせてご確認ください。
-
前の記事
【完全ガイド】ORA-00376: file X cannot be read at this time の原因と解決方法|データファイル OFFLINE・MEDIA RECOVERY 徹底解説 2026.08.27
-
次の記事
【完全ガイド】ORA-12514: TNS:listener does not currently know of service の原因と解決方法|SERVICE_NAME・CDB/PDB・LOCAL_LISTENER 徹底解説 2026.08.30
コメントを書く