dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Teşhis Kütüphanesi/oracle-ora-04031-unable-to-allocate-shared-memory-shared-pool
Oracle
Oracle 19c - 23aiBellek & SGA
12 dk okuma
ORA-04031: unable to allocate 4096 bytes of shared memory ("shared pool", ...)

Oracle Shared Pool Parçalanması: Bind Değişkeni Eksikliği, Literal SQL Taşması ve CURSOR_SHARING Çözümü

Milyonlarca tekil SQL sorgusunun paylaşılan bellek havuzunu parçalaması; v$sgastat analizi, acil FLUSH SHARED_POOL ve CURSOR_SHARING=FORCE / bind variable çözümü.

İnceleyen:Kıdemli Veritabanı Mimarı & SRE (dataiotech Labs)
Test Edilen Sürümler: Oracle Database 19c / 21c / 23ai

Operasyonel Doğrulama & Güvenilirlik Standardı

Son Teknik İnceleme: 2 Kasım 2026
Test Edilen SürümlerOracle 19c, 23ai
Gerekli YetkiALTER SYSTEM ve SELECT on v$sgastat, v$sqlarea
Risk Seviyesi
HighALTER SYSTEM FLUSH SHARED_POOL komutu geçici nefes aldırır ancak tüm planları silerek anlık CPU yükü yaratır
Beklenen Çıktıv$sgastat üzerinde free memory miktarının stabil kalması ve hard parse oranının düşmesi
Geri Dönüş (Rollback) Planı:SHARED_POOL_SIZE değerini eski boyutuna çekme
Oracle Docs: Tuning the Shared Pool
İlk 60 Saniye Teşhis Protokolü:

Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.

▸Belirti

Sorgular ve PL/SQL paketleri çalıştırılırken bellek hatası fırlatılır:

plaintext
ORA-04031: unable to allocate 4096 bytes of shared memory ("shared pool","unknown object","sga heap(1,0)","kglsim object batch")

▸Sahada Ne Görürsün?

Sunucuda boş RAM olmasına rağmen yeni sorgular parse edilemez. CPU kullanımı hard parse nedeniyle %100'e vurur.


▸Kök Neden Matrisi

OlasılıkKök NedenAçıklama
%65Bind Değişkeni Kullanılmaması (Literal SQL)Sorgularda WHERE id = 123 şeklinde sabit değerler kullanılır. Her sorgu için ayrı bir execution plan üretilerek shared pool parçalanır (fragmentation).
%25Yetersiz `SHARED_POOL_SIZE`Büyük PL/SQL paketleri için ayrılan bellek havuzu yetersizdir.
%10Büyük Paketlerin Pinned OlmamasıSık kullanılan sistem paketleri önbellekte sabitlenmemiştir (DBMS_SHARED_POOL.KEEP).

▸ACİL RUNBOOK (0-5dk)

sql
-- 1. Shared pool boş bellek durumunu gör SELECT pool, name, bytes / 1024 / 1024 AS MB FROM v$sgastat WHERE pool = 'shared pool' ORDER BY bytes DESC FETCH FIRST 10 ROWS ONLY; -- 2. Bind variable kullanmayan ve en çok parse edilen literal sorguları bul SELECT sql_text, executions, parse_calls, version_count FROM v$sqlarea WHERE executions = 1 ORDER BY parse_calls DESC FETCH FIRST 10 ROWS ONLY; -- 3. ACİL NEFES ALMA: Shared pool'u temizle (Geçici rahatlama) ALTER SYSTEM FLUSH SHARED_POOL; -- 4. ACİL MÜDAHALE: Oracle'ı literal değerleri bind değişkene çevirmeye zorla ALTER SYSTEM SET cursor_sharing = FORCE SCOPE = BOTH;

▸KALICI BLUEPRINT

  1. 1Bind Variable Standardı: Uygulama katmanında dinamik SQL birleştirmesi (String concat) yasaklanmalı, parametrik sorgular (:1, :2) kullanılmalıdır.
  2. 2Kritik Paketleri Sabitleme (Pinning): STANDARD, DBMS_STANDARD gibi paketler veritabanı açılışında belleğe çivilenmelidir:
sql
EXEC DBMS_SHARED_POOL.KEEP('SYS.STANDARD');
  1. 1SGA Boyutlandırma: SHARED_POOL_SIZE toplam SGA'nın en az %30-40'ı olacak şekilde ayarlanmalıdır.

▸Doğrulama

sql
SHOW PARAMETER cursor_sharing; SELECT pool, name, bytes / 1024 / 1024 AS MB FROM v$sgastat WHERE name = 'free memory';

Diğer Veritabanı Hata Teşhisleri

Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.

Tüm Hatalar (82)