Oracle10gLsnrctl沒有反映無法連接數據庫
現象描述:使用的 oracle 版本為linux版10.2.0.1.0,在命令行界面輸入lsnrctl status後即沒有反應,同時輸入lsnrctl stop也沒有任何反應。已經連接數據庫的應用正常運行,但是新的應用無法連接數據庫。在oracle數據庫服務器使用sqlplus正常,但是在客戶端使用PL/SQL以及Navicat均無法連接數據庫服務端。
問題診斷:oracle監聽宕了
經上網查詢資料,發現這是由於oracle 10.2.0.1.0中一個編號為4518443的bug導致的,這個bug會自動創建一個子監聽器,當出現這種情況時,監聽就會掛起。而且次BUG在任何操作系統中均存在。
解決方式:
1、查看LISTNER進程(兩條語句均可以)
$ ps aux |grep LISTENER
$ ps aux |grep tnslsnr
正常情況只有一個LISTENER進程,而此BUG則會出現兩個LISTENER進程,因此需要關閉一個進程。
2、kill LISTENER進程(兩個進程均需要kill)
$ kill -9 26184
3、重啟LISTENER
$ lsnrctl stop
$ lsnrctl start
4、再次查看LISTNER進程
$ ps aux |grep LISTENER
oracle 9635 10.8 0.0 204508 9512 ? Rsl Sep18 620:18 $ORACLE_HOME/bin/tnslsnr LISTENER -inherit
這個時候就會發現只存在一條LISTENER進程
到這裡為止只是保證了LISTENER可以正常使用,如果不再進一步處理,則過一段時間還是會出現相同的問題。因此我們需要徹底的解決此問題
5、徹底解決
5.1:升級解決
將oracle版本升級到oracle 10.2.0.3以後的版本既可以。
Ps:在線升級線上生產數據庫是存在極大的風險的,一旦升級失敗將導致線上應用全部無法訪問,因此在線上使用的生產數據庫不建議使用此方法來解決這個問題,除非是升級完畢後才投入到線上使用。
5.2:修改listener.ora文件
在listener.ora文件中加上如下參數,SUBSCRIBE_FOR_NODE_DOWN_EVENT_<listener_name>=OFF ##這裡的listener_name是配置的listener的名字,如果是默認的就是LISTENER。具體修改如下
$ vi $ORACLE_HOME/network/admin/listener.ora
SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER=OFF
#可以添加在最後一行
然後再重啟LISTENER
$ lsnrctl stop
$ lsnrctl start
注:如果僅僅是修改這一個BUG,建議大家使用修改listener.ora文件這個方式,同時也提醒大家在ORACLE正式投入線上使用之前先升級ORACLE。