【Memory】ORA-4031错误概要

    • 概述
    • 关于ORA-4031错误
    • ORA-4031的主要原因和解决方法

Keyword:

    Memory
    ora-4031
    Heap dump

版权声明:本文为博主原创文章,转载请注明出处,谢谢。http://blog.csdn.net/lukeunique

概述

本文将概括地介绍内存不足引起的ORA-4031错误。

关于ORA-4031错误

ORA-4031错误对于一些有一定Oracle数据库经验的人来说不陌生。
即:当进程从共享内存中分配内存时,由于没有足够大的连续空闲空间(内存块)而导致的错误。

错误报警的例子:

ORA-04031: unable to allocate 1072 bytes of shared memory ("shared pool","SELECT OBJECT_TYPE ...","KGLH0^46e70486","kkocs.c.kgght")

关于上面的错误内容各项目的含义,简单介绍如下:

1072 bytes              :请求分配的内存大小
"shared pool"           :要求内存的内存池(即发生错误的内存池)
(通常为shared pool或large pool,有时也可能是Java pool 或 Streams pool)
"SELECT OBJECT_TYPE ...":要求内存的对象内容,不明时出力为"unknown object"
"KGLH0^46e70486"        :要求内存的大体类型和位置
"kkocs.c.kgght"         :要求内存的类型

下面是ORA-4031的简单描述和帮助:

$ oerr ora 4031
04031, 00000, "unable to allocate %s bytes of shared memory (\"%s\",\"%s\",\"%s\",\"%s\")"
// *Cause:  More shared memory is needed than was allocated in the shared
//          pool or Streams pool.
// *Action: If the shared pool is out of memory, either use the
//          DBMS_SHARED_POOL package to pin large packages,
//          reduce your use of shared memory, or increase the amount of
//          available shared memory by increasing the value of the
//          initialization parameters SHARED_POOL_RESERVED_SIZE and 
//          SHARED_POOL_SIZE.
//          If the large pool is out of memory, increase the initialization
//          parameter LARGE_POOL_SIZE.  
//          If the error is issued from an Oracle Streams or XStream process, 
//          increase the initialization parameter STREAMS_POOL_SIZE or increase
//          the capture or apply parameter MAX_SGA_SIZE.

ORA-4031的主要原因和解决方法

发生ORA-4031错误的处理通常为”压垮骆驼背的最后一根稻草”,即很有可能是内存不足的受害者,而不是罪魁祸首。因此,在调查ORA-4031问题时,要关注总体的内存使用情况而不是发生问题的处理或对象。

一般ORA-4031错误主要有以下几种原因引起:

1.内存不足,内存池的过小。
2.内存池的碎片化。虽然总体空闲空间还是很大,但是由于碎片化没有足够大的连续空间。
3.应用的问题浪费过多的内存。如:游标没有共享产生过多的子游标,PL/SQL对象定义太大等。
4.由于Oracle的Bug影响。如不能正常释放内存而导致浪费大量内存。

相应地,ORA-4031错误解决办法需要根据发生原因来决定:

1.加大内存池的大小,解决内存池的过小的问题。
2.通过数据库重启或者 Flush内存池,解决内存池的碎片化。
3.修改应用程序或设计,解决应用的问题。
4.修改相应的Bug。

理论上讲,只要内存池足够大就不会发生ORA-4031错误。因此,无论何种原因引起的ORA-4031,只要系统允许,不断地加大内存池的大小都能暂时地改善ORA-4031的发生。

※对于ORA-4031错误详细解析以及相关内部原理等内容将在后续的文章中进行介绍。

你可能感兴趣的:(oracle,数据库,内存,memory,ORA-4031)