Oracle数据库运维过程中有时会遇到一种异常情况,由于错误的操作或代码BUG造成session异常地持有锁不释放,并大量阻塞系统对话。这时候需要找出造成异常阻塞的session并清除。oracle session通常具有三个特征:(1)一个session可能阻塞多个session;(2)一个session最多被一个session阻塞;(3)session阻塞关系不会形成环路。(环路即死锁,oracle能自动解除)因此session的阻塞关系为一棵树,进而DB系统所有session的BLOCK阻塞关系是一个由若干session阻塞关系树构成的森林,而异常session一定会在故障爆发时成为根(root)。因此,找寻异常锁表session的过程就是找出异常的root。一般认为异常root有两个特征:(1)block树的规模过大,阻塞树规模即被root层层阻塞的session总数;(2)阻塞的平均等待时间过长。查找异常session的方法一:OEM—> performance—> Blocking Sessions查找异常session的方法二:select r.root_sid, s.serial#,r.blocked_num, r.avg_wait_seconds,s.username,s.status,s.event,s.MACHINE,s.PROGRAM,s.sql_id,s.prev_sql_idfrom (select root_sid, avg(seconds_in_wait) as avg_wait_seconds,count(*) - 1 as blocked_numfrom (select CONNECT_BY_ROOT sid as root_sid, seconds_in_waitfrom v$sessionstart with blocking_session is nullconnect by prior sid = blocking_session)group by root_sidhaving count(*) > 1) r,v$session swhere r.root_sid = s.sidorder by r.blocked_num desc, r.avg_wait_seconds desc;该SQL语句即是根据v$session的字段blocking_session统计阻塞树根阻塞session的计数以及平均阻塞时间、并进行排序,排名最前的往往是异常session。另外需要注意的是,持有锁时间最长、或等待时间最长的session都不一定是造成阻塞的根源session!
温馨提示:答案为网友推荐,仅供参考