Oracle
在具有大型 pga 和 sga 的中等插入上獲取“ORA-04030:程序記憶體不足”
在 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
- 同樣的錯誤。
一段時間後,我的 DBA 夥伴找到了解決方案:
將 pga_aggregate_target 從 10GB減少到 5GB
我猜該伺服器上存在一些作業系統問題,阻止 Oracle 為 pga 分配 10GB。
“AIX Power9 (是的,我知道現在是 2021 年…… ”
僅這一點就值得一票。我真的很討厭這個平台。
在分配的記憶體量如此之低的情況下出現該錯誤是作業系統配置問題,而不是數據庫配置問題。
檢查配置的限制並在需要時更改它們: