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.
小智 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)
| 归档时间: |
|
| 查看次数: |
169504 次 |
| 最近记录: |