資料庫無法通過監聽建立連線,檢查作業系統進程發現存在兩個 tnslsnr 進程,其中一個是另一個的子進程。典型輸出如下:
oracle 925826 1 0 Apr 06 - 234:50 /u01/app/oracle/product/102/bin/tnslsnr listener1 -inherit oracle 1081540 925826 0 21:39:39 - 0:00 /u01/app/oracle/product/102/bin/tnslsnr listener1 -inherit
此問題被確認為 Oracle Bug 4518443。在高負載下,監聽進程可能間歇性停止服務,Oracle 會嘗試重新生成一個監聽進程,導致父子兩個監聽進程同時存在並相互干擾,最終造成連線失敗。RAC 環境下也常見此問題。
在 listener.ora 中添加參數:
SUBSCRIBE_FOR_NODE_DOWN_EVENT_=OFF
可暫時抑制監聽器自動重生機制,避免雙進程衝突。
應用 Oracle 針對 Bug 4518443 發布的修補程式(Patch),徹底解決監聽器在壓力下異常重生的缺陷。