DBA必学:Oracle库缓存

豆豆网   技术应用频道   2008年01月16日    社区交流

内容摘要:如果想要成为更出色的数据库管理员并为终端客户群提供更好的服务,那么了解Oracle数据库内部的结构非常重要。Oracle数据库的库缓存就是数据库管理员需要深入了解的一个内部结构,通过深入学习,能够帮助您消除由应用软件用户引发的一些非常烦人的拒绝服务请求事件。

  如何解决库缓存给您制造的麻烦

  库缓存中偶尔会为我们带来的麻烦通常来自于各种锁以及随之而来的由锁机制引发的以下等待事件:

  库缓存加载锁:用户端碰到这种锁等待事件是因为有其他用户端对该对象使用了该锁,因此后来的用户端必须等待先前的用户端将锁释放出来为止。

  库缓存锁:此类锁使某用户端能够享有对某对象的单独访问权,并阻止其他用户端的访问,例如在两个用户端想要同时编译某段相同的代码时。

  库缓存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结果。我们还可以看到在被阻塞的会话之后还有多少其他会话在等待中。如果有很多等待会话,那你就需要迅速采取行动了。

来源:IT专家网    作者:cyw    责编:豆豆技术应用

正在加载评论...