系统环境
RHEL5u4,Oracle11GR2
故障现象
某用户登陆后一直hang住,不报错,其他用户无此问题
具体情况
接到反馈说,某个页面不能打开,检查了页面日志之后,发现该页面对应的某用户无法登陆数据库,于是用sqlplus连接数据库,发现hang在那里
解决过程
检查等待事件,发现是library cache lock
并且除了我们的登陆进程,还有一大堆已经登陆的进程被阻塞在library cachelock
做了一个statspck(没装em),发现异常
ime Model System Stats DB/Inst: xxxxx/xxxxx Snaps: 1-2
-> Ordered by % of DB time desc, Statistic name
Statistic Time (s) % DB time
----------------------------------- -------------------- ---------
connection management call elapsed 384,100.8 100.0
DB CPU 30.1 .0
sql execute elapsed time 16.7 .0
PL/SQL execution elapsed time 4.5 .0
parse time elapsed 1.2 .0
Avg %Total
%Tim Total Wait wait Waits Call
Event Waits out Time (s) (ms) /txn Time
---------------------------- ------------ ---- ---------- ------ -------- ------
library cache lock 250 0 384,116 ###### 0.0 99.9
library cache: mutex X 19,736 0 162 8 3.3 .0
log file sync 518 0 11 21 0.1 .0
db file sequential read 44 0 1 32 0.0 .0
write complete waits 47 0 1 16 0.0 .0
和之前的现象一样,大量library cache lock导致登陆hang住,时间全部消耗在了 connection management call elapsed
看看下面的top sql 没发现特别的发现。
通过查询x$kgllk等相关表,发现持有锁的对象名是1488, 查了查dba_object表,没找到这个名字开头的对象, 进程也是来自一个weblogic 的模块,没什么特别的, 所以一时没了头绪。
后来查了下metalink, 发现一篇文章 LIBRARY CACHE LOCKS DUE TO INVALID LOGINATTEMPTS [ID 1309738.1].
这个是Oracle的一个bug, 用户多次尝试登陆失败会产生library cache lock, 这个很好的解释了我的问题
下面的问题就简单了,找到产生library cache lock的源头(可以参照文档How to Find whichSession is Holding a Particular Library Cache Lock [ID 122793.1] )
来源于weblogic的某个模块, 检查了该模块对应管理服务器的日志,果然发现了某个数据源多次连接失败的记录。
打开该数据源的配置,发现对应的帐户果然是存在问题的那个帐户。
询问了下管理员,他们是昨天晚上修改了DB帐户的密码,同时也修改了weblogic中数据源的密码,但是在设置密码的时候出现了错误,导致不正确的密码被保存进了中间件的数据源。
找到问题以后,解决就简单了,重新配置下这个数据源的密码,然后重启相关的管理服务器。之后又检查了下,一切都正常了