是不是很难准确地分配 配到最需要的地方去成为可
不同的池所需的内存数?自动共 能。
享内存治理特性使得自动将内存分
无论您是一个刚入门的 的错误:
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
作业
|