设为首页 加入收藏

TOP

buffercache和sharedpool详解(之五,问题诊断总结)(三)
2015-07-24 11:10:22 来源: 作者: 【 】 浏览:4
Tags:buffercache sharedpool 详解 之五 问题 诊断 总结
的概率。需要注意的是,这个参数的修改应当结合Shared Pool Size和Shared Pool Reserved Size的修改。设置_shared_pool_reserved_min_alloc=4100是经过证明的可靠方式,不建议设置更低。?

查询v$shared_pool_reserved视图可以用于判断共享池问题的引发原因:

16:26:38 sys@felix SQL>S SELECT free_space,

avg_free_size,

used_space,

avg_used_size,

request_failures,

last_failure_size

FROMv$shared_pool_reserved;?

FREE_SPACE AVG_FREE_SIZE USED_SPACE AVG_USED_SIZEREQUEST_FAILURES LAST_FAILURE_SIZE

---------- ------------- ---------- ----------------------------- -----------------

7255512 196094.919 8155392 220416 0 0?

17:04:04 sys@felix SQL>?

如果request_failures>0 并且last_failure_size>shared_pool_reserved_min_alloc,那么ORA-04031 错误就可能是因为共享池保留空间缺少连续空间所致。要解决这个问题,可以考虑加大shared_pool_reserved_min_alloc 来降低缓冲进共享池保留空间的对象数目,并增大shared_pool_reserved_size和shared_pool_size来加大共享池保留空间的可用内存。

如果request_failures>0 并且last_failure_size

1.2.7.5 其他?

此外,某些特定的SQL,较大的指针或者大的Package都可能导致ORA-04031错误。在很多ERP软件中,这样的情况非常常见。在这种情况下,可以考虑把这个大的对象Pin 到共享池中,减少其动态请求、分配所带来的负担。?

使用dbms_shared_pool.keep 系统包可以把这些对象pin 到内存中,最常见的SYS.STANDARD、SYS.DBMS_STANDARD等都是常见的候选对象。

注意:要使用DBMS_SHARED_POOL系统包,首先需要运行dbmspool.sql脚本,该脚本会自动调用prvtpool.plb 脚本创建所需对象。?

引发ORA-04031 错误的因素还有很多,通过设置相关参数如session_cached_cursors、cursor_space_for_time等也可以解决一些性能问题并带来针对性的性能改善,这里不再过多讨论。?

1.2.8 Library Cache Pin 及Library Cache Lock分析?

Oracle使用两种数据结构来进行Library Cache的并发访问控制:lock 和 pin

Lock可以被认为是解析锁,而Pin则可以被认为是以读取或改变对象内容为目的所加的短时锁。之所以将Library Cache Object对象分开,使用多个锁定来保护,其中的一个重要目的就是为了提高并发。

Lock比Pin具有更高的级别。Lock在对象handle上获得,在pin一个对象之前,必须首先获得该handle的锁定。Handle可以理解为Libray Cache对象的Buffer Header,其中包含了库缓存对象的名称、标记、指向具体对象的内存地址指针等信息。

再次引用一下前文曾经提到的图表,通过下图我们可以清晰的看到Object Handles和Heaps的关系:

\

锁定主要有三种模式: Null,share,Exclusive。在读取访问对象时,通常需要获取Null(空)模式以及share(共享)模式的锁定。在修改对象时,需要获得Exclusive(排他)锁定Library Cache Lock根本作用就是控制多个Oracle客户端对同一个Library Cache对象的并发访问,通过对Library Cache Object Hadle上加锁来防止非兼容的访问。

常见的使用或保护包括:

1. 一个客户端防止其他客户端访问同一对象

2. 一个客户端可以通过锁定维持相对长时间的依赖性(例如,防止其他客户端修改对象)

3. 当在Library Cache中定位对象时也需要获得这个锁定?

在锁定了Library Cache对象以后,一个进程在访问之前必须pin该对象。同样pin有三种模式,Null,shared和exclusive。只读模式时获得共享pin,修改模式获得排他pin。通常我们访问、执行过程、Package时获得的都是共享pin,如果排他pin被持有,那么数据库此时就要产生等待。

为了实现更好的性能,从Oracle10gR2开始,Library Cache Pin已经逐渐被互斥机制(Mutex)所取代,在Oracle Database 11g中,这个变化就更为明显。

1.2.8.1 LIBRARY CACHE PIN等待事件

library cache pin是用来管理library cache的并发访问的,pin一个Object会引起相应的heap被载入内存中(如果此前没有被加载),pins可以在Null、Share、Exclusive这3个模式下获得,可以认为pin是一种特定形式的锁。

当library cache pin等待事件出现时,通常说明该pin被其他用户已非兼容模式持有。library cache pin的等待时间为3秒钟,其中有1秒钟用于PMON后台进程,即在取得pin之前最多等待3秒钟,否则就超时。

ibrary cache pin的参数有P1(KGL Handle Address)、P2(Pin Address)和P3(Encoded Mode & Namespace), 常用的主要是P1和P2

library cache pin通常是发生在编译或重新编译PL/SQL、VIEW、TYPES等Object时。?

当Object变得无效时,Oracle会在第一次访问此Object时试图去重新编译它,如果此时其他session已经把此Object pin到library cache 中,就会出现问题,特别时当有大量的活动session并且存在较复杂的dependence时。在某种情况下,重新编译Object可能会花几个小时时间,从而阻塞其他试图去访问此Object的进程。

recompile过程包含以下步骤:

(1)存储过程的library cache object以排他模式被锁定,这个锁定是在handle上获得的。Exclusive 锁定可以防止其他用户执行同样的操作,同时防止其他用户创建新的引用此过程的对象。

(2)以Shared模式pin该对象,以执行安全和错误检查。

(3)共享pin被释放,重新以排他模式pin该对象,执行重编译。

(4)使所有依赖该过程的对象失效。

(5)释放Exclusive Lock和Exclusive Pin。

从Oracle 10g开始,以上测试将不会看到同样的效果,这是因为Oracle 10g对于

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇eXtremeDB--thesharedmemory80err.. 下一篇rac_udev建立磁盘方式安装grid时..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·数据库:推荐几款 Re (2025-12-25 12:17:11)
·如何最简单、通俗地 (2025-12-25 12:17:09)
·什么是Redis?为什么 (2025-12-25 12:17:06)
·对于一个想入坑Linux (2025-12-25 11:49:07)
·Linux 怎么读? (2025-12-25 11:49:04)