论坛求助
问题重现
思路分析
这里我们看到了一个等待事件‘library cache lock’,那么什么情况下会出现library cache lock,这里我们首先要了解什么是Library Cache。
Library Cache是Oracle SGA 中Shared pool 的组成部分,它几乎是Oracle内存结构中最复杂的一部分,主要存放shared curosr(SQL)和PLSQL对象(function,procedure,trigger)的信息,以及这些对象所依赖的table,index,view等对象的信息,Library cache主要解决这些对象的三个问题:1.快速定位,2.关系依赖,3.并发控制,其中并发控制就会涉及到library cache lock,当会话访问对象时,首先必须获取lock,然后将访问的数据pin在内存中。lock的作用是控制进程间的并发访问,而pin的作用是保证数据一致性,防止数据在访问时被交换出去,了解到了这个情况,我们就需要查询到是那个会话把该逻辑备份的会话堵塞,只要找到这个堵塞会话,然后加以解决,相信该Hang的问题就能够随之解决。
解决过程
如前面提到的,首先是找到什么会话导致library cache lock ,这里我们需要用到metalink的一篇文章《How to Find which Session is Holding a Particular Library Cache Lock [ID 122793.1]》,该文详细介绍了如何找到导致holding的会话,大意是说要使用的到oracle的x$内部表,有兴趣的同学可以自己查看下该文章,我这里直接引用。
x$表是oracle的内部核心表,只有sys用户连接数据库才能访问,通过下面的一段SQL查出堵塞会话。
这里我眼前一亮,SID为148的会话,不正事前面我们查询出来状态为KILLED的会话吗?看来已经确定是该会话导致后续的exp堵塞,那既然已经杀掉的会话,为什么还会堵塞呢?这里我们有必要说明下oracle的kill会话的操作。
在Oracle数据库中,可以通过kill session的方式来终止一个进程,语法为:
alter system kill session 'sid,serial# ',但是alter system kill session只是将session标记为可以回收,切断会话与Server Process的映射关系。但没有进行资源释放回收工作,一旦尝试连接,PMON会主动开始清理被kill的会话,同时Oracle拒绝连接操作,Server Process是一个忠实于客户端的进程,只要客户端还在启动,维持着两个之间的联系。Server Process是不会被回收的。直到客户端主动停止与Server Process的通信,Server Process才释放资源。如何才能彻底释放资源呢?其实我们只要在操作系统层面上,结束该会话的进程就行了,首先要找到进程号,由于被置于KILLED状态的会话,该session的paddr被修改,因此无法通过v$session和v$process关联来获得spid,但是可以通过下面的SQL语句,来进行查找:
验证问题
后续总结
1.首先确定Hang住会话的等待事件。。
2.然后分析该等待事件,找到引起该等待的原因,是由于锁,还是由于资源繁忙?
3.最后根据其产生的原因,排除问题,一般都能够解决问题。
希望本例的介绍对大家在以后处理类似业务有所帮助。