暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

IT那活儿 2022-11-03
1781

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!


问题现象

在给客户授权访问一张表时,grant语句却hang住了,等了一段时间后该语句报ORA-04021,获取对象锁资源超时。如下图:


问题分析

在grant语句等待期间,会话等待事件为“library cache lock”,那么接下来就需要分析该会话是被哪个会话给锁住了。
2.1 Oracle提供了hanganalyze以及systemstate方式来收集信息,可以辅助来分析问题
代码如下:
1) 收集HangAnalyze trace
sqlplus  as sysdba
SQL> oradebug setmypid
SQL> oradebug unlimit
SQL> oradebug tracefile_name
SQL> oradebug hanganalyze 3
SQL> oradebug tracefile_name

2) 收集Systemstate dump
sqlplus / as sysdba
SQL> oradebug setmypid
SQL> oradebug unlimit
SQL> oradebug tracefile_name
SQL> oradebug dump systemstate 258
SQL> oradebug tracefile_name

2.2 还一种方式就是查询相关基表来分析(rac环境不是很适用)
1) 先查询saddr
select sid,saddr from v$session where event= 'library cache lock';
2) 根据基表信息,通过等待事件会话的saddr,找到handle信息
select kgllkhdl Handle,kgllkreq Request, kglnaobj Object
from x$kgllk where kgllkses = '&saddr'
and kgllkreq > 0;

3) 找到阻塞的saddr
select kgllkses saddr,kgllkhdl handle,kgllkmod mod,kglnaobj object
from x$kgllk lock_a
where kgllkmod > 0
and exists (select lock_b.kgllkhdl from x$kgllk lock_b
where kgllkses = '&saddr'
and lock_a.kgllkhdl = lock_b.kgllkhdl
and kgllkreq > 0);

4) 通过阻塞saddr找到相关会话信息
select sid,username,terminal,program from v$session where saddr = '&saddr '
笔者在这里使用了第一种方式生成了systemstate的trace文件,在文件里找到了相关信息:
其中sid:3875 是grant会话,正在等待library cache lock,而实例3上的会话1744正是阻塞者。会话1744的信息如下:

解决方案

找到阻塞会话,和业务确认后该会话可清理。清理该会话后,grant语句正常执行,到此问题解决。



本文作者:金震宇(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论