我们在 Oracle 11.1.0.7 上使用自动内存管理。上周五,共享池意外地从 ~600MB 增加到 ~850MB。内存来自从 ~400 到 ~150 的缓冲区缓存。毋庸置疑,系统执行的磁盘读取操作比以前要多得多。到目前为止,我还无法证明这是一个不正确的更改,但它在我看来确实不正确。我想知道是什么原因造成的,所以我希望可以扭转它。
我对之前和之后的 AWR 进行了比较,我注意到共享池的增加几乎完全在 sql 区域。我使用如下查询查看了存储在那里的 SQL,但没有发现任何最近会改变的东西:
--Replace anything in quotes and numbers with % so that statements not using
--bind variables group together.
SELECT count(*), Trunc(sum(sharable_mem)/1024/1024) SharableMemory,
regexp_replace(regexp_replace(
sql_text,'.\''.+\''','''%'''),'[0-9]+','%') || ''';' sql
FROM v$sql
GROUP BY regexp_replace(regexp_replace(
sql_text,'.\''.+\''','''%'''),'[0-9]+','%')
HAVING sum(sharable_mem) > 2*1024*1024
ORDER BY Trunc(sum(sharable_mem)/1024/1024) DESC;
我还尝试刷新共享池。系统不会将任何共享池放弃给缓冲区缓存,可能是因为刷新后大小增加得太快。
我还尝试为缓冲区缓存设置最小大小,以强制它放弃共享池中的内存。在我的测试系统上,这种方法允许我将缓冲区缓存增加大约 100MB,但在我的实时系统上,它甚至不会增加 3MB,然后给我一个错误,表明没有足够的内存来执行操作。
警报日志在更改发生的时间附近显示“Sweep Incident[77273]:已完成”。我在metalink上找不到太多关于它的信息。它还显示 DIA0 在那个时间附近重新启动,但我不明白这有什么关系。
这里有几个可能不相关的注释。AWR 显示,库缓存中所有命名空间的 pin 请求数量几乎是问题开始前的两倍。大约一个月前,数据库从 10.2.0.4 升级。问题发生前大约一周,会话数从约 200 次增加到约 250 次。
我将重启实例作为最后的手段,因为我不知道它是否会有所帮助。
任何建议,将不胜感激。
重启!