早上几个同事都风风火火的要求我赶快解决一个数据库无法连接的问题。
        当时一个同事甚至告诉我那个数据库“挂了”,有没有搞错,数据库那么容易就DOWN了吗?
        赶快上去看了一眼,实例运行正常,但是监听好像有些问题。很奇怪,用lsnrctl status命令后,没有返回任何信息同样也不退出,好像僵死一样。先解决问题再说吧,KILL掉一个监听进程后,再次启动监听,但是提示“监听已经启动”,怪。但是问题却得到了解决,可以正常连接了。
        ......
        还要看看问题所在呀,检查监听日志,没有什么特别的信息,但有两点,一个是在某个时段内就是没有任何连接到数据库的会话(没有任何日志信息,这在线上数据库中是不可能的),一个是有一条WARNING信息:
        WARNING: Subscription for node down event still pending
         通过查阅发现,原来这是个监听的BUG!
         产生原因:
       
Intermittently, an additional listener process is created by Oracle causing the LISTENER to refuse connections to the database.
unpublished bug number 4518443 in 10.2.0.2 (and no doubt previous versions), fixed in 10.2.0.3.
        
       如果没有升级到10.2.0.3以后的版本也没有关系,有两个解决办法:
 
1) Rename the Oracle10g ons.config file so the listener does not find or use it.

                cd $ORACLE_HOME/opmn/conf
                mv ons.config ons.config.orig
                (then restart the listener)

        2) Explicitly disable the 10g TNS Listener from subscribing to the ONS.

                Edit the active 10g listener.ora file and add the parameter below:

                SUBSCRIBE_FOR_NODE_DOWN_EVENT_<listener_name>=OFF

                where <listener_name> would be replaced with the actual listener name configured in the listener.ora file.

                For example, if the listener name is LISTENER (default), the parameter would be:

                SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER=OFF

                (then restart the listener)

        有时很多人都是到ORACLE网站下载一个新的产品,然后就安装使用(如果只是测试或者学习真的没有问题),觉得也很好,或者购买服务到期后就不愿意继续购买ORACLE的服务,其实对于一个商用数据库的运行而言,后续的服务是非常重要的。
        BTW:
        我在处理问题的时候当时粗心了一下,因该是可以检查到又两个监听进程存在的。只是当时我运气比较好直接kill掉了那个有问题的监听进程,所以才会出现我杀掉监听进程后,再重新启动却提示监听已启动了。-:)