環境: php
AIX6.1java
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64binode
Tomat 5.0.28linux
Oracle的安裝文件是 10gr2_aix5l64_database.cpio.gzsql
問題描述: 數據庫
服務運行大約一週後,Oracle不能鏈接、網站、業務系統中斷服務。tomcat沒有問題,可是Oracle監聽不能正常服務,勇pl/sql鏈接長時間無反應,用proxool的監控servlet看一下發現是可用鏈接池可用鏈接數爲0。初步肯定是數據庫出現了問題。windows
排查問題: tomcat
一、用sqlplus/nolog、conn /as sysdba、select cos(1) from dual 後能夠正常查詢數據庫內容,肯定數據庫自己沒有問題,問題可能在監聽上;oracle
二、執行lsnrctl status,app
$ lsnrctl stop LSNRCTL for IBM/AIX RISC System/6000: Version 10.2.0.1.0 - Production on 01-SEP- 2010 14:46:33 Copyright (c) 1991, 2005, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=KJPTSERVER1)(PORT=1521)) ) ......
長時間沒有反應,肯定問題在監聽上;
三、執行ps -ef|grep tnslsnr,
結果以下
$ ps -ef|grep tnsl
oracle 422142 1 0 Aug 25 - 9:44 /oracle/database/product/10.2.0/bin/tnslsnr LISTENER -inherit
oracle 1024058 422142 0 04:50:31 - 0:00 /oracle/database/product/10.2.0/bin/tnslsnr LISTENER -inherit
oracle 1077302 831654 0 14:50:11 pts/1 0:00 grep tnsl
發現兩個lsnrctl進程(前兩個),從激活時間看,第一個監聽是正常的、最初啓動Oracle時建立的,第二個監聽是第一個的派生、是不正常的。
四、kill第二個可疑監聽進程
kill -9 1024058
一切恢復正常。
緣由解讀:
在Metalink上能夠找到相關問題的不少解釋,這個問題被最終確認爲Oracle10201一個BUG,BUG號爲:4518443,其會自動建立一個子監聽器,當出現此狀況時,監聽器將會掛起。
Oracle稱在較大壓力下,監聽進程可能出現間歇性中止服務,此時Oracle會spaw出另一個監聽進程,進而致使兩個監聽進程互相影響的故障。
檢查監聽日誌文件 /oracle/database/product/10.2.0/network/log/listener.log 有以下語句:
WARNING: Subscription for node down event still pending
解決方案:
一、在非RAC環境 下,能夠經過在listener.ora中設置參數:
SUBSCRIBE_FOR_NODE_DOWN_EVENT_=OFF
來暫時迴避這個BUG。
具體操做: 在listener.ora 文件里加入(我加在了最後):(NO-RAC)
SUBSCRIBE_FOR_NODE_DOWN_EVENT_=OFF
其中, 是數據庫的監聽器的名稱。如:默認狀況下,監聽器名爲:LISTENER 。則語句就是:
SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER =OFF
重啓監聽程序:
lsnrctl stop
lncrctl start
按照 metalink的說法,這個語句關閉了監聽自動向ONS(Oracle Notification Services)註冊,正是這個註冊可能致使監聽啓動子進程。ONS是RAC中的一個組件,禁用該特性將致使RAC的FAN(Fast Application Notification)特性不可用。
若是是RAC則必須打補丁。
補充一下:有網友反映,
「有時候加上這句話無效,連續兩天出現swap和load太高仍致使數據庫沒法提供服務,甚至OS都沒法登錄。kill掉子進程後系統恢復正常。按照Oracle的建議,刪除了ONS的配置文件$ORACLE_HOME/opmn/conf /ons.config,暫時看起來正常了。 」
我沒有遇到,先不作評論,到時候再說吧。
二、Oracle已經推出了相關Patch用來修正這個問題,能夠在metalink上下載相關補丁並使用
/oracle/database/product/10.2.0/OPatch/opatch apply 安裝便可。遺憾的是須要oracle服務賬號,我這裏的沒有購買oracle又沒找到「免費」的,因此沒有試驗。
若是哪位有10.2.0的4518443補丁文件麻煩留言或者發給我freemail1001@163.com,windows、aix、linux下的均可以。
我在windows[10.2.0.1.0]、linux[10.2.0.1.0]下安裝的都沒有問題,只有aix下會出現這樣的問題,懷疑只有oracle10.0.2.0.1的aix發行版本纔有這個bug。