环境: 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。