Oracle
Oracle 偵聽器沒有重新啟動,因為停止後埠 1521 釋放的速度不夠快
我在 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 秒;嘗試更小的值。