Oracle

Oracle 偵聽器沒有重新啟動,因為停止後埠 1521 釋放的速度不夠快

  • September 24, 2020

我在 Windows 2012R2 伺服器上執行 Oracle 11g。出於某種原因,我們有一些程式碼嘗試重新啟動偵聽器然後執行連接。此程式碼已在許多不同的伺服器上執行多年,但在一個特定的伺服器上,偵聽器無法重新啟動。

以下是偵聽器嘗試重新啟動時在 listener.log 文件中發現的錯誤:

Started with pid=5132
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROCipc)))
Error listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=thehostname)(PORT=1521)))
TNS-12542: TNS:address already in use
TNS-12560: TNS:protocol adapter error
 TNS-00512: Address already in use
  64-bit Windows Error: 48: Unknown error
No longer listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROCipc)))

我已經設法使用此命令重現該問題:

net stop OracleOraDb11g_home1TNSListener && net start OracleOraDb11g_home1TNSListener

如果我像這樣修改命令行:

net stop OracleOraDb11g_home1TNSListener && sleep 30 && net start OracleOraDb11g_home1TNSListener

偵聽器正確重新啟動。

我想埠 1521 停止後釋放的速度不夠快,但我不知道如何修復它。

這裡的資訊是 listener.ora 文件的內容:

SID_LIST_LISTENER =
 (SID_LIST =
   (SID_DESC =
     (SID_NAME = PLSExtProc)
     (ORACLE_HOME = C:\somepath\database\product\11.2.0\dbhome_1)
     (PROGRAM = extproc)
   )
   (SID_DESC =
     (GLOBAL_DBNAME = somevalue)
     (SID_NAME = somevalue)
   )
 )

LISTENER =
 (DESCRIPTION_LIST =
   (DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
     )
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = thehostname)(PORT = 1521))
     )
   )
 )

LOGGING_LISTENER=on
VALID_NODE_CHECKING_REGISTRATION_LISTENER=on

這是按設計工作™。

TCP 套接字生命週期由數據庫程序外部的 TCP 堆棧非同步管理,並且在狀態之間轉換時涉及各種延遲。完全可以想像,在一台快速機器上,監聽器將在幾毫秒內終止並重新啟動,這比完全釋放套接字要快。

由於您無法控制 TCP 堆棧邏輯,因此在我看來,您唯一的替代解決方案是在啟動偵聽器之前引入一點延遲(正如您已經做過的那樣)。您可能不需要完整的 30 秒;嘗試更小的值。

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