Oracle中自动共享内存管理特性深入分析

文章作者 100test 发表时间 2007:03:14 13:40:22
来源 100Test.Com百考试题网


是不是很难准确地分配不同的池所需的内存数?自动共享内存管理特性使得自动将内存分配到最需要的地方去成为可能。

无论您是一个刚入门的 DBA 还是一个经验丰富的 DBA,您肯定至少看到过一次类似以下的错误:

  

  ORA-04031:unable to allocate 2216 bytes 

    of shared memory ("shared pool"... ...

 
 

或者这种错误:

  ORA-04031:unable to allocate XXXX bytes of shared memory

  ("large pool","unknown object","session heap","frame")

 
 

或者可能这种错误:

  ORA-04031:unable to allocate bytes of shared memory ("shared pool",

  "unknown object","joxlod:init h", "JOX:ioc_allocate_pal")

 
 

第一种错误的原因很明显:分配给共享池的内存不足以满足用户请求。(在某些情况下,原因可能不是池本身的大小,而是未使用绑定变量导致的过多分析造成的碎片,这是我很喜欢的一个主题;但目前让我们把重点放在手头的问题上。)其它的错误分别来自大型池和 Java 池的空间不足。

您需要解决这些错误情况,而不作任何与应用程序相关的修改。那么有哪些方案可选呢?问题是如何在 Oracle 例程所需的所有池之间划分可用的内存。

馅饼怎么分?

正如您所了解的,一个 Oracle 例程的系统全局区域 (SGA) 包含几个内存区域(包括缓冲高速缓存、共享池、Java 池、大型池和重做日志缓冲)。这些池在操作系统的内存空间中占据了固定的内存数;它们的大小由 DBA 在初始化参数文件中指定。

这四个池(数据库块缓冲高速缓存、共享池、Java 池和大型池)几乎占据了 SGA 中所有的空间。(与其它区域相比,重做日志缓冲没有占据多少空间,对我们这里的讨论无关紧要。)作为 DBA,您必须确保它们各自的内存分配是充足的。

假定您决定了这些池的值分别是 2GB、1GB、1GB 和 1GB。您将设置以下初始化参数来为数据库例程规定池的大小。

  db_cache_size = 2g

  shared_pool_size = 1g

  large_pool_size = 1g

  java_pool_size = 1g

 
 

现在,仔细看一下这些参数。坦白讲,这些值是否准确?我相信您一定会有疑虑。在实际中,没有人能够为这些池指定确切的内存数 — 它们太依赖于数据库内部的处理,而处理的特性随时在变化。

下面是一个示例场景。假定您有一个典型的、大部分属于 OLTP 的数据库,并且为缓冲高速缓存分配的专用内存比为纯 OLTP 数据库(现在已经很少见了)分配的要少。有一天,您的用户放开了一些非常大的全表扫描,以创建当天的结束报表。Oracle9i 数据库为您提供了在线修改内存分配的功能,但由于提供的总物理内存有限,您决定从大型池和 Java 池中取出一些内存:

  alter system set db_cache_size = 3g scope=memory.

  alter system set large_pool_size = 512m scope=memory.

  alter system set java_pool_size = 512m scope=memory.

 
 

这个解决方案能够很好地工作一段时间,但是接着夜间的 RMAN 作业(它们使用大型池)开始了,大型池将立即出现内存不足。同样,您从数据库高速缓存中取出一些内存来补充大型池,以挽救这种局面。

RMAN 作业完成,然后启动一个广泛使用 Java 的批处理程序,接着您开始看到与 Java 池相关的错误。因此,您(再次)重新分配池,以满足 Java 池和数据库高速缓存上的内存需求:

  alter system set db_cache_size = 2G scope=memory.

  alter system set large_pool_size = 512M scope=memory.

  alter system set java_pool_size = 1.5G scope=memory.
  

第二天早上,OLTP 作业恢复在线,这个循环又完全重复!解决这种恶性循环的一种替代方法是永久设置每个池的最大需求。不过,这么做的话,您分配的总的 SGA 可能超出可用的内存 — 从而在为每个池分配的内存数不足时,将增加交换和分页的风险。人工重新分配的方法(虽然不实际)目前看起来很不错。



相关文章


Oracle中国前员工述说公司高层内部纷争史
Oracle下调数据库许可价格以适应多芯CPU
Oraclelogminer使用方法总结
剖析Oracle10g数据库的各种存储形式
Oracle中自动共享内存管理特性深入分析
Oracle组件实现动态Web数据库
SP封面文章:Oracle在华陷入光辉孤立
深入了解Oracle10g中新的多重集运算符(上)
Oracle中空扩音机玩味浓
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛