🔎【Oracle 連線斷線解決方案】SQLNET.EXPIRE_TIME 設定教學與 TCP Idle Timeout 問題排查
前言
在企業內部使用 Oracle 資料庫時,開發人員或 DBA 常常會遇到一個困擾的問題:
「查詢沒跑完就斷線」或「閒置一段時間後連線自動中斷」。
這種情況通常與 TCP Idle Timeout 有關,而在 Oracle 環境中,我們可以透過設定 SQLNET.EXPIRE_TIME 來有效避免。本文將用簡單易懂的方式,教你如何檢查與設定這個參數,並確保修改生效。
1. 問題來源:TCP Idle Timeout 是什麼?
當 Oracle 與 Client(例如 SQL Developer、應用程式)建立連線後,如果長時間沒有任何資料交換,防火牆或 NAT 裝置可能會自動切斷閒置的連線,這就是 TCP Idle Timeout 的機制。
舉例來說,如果防火牆閒置逾時時間是 60 秒,而你的 SQL 查詢需要 5 分鐘才跑完,中途沒有資料流動,就可能被強制斷線。
2. 解決方法:設定 SQLNET.EXPIRE_TIME
Oracle 提供 SQLNET.EXPIRE_TIME 參數,讓資料庫定期送出一個訊號(KeepAlive)給 Client,即使沒有資料傳輸,也能維持連線狀態。
步驟 1:找到正確的
sqlnet.ora
檔案
請注意,Oracle 安裝目錄中有兩個
sqlnet.ora
:
-
SAMPLE\sqlnet.ora
(範例檔案,系統不會讀取) -
NETWORK\ADMIN\sqlnet.ora
(真正會被 Oracle 使用) ✅
範例路徑:
C:\app\oracleadm\product\12.1.0\dbhome_1\NETWORK\ADMIN\sqlnet.ora
步驟 2:編輯
sqlnet.ora
使用 Notepad++ 或任何文字編輯器打開正確的
sqlnet.ora
檔案,新增以下設定:
SQLNET.EXPIRE_TIME = 10
說明:
-
單位為分鐘
-
建議值為
10
(代表每 10 分鐘送一次 KeepAlive 訊號) -
可依公司防火牆 TCP Idle Timeout 時間調整,例如 300 秒可設為 5 分鐘
步驟 3:重新啟動 Oracle Listener
修改完成後,必須重啟 Listener 才會生效。
在命令提示字元(CMD)輸入:
lsnrctl stop lsnrctl start
步驟 4:驗證設定是否生效
打開 SQL Developer 或 SQL*Plus,執行:
SHOW PARAMETER SQLNET.EXPIRE_TIME;
如果顯示
10
,代表設定已生效;如果為空值,代表你可能改到 SAMPLE 資料夾的檔案,需要回到
NETWORK\ADMIN
路徑重新修改。
3. 額外建議:防火牆與 NAT 設定
即使 Oracle 側設定正確,如果網路層 TCP Idle Timeout 太短,依然可能被斷線。建議找網路管理員調整:
-
TCP Idle Timeout:至少設 300 秒(5 分鐘)以上
-
NAT Session Timeout:與 TCP Idle Timeout 一致或更高
-
Application Inspection / IDS:排除 Oracle 流量監控
4. 總結
-
SQLNET.EXPIRE_TIME
是 Oracle 提供的 KeepAlive 機制,可以有效避免因閒置導致的斷線 -
必須修改 真正生效的
NETWORK\ADMIN\sqlnet.ora
,而不是 SAMPLE 範例檔 -
修改後要 重新啟動 Listener 才會生效
-
也要檢查防火牆或 NAT Timeout 設定,確保網路層不會中途切斷連線
💡 如果你是 DBA 或軟體工程師,建議將這個設定納入資料庫部署標準流程,避免應用系統長查詢時被中斷。
留言
張貼留言