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