ORA-4031错误详解

报ORA-4031错误时,我们通常可以根据Oracle无法分配多少字节的内存,来判断共享池碎片的严重程度,以下是4031错误官方的解释:

[oracle@guoyj ~]$ 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-04031错误:

1、第一个实验硬解析产生大量的碎片重现4031错误

2、当前的数据库版本

SQL> select * from v$version where rownum=1;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

3、关闭ASMM,设置shared pool大小为120M

SQL> show parameter mem

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

hi_shared_memory_address             integer     0

memory_max_target                    big integer 804M

memory_target                        big integer 804M

shared_memory_address                integer     0

SQL> show parameter sga

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

lock_sga                             boolean     FALSE

pre_page_sga                         boolean     FALSE

sga_max_size                         big integer 804M

sga_target                           big integer 0

SQL>alter system set memory_target=0;  --11g的新特性调整(SGA+PGA)

SQL>startup force;

SQL> alter system set sga_target=0;

SQL>startup force;

SQL> show parameter memory_target

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

memory_target                        big integer 0

SQL> show parameter sga_target

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

sga_target                           big integer 0

SQL> alter system set shared_pool_size=120M;

System altered.

4、创建表并插入数据

create table t1(id int,name varchar2(100));

begin

 for i in 1 .. 100000 loop

 insert into t1 values(i,'gyj'||i);

 commit;

end loop;

end;

/

5、跑下面匿名块模拟产生大量的硬解析

declare

   msql varchar2(500);

   mcur number;

   mstat number;

   jg varchar2(4000);

   cg number;

begin

   mcur:=dbms_sql.open_cursor;

时间: 2025-01-21 06:24:35

ORA-4031错误详解的相关文章

ORA-01555错误详解

ORA-01555错误详解   ORA-01555(快照过旧)问题让很多人感到十分头痛.最近我们的生产系统上也报出了ORA-01555错误.就结合这次案例将ORA-1555问题作个案例分析,并浅析产生原因和各种解决办法. 如果要了解1555错误产生的原因,就需要知道ORACLE的两个特性:一致性读(Consistent Get)和延迟块清除(Delayed Block Cleanout).此外,还要知道关于回滚段的一些配置参数. 相关参数 先看下Oracle中关于UNDO有哪些配置参数: SQL

ORA-19573错误详解

1.1.1. ORA-19573 日期:2014-05-21 17:25 环境:测试环境 [情景描述] 数据库实例处于OPEN状态(READ WRITE),这时在RMAN中执行数据库还原.恢复操作遇到报错. [报错信息] RMAN> run { 2> allocate channel ch1 type disk; 3> allocate channel ch2 type disk; 4> set until scn 1520939; 5> restore database;

ORA-19502及ORA-27072错误详解

1.1.1. ORA-19502,ORA-27072 日期:2014-05-12 00:12 环境:测试机 [错误号] $ oerr ora 19502 19502, 00000, "write error on file\"%s\", block number %s (block size=%s)" // *Cause: write error on output file // *Action: check the file $ oerr ora 27072 2

Linux标准输入及输出错误详解

输出包含两种类型: 一种是程序的运行结果(标准输出), 一种是状态和错误信息(标准错误). 标准输出(standard output)和 标准错误(standard error), 默认是连接至屏幕; 标准输入(standard input) 默认是连接至键盘; 可以使用IO重定向(redirection), 改变输入, 输出的发送位置; 1. 标准输出 标准输出重定向, 使用重定向操作符(">"), 把程序输出至文件, 默认是从文件头部重写写入; 可以使用">

Linux标准输入输出错误详解

输出包含两种类型: 一种是程序的运行结果(标准输出), 一种是状态和错误信息(标准错误). 标准输出(standard output)和 标准错误(standard error), 默认是连接至屏幕; 标准输入(standard input) 默认是连接至键盘; 可以使用IO重定向(redirection), 改变输入, 输出的发送位置; 1. 标准输出 标准输出重定向, 使用重定向操作符(">"), 把程序输出至文件, 默认是从文件头部重写写入; 可以使用">

LAMP架构的编译安装及错误详解

本次试验用的是新安装的系统,以此保证纯净,站在第一次编译安装lamp的角度,分析各种错误,从错误开始入手. 至于lamp是干什么用的,我就不赘述了,直接开始. 本文中的软件我都已经下好了,并且打包好了,如果有需要的朋友,可以自己下载我的软件包 首先交代一下系统的版本 [root@localhost libevent-2.0.18-stable]# lsb_release -a LSB Version:    :core-4.0-ia32:core-4.0-noarch:graphics-4.0-

Oracle ORA-4031错误详解

oracle  ORA-4031错误产生的原因 首先这个错误发生时的表现如下: ORA-04031: unable to allocate XXXX bytes of shared memory ("shared pool,"unknown object","sga heap(1,0)","obj stat memor") 就是最基本的查询简单的动态性能视图都无法完成: 下面来细细的分析一下原因: 这就需要从shared pool 的内

MDK常见错误详解集合

错误代码及错误信息 错误释义 error 1: Out of memory 内存溢出 error 2: Identifier expected 缺标识符 error 3: Unknown identifier 未定义的标识符 error 4: Duplicate identifier 重复定义的标识符 error 5: Syntax error 语法错误 error 6: Error in real constant 实型常量错误 error 7: Error in integer consta

结构体指针之 段错误 详解(精典!!!)

一个网友问了我一个问题,一个C程序运行出现了段错误,这个问题非常好,很多初学者都容易犯这个错误,具体代码如下: 这个编译没有问题,但是运行是段错误    Segmentation fault 因为你定义了一个结构体指针p,用来指向此类结构体,但是你却没有给他赋值,此时p的值为NULL,你并没有在内存中为p分配任何空间,所以p->a=1这句就会出段错误. 修改方法1:可以给p分配一段内存空间,并使其指向此空间: p=(struct abc *)malloc(sizeof(struct abc));