Oracle 版本: 19.11
OS 版本: Linux 7.6
問題描述:
Oracle Client 無法連線至資料庫,查看 alert log 發現大量的 ORA-04031 錯誤訊息 :
2024-12-28T23:50:38.542646+08:00 Errors in file /orcl_db01/ora19/app/oracle/diag/rdbms/orcl/ORCL/trace/ORCL_ora_2984784.trc (incident=220937): ORA-04031: unable to allocate 4096 bytes of shared memory ("shared pool","EBS_STATUS_HIST","PRTMV^8cd4d535","kkpomSort hashed kpn's") Use ADRCI or Support Workbench to package the incident. See Note 411.1 at My Oracle Support for error and packaging details. 2024-12-28T23:50:46.173456+08:00 Errors in file /orcl_db01/ora19/app/oracle/diag/rdbms/orcl/ORCL/trace/ORCL_ora_2986554.trc (incident=222098): ORA-04031: unable to allocate 4096 bytes of shared memory ("shared pool","EBS_STATUS_HIST","PRTMV^8cd4d535","kkpomSort hashed kpn's") Use ADRCI or Support Workbench to package the incident. See Note 411.1 at My Oracle Support for error and packaging details. 2024-12-28T23:51:16.716651+08:00 Errors in file /orcl_db01/ora19/app/oracle/diag/rdbms/orcl/ORCL/trace/ORCL_ora_2987366.trc (incident=222809): ORA-04031: unable to allocate 4096 bytes of shared memory ("shared pool","IX_EBS_1","pacdHds_kkpaco","kksgaAlloc: firstN") |
問題分析:
ORA-04031 錯誤表示因為 shared pool 空間不足所致,必須要分析 shared pool 當中的哪個成分所造成空間不足,在發生問題的當下可以透過查詢 v$sgastat 來分析哪個成分占用較多空間 :
SQL> SELECT name, bytes FROM v$sgastat WHERE pool = 'shared pool' ORDER BY bytes DESC; |
或者是從 incident trace 所收集的 heap dump 來分析,從 TOP 20 MAXIMUM MEMORY USES ACROSS SGA HEAP 可以發現當前占用 shared pool 最多的是 "pga accounting" :

"pga accounting" 這個成分是用來存放 process state object 所用,當一個連線成立之後,在建立 server process 之前會先檢查當前 process 數量是否還沒有達到 process 參數所設定的上限,如果還足夠的話,則會申請一個 process 位址來建立此 server process ,由 v$process 的 ADDR 欄位就可以查到此位址。當 server process 成立之後便會分配 56 bytes 的空間來存放 process state object ,也就是從 shared pool 當中所看到的 "pga accounting" 。
在 19.11 這個版本有 Bug 33415279 ,此 Bug 讓 56 bytes 的空間沒有隨著 server process 結束來回收或重複使用,當新的 server process 建立時又重新產生一個 56 bytes 的 "pga accounting" ,漸漸的就把 shared pool 用完,然後就產生了 ORA-04031 的錯誤。
解決方法:
Bug 33415279 於 19.14 版本以上修復,將資料庫 patch 到 19.14 以上的版本,或者是在 19.11 直接 apply 33415279 的 one-off patch 皆可。在問題發生的當下,加大 shared_pool_size 或者是 flush shared_pool 可以短暫的解決問題,但最終還是需要打 patch 才能根本解決。
沒有留言:
張貼留言