在 Oracle 12.1.0.2 AIX Power9 上运行(是的,我知道现在是 2021 年,但那是我的客户)
执行一个包含 1000 个插入的 plsql 块作为纯文本并最终提交。
begin
insert into tab1 values (1);
insert into tab1 values (2);
...-- 998 more inserts
commit;
end;
它始终失败ORA-04030: out of process memory when trying to allocate 20504 bytes (callheap, KTI call freeable small pool)
相同的 plsql 块在数百个其他数据库上成功运行,包括这个版本和操作系统。
数据库已重新启动,除了我的之外没有任何会话。
内存参数为:
*.db_16k_cache_size=0
*.db_block_size=8192
*.db_cache_size=30g
*.java_pool_size=200m
*.large_pool_size=1g
*.lock_sga=TRUE
*.pga_aggregate_target=10g
*.shared_pool_size=8g
我试图使用内部参数 - 没有运气,同样的错误
*._use_realfree_heap=TRUE
*._realfree_heap_pagesize = 262144
更改_use_realfree_heap=FALSE
- 同样的错误。
仅这一点就值得一票。我真的很讨厌这个平台。
在分配的内存量如此之低的情况下出现该错误是操作系统配置问题,而不是数据库配置问题。
检查配置的限制并在需要时更改它们:
为 AIX 配置 Shell 限制和系统配置参数
一段时间后,我的 DBA 伙伴找到了解决方案:
将 pga_aggregate_target 从 10GB减少到 5GB
我猜该服务器上存在一些操作系统问题,阻止 Oracle 为 pga 分配 10GB。