关于Oracle10g启动两个监听进程的故障报告
故障发生时数据库无法通过监听正常建立连接,检查时会发现系统上存在两个监听器进程,其中一个是另外一个的子进程。
示例:
local1:/ #ps -ef | grep 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
很多人在RAC环境下也遇到了类似的问题。
这个问题被最终确认为一个BUG,BUG号为:4518443
Oracle称在较大压力下,监听进程可能出现间歇性停止服务,此时Oracle会spaw出另外一个监听进程,进而导致两个监听进程互相影响的故障。
在非RAC环境下,可以通过在listener.ora中设置参数来暂时回避这个BUG。
SUBSCRIBE_FOR_NODE_DOWN_EVENT_=OFF
同时Oracle已经推出了相关Patch用来修正这个问题。
===================================================================================================================
Oracle 10201 版本的一个BUG : 4518443(转)2007年07月27日 星期五 19:48据ORACLE解释,在任何操作系统版本都有此问题。
现象:监听器启动后,隔一段时间(长短不定),就会出现无法连接:若是用10201版本的SQLPLUS,则会出现 NO LISTENER。
9207 版本的SQLPLUS,则会出现:没反应,HANG住。
原因:10201 版本上的一个BUG:4518443。其会自动创建一个子监听器,当出现此情况时,监听器将会挂起。
/opt/oracle/product/10g/network/log/listener.log有如下语句:
WARNING: Subscription for node down event still pending
检查是否真因为此BUG造成此现象:
[oracle@myocp ~]$ ps -ef|grep lsnr
oracle 22779 23373 0 11:22 ? 00:00:00 /oracle/product/10.2.0/db_1/bin/tnslsnr LISTENER -inherit
oracle 23373 1 1 10:09 ? 00:05:14 /oracle/product/10.2.0/db_1/bin/tnslsnr LISTENER -inherit
oracle 23684 23660 0 15:13 pts/1 00:00:00 lsnrctl status
oracle 23686 23660 0 15:14 pts/1 00:00:00 grep lsnr
正常情况只有一个监听器,而此BUG则会出现两个监听器。
解决方法:打补丁4518443 或者在listener.ora 文件里加入:(NO-RAC)
SUBSCRIBE_FOR_NODE_DOWN_EVENT_=OFF
其中,是数据库的监听器的名称。如:默认情况下,监听器名为:LISTENER 。则语句就是:
SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER=OFF
重启监听程序:
lsnrctl stop
lncrctl start
但有时候这种方法没有什么用即使加了SUBSCRIBE_FOR_NODE_DOWN_EVENT_=OFF。连续两天出现swap和load过高导致数据库无法提供服务,甚至OS都无法登陆。在ps后发现有两个监听进程,kill后系统恢复正常。按照Oracle的建议,删除了ONS的配置文件$ORACLE_HOME/opmn/conf/ons.config,暂时看起来正常了
按照metalink的说法,这个语句关闭了监听自动向ONS(Oracle Notification Services)注册,正是这个注册可能导致监听启动子进程。ONS是RAC中的一个组件,禁用该特性将导致RAC的FAN(Fast Application Notification)特性不可用。还好我这里两台都是单机,这么解决应该没什么问题。