DBA必学:Oracle库缓存
2008-01-16 12:41:06 来源:WEB开发网如何解决库缓存给您制造的麻烦
库缓存中偶尔会为我们带来的麻烦通常来自于各种锁以及随之而来的由锁机制引发的以下等待事件:
库缓存加载锁:用户端碰到这种锁等待事件是因为有其他用户端对该对象使用了该锁,因此后来的用户端必须等待先前的用户端将锁释放出来为止。
库缓存锁:此类锁使某用户端能够享有对某对象的单独访问权,并阻止其他用户端的访问,例如在两个用户端想要同时编译某段相同的代码时。
库缓存pin:出现库缓存pin等待事件意味着有其他会话以不兼容模式锁定了该PIN。
不管库缓存中出现了哪种类型的等待事件,想要确定哪些会话在等待以及在等待的是什么资源,可以通过V$SESSION_WAIT视图查询进行诊断。例如,如果想要找出那些在等待“库缓存pin”的会话,可以执行以下的查询语句。对于一个库缓存pin来说,该查询的关键部分是P1RAW字段,该字段给出了阻塞特定会话的对象的句柄地址。对于其他类型的等待事件,您可以参考Oracle数据库的说明文档,找出对应于等待中的某对象或资源的P值。
以下是引用片段:
SELECTsid,event,p1raw
FROMsys.v_$session_wait
WHEREevent='librarycachepin'
ANDstate='WAITING';
然后我们可以执行以下的查询来找出正在等待哪些库缓存对象:
以下是引用片段:
SELECTkglnaownASowner,kglnaobjasObject
FROMsys.x$kglob
WHEREkglhdadr='&P1RAW';
要找出那些正在等待某个对象的用户,可以使用DBA_WAITERS视图并执行以下查询。这是一个非常简单的查询,却可以很巧妙的找出阻塞的会话,也就是查找与上面从V$SESSION_WAIT查询中找出的会话相匹配的等待会话,然后看看返回的holding_session结果。我们还可以看到在被阻塞的会话之后还有多少其他会话在等待中。如果有很多等待会话,那你就需要迅速采取行动了。
更多精彩
赞助商链接