Oracle

Oracle 客戶端會話不斷斷開連接

  • June 26, 2019

我們最近將 Oracle 伺服器從遠端位置移動到本地伺服器,現在 Oracle 客戶端不斷斷開連接。

這似乎不是超時問題,因為它發生在我們積極使用它時。我們正在使用 Oracle SQL Developer、PL/SQL Developer 和 Toad。我們在 VM 上執行 Oracle 12 Enterprise。

我們沒有看到任何錯誤 - 我們的會話只是下降。我們的伺服器在 Redhat 7 上的虛擬機上執行。我們在 Windows 上執行客戶端。通常,當我們執行查詢時,我們必須等待它重新初始化,然後再執行查詢。因此我們假設因為它必須重新初始化我們的會話被丟棄。

當我們編寫查詢時,客戶端(Toad、PL/SQL Developer 等)必須重新連接才能執行查詢。如果我們離開,我會理解,但我們正在積極編寫查詢並執行它們,然後客戶端斷開連接並且必須重新連接才能執行。

我們如何解決或調試這個問題?

檢查是否sqlnet_expire_time在託管數據庫的機器上的任何 sqlnet.ora 文件中設置,使用一些變體

find / -name sqlnet.ora -exec grep -i sqlnet_expire_time {} \;

如果其中任何一個都沒有設置,那麼您可以快速排除死連接檢測。如果已設置,則說明您啟用了 DCD,這很可能會破壞您的連接。

您正在使用三個應用程序 - 我敢打賭,您在其中一個應用程序中的時間超過 DCD 時間,因此其他應用程序的連接被終止,然後當您切換到另一個應用程序時,您發現它的連接已經消失。這是因為他們每個人都有自己的連接,無論連接 A 有多忙 - 如果連接 B 在 DCD 時間內空閒,它將被殺死。

如果 DCD 被排除,那麼下一個要檢查的地方將是防火牆。這需要 SQL*Net 感知;不僅需要打開埠 1521(或您配置的任何埠),而且防火牆需要檢查 comms 以獲取伺服器返回給客戶端的隨機埠號並打開它 - 如果它不這樣做然后防火牆將終止“未經授權/未知”的連結,從而中斷連接。

“死連接檢測”(DCD)這個名稱是不言自明的。

DCD 不會終止工作連接,即使它們處於空閒狀態。

當 Oracle 不再響應時,DCD 會從它們中刪除會話。

這在 jmk 的答案中引用的論文以及 oracle 文件中都有記錄。

引用自:https://dba.stackexchange.com/questions/206164