2025年2月26日 星期三

ORA-4031 案例分析

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 才能根本解決。


沒有留言:

張貼留言