关于Oracle10.2.0自行启动两个监听进程导致服务中断问题

环境:

AIX6.1

Oracle Database 10g Enterprise EditionRelease 10.2.0.1.0 - 64bi

Tomat 5.0.28

Oracle的安装文件是10gr2_aix5l64_database.cpio.gz

 

问题描述:

服务运行大约一周后,Oracle不能连接、网站、业务系统中断服务。tomcat没有问题,但是Oracle监听不能正常服务,勇pl/sql连接长时间无反应,用proxool的监控servlet看一下发现是可用连接池可用连接数为0。初步确定是数据库出现了问题。

 

排查问题:

1、用sqlplus/nolog、conn /as sysdba、select cos(1) from dual 后可以正常查询数据库内容,确定数据库本身没有问题,问题可能在监听上;

2、执行lsnrctlstatus,

Java代码  

1.  $ lsnrctl stop  

2.    

3.  LSNRCTL for IBM/AIX RISC System/6000: Version 10.2.0.1.0 - Production on 01-SEP-                                                                                        2010 14:46:33  

4.    

5.  Copyright (c) 1991, 2005, Oracle.  All rights reserved.  

6.    

7.  Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=KJPTSERVER1)(PORT=1521)) )  

8.    

9.  ......  

长时间没有反应,确定问题在监听上;

3、执行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   004:50:31      -  0:00/oracle/database/product/10.2.0/bin/tnslsnr LISTENER -inherit 
 oracle 1077302  831654   0 14:50:11  pts/1  0:00grep tnsl


发现两个lsnrctl进程(前两个),从激活时间看,第一个监听是正常的、最初启动Oracle时创建的,第二个监听是第一个的派生、是不正常的。

4、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

详见metalink。340091.1,主要摘录如下:

写道

Bug 4518443 is fixed in10.2.0.3

- OR -

Apply Patch 4518443 for the problem (if a patch is available)

- OR -

As a workaround, the following parameter can be added to listener.ora
SUBSCRIBE_FOR_NODE_DOWN_EVENT_<listener_name>=OFF
Where <listener_name> should be replaced with the actual listener nameconfigured in the LISTENER.ORA file.

For example, if the listener name is LISTENER (default), the parameter wouldbe:
SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER=OFF

This will prevent the listener from registering against ONS (OracleNotification Services), which is the area affected by bug:4518443. For moreinformation on ONS, please refer to eg. the Oracle10g Release 2 documentation("Oracle Clusterware and Oracle Real Application Clusters Administrationand Deployment Guide").

Please note, adding SUBSCRIBE_FOR_NODE_DOWN_EVENT_<listener_name> tolistener.ora file on RAC, will mean that FAN (fast application notification)will not be possible. See Note 220970.1 RAC: Frequently Asked Questions forfurther information on FAN

 

解决方案: 
1、在非RAC环境 下,可以通过在listener.ora中设置参数:
SUBSCRIBE_FOR_NODE_DOWN_EVENT_<listener_name>=OFF
来暂时回避这个BUG。

具体操作: 在listener.ora 文件里加入(我加在了最后):(NO-RAC)
SUBSCRIBE_FOR_NODE_DOWN_EVENT_<listener_name>=OFF
其中,<listener_name> 是数据库的监听器的名称。如:默认情况下,监听器名为:LISTENER 。则语句就是:
SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER =OFF 
重启监听程序:
lsnrctl stop

lncrctl start

 

按照metalink的说法,这个语句关闭了监听自动向ONS(OracleNotification Services)注册,正是这个注册可能导致监听启动子进程。ONS是RAC中的一个组件,禁用该特性将导致RAC的FAN(Fast Application Notification)特性不可用。

如果是RAC则必须打补丁。

我采用的是这个方式。

 

补充一下:有网友反映,

“有时候加上这句话无效,连续两天出现swap和load过高仍导致数据库无法提供服务,甚至OS都无法登陆。kill掉子进程后系统恢复正常。按照Oracle的建议,删除了ONS的配置文件$ORACLE_HOME/opmn/conf /ons.config,暂时看起来正常了。 ”

我没有遇到,先不做评论,到时候再说吧。

 

2、

在$ORACLE_HOME/opmn/conf目录下将ons.config文件移除

mv $ORACLE_HOME/opmn/conf/ons.config  $ORACLE_HOME/opmn/conf/ons.config.bak


3、打补丁

Oracle已经推出了相关Patch用来修正这个问题,可以在metalink上下载相关补丁并使用

/oracle/database/product/10.2.0/OPatch/opatchapply 安装即可。遗憾的是需要oracle服务帐号,我这里的没有购买oracle又没找到“免费”的,所以没有试验。

 

我在windows[10.2.0.1.0]、linux[10.2.0.1.0]下安装的都没有问题,只有aix下会出现这样的问题,怀疑只有oracle10.0.2.0.1的aix发行版本才有这个bug。

你可能感兴趣的:(关于Oracle10.2.0自行启动两个监听进程导致服务中断问题)