1. 本际云推荐 - 专业推荐VPS、服务器,IDC点评首页
  2. 云主机运维
  3. VPS运维

案例分享:ORA-04021处理过程

案例分享:ORA-04021处理过程

您好,我是本际云服务器推荐网的小编小本本。最近我们遇到了一个问题,给客户授权访问一张表时,grant语句却hang住了,等了一段时间后该语句报ORA-04021,获取对象锁资源超时。

案例分享:ORA-04021处理过程

为了解决这个问题,我们进行了以下的分析。

问题分析

在grant语句等待期间,会话等待事件为“librarycachelock”,我们需要找出哪个会话锁住了该会话。Oracle提供了hanganalyze以及systemstate方式来收集信息,以便我们进行问题分析。

我们可以使用以下代码来收集HangAnalyzetrace和Systemstate:

HangAnalyze trace:

oradebug setmypid
oradebug unlimit
oradebug tracefile_name
oradebug hanganalyze 3
oradebug tracefile_name

Systemstate:

oradebug setmypid
oradebug unlimit
oradebug tracefile_name
oradebug dump systemstate 258
oradebug tracefile_name

另外一种方式是通过查询相关基表来分析,但是对于rac环境不是很适用:

1. 先查询saddr:

select sid,saddr
from v$session where event=librarycachelock;

2. 根据基表信息,通过等待事件会话的saddr,找到handle信息:

select kgllkhdl Handle, kgllkreq Request, kglnaobj Object
from x$kgllk
where kgllkses=&saddr and kgllkreq>0;

3. 找到阻塞的saddr:

select kgllk.sessaddr, kgllk.hdl handle, kgllk.mod mod, kglna.obj object
from x$kgllklock_a kgllk, x$kgllklock_b lock_b, x$kglcursor o, kgllock l, kgllockmode m, kgllockname n, kglobject kglna
where kgllk.mod >0
and kgllk.lock = lock_b.lock
and lock_b.kgllktype = 0
and l.kgllock = lock_b.lock
and m.kgllockmode = l.kglmode
and n.kgllockname = m.kgllockname
and o.kglnaown = n.kglnaown
and o.kglnaobj = n.kglnaobj
and kglna.obj# = o.kglnaobj
and kgllk.sess = &saddr
and lock_b.kgllkhdl != kgllk.hdl
and kgllk.req > 0;

4. 通过阻塞saddr找到相关会话信息:

select sid,username,terminal,program
from v$session where saddr=&saddr

解决方案

根据收集到的信息,找到阻塞会话,并确认后可将该会话清理掉。清理该会话后,grant语句正常执行,问题得到解决。

以上就是我们的处理过程,希望对您有所帮助。

原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6538.html