Oracle 数据库10g:自动共享内存管理

2/9/2008来源:Oracle教程人气:5464


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


  无论您是一个刚入门的
的错误:
DBA 还是一个经验丰富的 DBA

,您肯定至少看到过一次类似以下


  ORA-04031:unable to
allocate 2216 bytes of share
d memory ("shared pool"... ...

  或者这种错误:                                                                  ORA-04031:unable to allocate XXX
X bytes of shared memory
  ("large pool","unknown object","
session heap","frame")


  或者可能这种错误:                                                              ORA-04031:unable to
allocate bytes of shared mem
ory ("shared pool",
  "unknown object","joxlod:init h"
, "JOX:ioc_allocate_pal")

  第一种错误的原因很明
原因可能不是池本身的大小
的一个主题;但目前让我们
池的空间不足。
显:分配给共享池的内存不足以
,而是未使用绑定变量导致的过
把重点放在手头的问题上。)其

满足用户请求。(在某些情况下,
多分析造成的碎片,这是我很喜欢
它的错误分别来自大型池和 java



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

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

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

  假定您决定了这些池的值分别是 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 lar
ge_pool_size = 512m scope=me
mory;
  alter system set jav
a_pool_size = 512m scope=mem
ory;

  这个解决方案能够很好地工作一段时
开始了,大型池将立即出现内存不足。同
池,以拯救这种局面。
间,但是接着夜间的 RMAN 作业