Oracle 10G 数据库自动内存管理分析 是不是很难准确地分配不同的池所需的内存数?自动共享内存管理特性使得自动将内存分配到最需要的地方去成为可能。 无论您是一个刚入门的 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 数据库(现在已经很少见了)分配的要少。有一天,您的用户放开了一些非常大的全表扫描,以...