发现问题:从10.23号开始,生产数据库CPU消耗异常,DB Time是平常的两倍多,我看了这几天的AWR报告,有一个等待事件cursor: pin S wait on一直独占鳌头。
定位问题:根据下列sql可以找到对应的业务系统执行的语句,然后根据执行语句到代码中找到那个功能。我定位到时的是一个定时功能,每个星期天凌晨5:00执行,更新TERMINAL_LOWER_USER_BASE(有两百五十万的数据)的内容,看代码是用的循环update commit,虽然这种方式不够优化,但也不至于有这么大的消耗。于是决定再观察两天,奇怪的是v$session,v$session_wait中一直看到这个等待事件,DB time也一致没有下降。
select b.*, sq.sql_text
from v$session se,
v$sql sq,
(select a.*, s.sql_text
from v$sql s,
(select sid,
event,
wait_class,
p1,
p2raw,
to_number(substr(p2raw, 1, 4), 'xxxx') sid_hold_mutex_x
from v$session_wait
where event like 'cursor%') a
where s.HASH_VALUE = a.p1) b
where se.sid = b.sid
and se.sql_hash_value = sq.hash_value;
解决问题:根据sqlId到v$sql中查到一个执行1053175s,另一个为448356s,经判断确认是僵死的进程,kill掉就好了。
总结:这个问题耗时3天才解决,其实半天就可以,可惜自己的经验欠缺,如果找点查到v$sql的执行时间,问题应该早就解决了。