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ü.
Operasyonel Doğrulama & Güvenilirlik Standardı
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:
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ık | Kök Neden | Açıklama |
|---|---|---|
| %65 | Bind 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). |
| %25 | Yetersiz `SHARED_POOL_SIZE` | Büyük PL/SQL paketleri için ayrılan bellek havuzu yetersizdir. |
| %10 | Büyük Paketlerin Pinned Olmaması | Sık kullanılan sistem paketleri önbellekte sabitlenmemiştir (DBMS_SHARED_POOL.KEEP). |
▸ACİL RUNBOOK (0-5dk)
-- 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
- 1Bind Variable Standardı: Uygulama katmanında dinamik SQL birleştirmesi (
String concat) yasaklanmalı, parametrik sorgular (:1, :2) kullanılmalıdır. - 2Kritik Paketleri Sabitleme (Pinning):
STANDARD,DBMS_STANDARDgibi paketler veritabanı açılışında belleğe çivilenmelidir:
EXEC DBMS_SHARED_POOL.KEEP('SYS.STANDARD');- 1SGA Boyutlandırma:
SHARED_POOL_SIZEtoplam SGA'nın en az %30-40'ı olacak şekilde ayarlanmalıdır.
▸Doğrulama
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.
Oracle ORA-01653: Tablespace Genişletme ve Çözüm Adımları
ORA-01653 / 01654 / 01652 ayrımı, tablespace doluluk sorgusu, datafile autoextend ve MAXSIZE ile güvenli büyütme.
Oracle ORA-00001: unique constraint violated Teşhisi ve Çözümü
Manuel ID girişleri veya sequence önbellek kaybı sonucu sequence'in mevcut tablodaki maksimum ID'nin gerisinde kalması; sequence INCREMENT BY adımları ve MERGE deseni.
Oracle ORA-00060: deadlock detected while waiting for resource Teşhisi
Ters sırada çalışan DML işlemleri veya yabancı anahtar kolonlarında indeks eksikliğinden kaynaklanan ORA-00060 kilitlenmeleri; trace dosyası okuma ve SELECT FOR UPDATE NOWAIT çözümü.