解析ORA-4031"无法分配x字节的共享内存"

Jef*_*emp 22 oracle memory-management oracle10g

我需要一些关于如何诊断和解决这个问题的建议.我不知道这是一个简单的服务器设置问题还是应用程序设计问题(或两者兼而有之).

每隔几个月一次或两次,此Oracle XE数据库会报告ORA-4031错误.它并没有始终指出sga的任何特定部分.最近的一个例子是:

ORA-04031: unable to allocate 8208 bytes of shared memory ("large pool","unknown object","sort subheap","sort key")

当出现此错误时,如果用户不断刷新,点击不同的链接,他们通常会在不同的时间获得更多这类错误,然后他们很快就会收到"404 not found"页面错误.

重新启动数据库通常会解决问题一段时间,然后一个月左右再次出现,但很少在程序中的同一位置(即它似乎没有链接到代码的任何特定部分)(上面的示例)从Apex页面引发错误,该页面从表中排序5000多行.

我已经尝试sga_max_size从140M增加到256M并希望这会有所帮助.当然,我不知道这是否有帮助,因为我必须重新启动数据库来更改设置:)

我在带有512MB RAM的Oracle Enterprise Linux 5机器上运行Oracle XE 10.2.0.1.0.服务器仅运行数据库,Oracle Apex(v3.1.2)和Apache Web服务器.我安装了几乎所有的默认参数,它运行了一年左右.我通过调整应用程序代码来解决自己的大多数问题; 它没有被广泛使用,也不是一个关键业务系统.

这些是我认为可能相关的一些当前设置:

pga_aggregate_target        41,943,040
sga_max_size              268,435,456
sga_target                146,800,640
shared_pool_reserved_size   5,452,595
shared_pool_size          104,857,600
Run Code Online (Sandbox Code Playgroud)

如果它有任何帮助,那么当前的SGA尺寸:

Total System Global Area  268435456 bytes
Fixed Size                  1258392 bytes
Variable Size             251661416 bytes
Database Buffers           12582912 bytes
Redo Buffers                2932736 bytes
Run Code Online (Sandbox Code Playgroud)

小智 7

即使您使用的是ASMM,也可以为大型池设置最小大小(MMAN不会将其缩小到该值以下).您还可以尝试固定一些对象并增加SGA_TARGET.

  • 嗯,现在已经过去了一年,到目前为止我们在4月/ 5月经常出现的活动没有出现任何内存错误或服务器停机时间.看起来不错 :) (9认同)

小智 5

不要忘记碎片.如果您有大量流量,您的池可能会碎片化,即使您有几个MB空闲,也可能没有大于4KB的块.使用以下查询检查最大空闲块的大小:

 select
  '0 (<140)' BUCKET, KSMCHCLS, KSMCHIDX,
  10*trunc(KSMCHSIZ/10) "From",
  count(*) "Count" ,
  max(KSMCHSIZ) "Biggest",
  trunc(avg(KSMCHSIZ)) "AvgSize",
  trunc(sum(KSMCHSIZ)) "Total"
from
  x$ksmsp
where
  KSMCHSIZ<140
and
  KSMCHCLS='free'
group by
  KSMCHCLS, KSMCHIDX, 10*trunc(KSMCHSIZ/10)
UNION ALL
select
  '1 (140-267)' BUCKET,
  KSMCHCLS,
  KSMCHIDX,
  20*trunc(KSMCHSIZ/20) ,
  count(*) ,
  max(KSMCHSIZ) ,
  trunc(avg(KSMCHSIZ)) "AvgSize",
  trunc(sum(KSMCHSIZ)) "Total"
from
  x$ksmsp
where
  KSMCHSIZ between 140 and 267
and
  KSMCHCLS='free'
group by
  KSMCHCLS, KSMCHIDX, 20*trunc(KSMCHSIZ/20)
UNION ALL
select
  '2 (268-523)' BUCKET,
  KSMCHCLS,
  KSMCHIDX,
  50*trunc(KSMCHSIZ/50) ,
  count(*) ,
  max(KSMCHSIZ) ,
  trunc(avg(KSMCHSIZ)) "AvgSize",
  trunc(sum(KSMCHSIZ)) "Total"
from
  x$ksmsp
where
  KSMCHSIZ between 268 and 523
and
  KSMCHCLS='free'
group by
  KSMCHCLS, KSMCHIDX, 50*trunc(KSMCHSIZ/50)
UNION ALL
select
  '3-5 (524-4107)' BUCKET,
  KSMCHCLS,
  KSMCHIDX,
  500*trunc(KSMCHSIZ/500) ,
  count(*) ,
  max(KSMCHSIZ) ,
  trunc(avg(KSMCHSIZ)) "AvgSize",
  trunc(sum(KSMCHSIZ)) "Total"
from
  x$ksmsp
where
  KSMCHSIZ between 524 and 4107
and
  KSMCHCLS='free'
group by
  KSMCHCLS, KSMCHIDX, 500*trunc(KSMCHSIZ/500)
UNION ALL
select
  '6+ (4108+)' BUCKET,
  KSMCHCLS,
  KSMCHIDX,
  1000*trunc(KSMCHSIZ/1000) ,
  count(*) ,
  max(KSMCHSIZ) ,
  trunc(avg(KSMCHSIZ)) "AvgSize",
  trunc(sum(KSMCHSIZ)) "Total"
from
  x$ksmsp
where
  KSMCHSIZ >= 4108
and
  KSMCHCLS='free'
group by
  KSMCHCLS, KSMCHIDX, 1000*trunc(KSMCHSIZ/1000);
Run Code Online (Sandbox Code Playgroud)

代码来自