Oracle hat mit 19.11 in V$SGASAT das "PGA Accounting" neu eingeführt, und damit gleich ein Memory Leak erzeugt. Für jede neue Session ist PGA Accounting um exakt 40 Bytes gewachsen, auch wenn die Session wieder geschlossen wurde. Problematisch ist das für Datenbanken mit verhältnismäßig kleinen SGAs (wenige GB) bzw mit sehr vielen Connects / Sekunde (dutzende bis hunderte). Auch ein
ALTER SYSTEM FLUSH SHARED_POOL;
hilft in diesem Fall nicht.
Betroffene Oracle Versionen, Fehlermeldungen und Patching Information
- PGA Accounting wurde mit 19.11 eingeführt.
- Der Bug wird mit dem oneOff Patch 33415279 bzw. dem Critical Patch Update vom Jan 2022 (auf Oracle 19.14) behoben.
Wenn dieser Fehler auftritt, findet man im ALERT.LOG folgende Fehlermeldungen:
- ORA-4031 ("shared pool","unknown objeckt","KGLH0...","kglnit-3D")
- ORA-4031 ("shared pool","unknown objeckt","KGLH0...","kglnit-2D")
- ORA-4031 ("shared pool","unknown objeckt","KGLH0...","kglHeapInitialize:temp")
- ORA-4031 ("shared pool","unknown objeckt","KKSSP...","kglseshtSegs")
Überprüfung, ob der Bug ein Problem verursacht
Wenn FREE MEMORY in der SGA nur noch wenige 10k groß ist, dafür aber PGA ACCOUNTING schon viele MB/GB belegt,dann gibt es ein akutes Problem. Hier hilft nur noch ein Restart der Instanz - idealerweise, um gleich den Patch einzuspielen.
SELECT name, bytes
FROM v$sgastat
WHERE pool = 'shared pool'
AND name in ('free memory','pga accounting')
ORDER BY bytes DESC;
Mit STATSPACK kann dies auch mit folgender Abfrage nachvollzogen werden:
SELECT snap.startup_time, snap.snap_time, sga.bytes, logcur.value SessCnt, logcum.value SessTotal
FROM
stats$snapshot snap,
(select * from stats$sgastat where name = 'pga accounting') sga,
(select * from stats$sysstat where name = 'logons current') logcur,
(select * from stats$sysstat where name = 'logons cumulative') logcum
WHERE
snap.snap_id = sga.snap_id (+)
AND snap.snap_id = logcur.snap_id (+)
AND snap.snap_id = logcum.snap_id (+)
ORDER BY 2 DESC;
Die Query zeigt, wie viele Logons schon stattgefunden haben und wie der Platzverbrauch mit PGA Accounting immer weiter ansteigt.
Was behebt der Patch?
Der OneOff Patch behebt einen Fehler in der Funktion/dem Block ksm_reinit_pga_acc_ctx in ksm.o sowie einen zweiten Fehler in ksu.o. Die Information zu PGA Accounting kommt aus x$ksmss (ein Teil der View V$SGASTAT)
Details zum oneOff Patch 33415279
Dieser Patch behebt mehrere SGA Memory Probleme, unter anderem:
- 33278133: ORA-4031 ("streams pool","unknown object","streams pool","fixed allocation callback")
- 31923622: 50TB PDB Clone, ASMB Hit ORA-4031,"shared pool","unknown object","init_heap_kfsg","asm extent pointer array"
- 32428097: BCT: CTWR crashes during "_bct_public_dba_buffer_size" reset with ORA-00600 [krcpasb_initial_alloc_failure] & ORA-4031
- 32602194: BCT: Enhancement - Instance should not crash if bct enabled operation fails due to ORA-4031
- 32465193: ORA-4031 Due to high SQL Monitoring allocations in Shared Pool
- 32645139: ORA-4031 Top 10 Memory Uses for SGA Heap Shows Keomg Allocations
Referenzen
Support Note 33415279.8: Oracle 19.11, 19.12, 19.13: ORA-4031 OF SHARED POOL WHEN "PGA ACCOUNTING" WAS HIGHLY ALLOCATED AND KEPT ON GROWING