Oracle Kilitlenme Tespiti: Trace Dosyaları, v$wait_chains Analizi ve İndekssiz Foreign Key Kilitleri
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ü.
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
Uygulama transaction çalıştırırken aniden hata alır ve işlem geri alınır:
ORA-00060: deadlock detected while waiting for resource▸Sahada Ne Görürsün?
İki eşzamanlı işlem aynı anda birbirinin kilitlediği satırları bekler. Oracle saniyeler içinde döngüyü tespit eder ve transaction'lardan birini kurban (victim) seçerek abort eder. Alert log'da bir .trc dosyası referansı verilir.
▸Kök Neden Matrisi
| Olasılık | Kök Neden | Açıklama |
|---|---|---|
| %55 | Ters Sırada Güncelleme (Cross-Update) | İşlem A önce Tablo X'i sonra Tablo Y'yi günceller; İşlem B ise tam tersi sırada günceller. |
| %35 | İndekssiz Yabancı Anahtar (Unindexed Foreign Key) | Çocuk tabloda foreign key kolonu indekslenmemiştir. Ebeveyn tabloda bir satır silindiğinde/güncellendiğinde Oracle çocuk tablonun tamamına tablo seviyesinde kilit koyar! |
| %10 | Bitmap İndekslerde Eşzamanlı DML | OLTP tablolarında Bitmap indeks kullanılması blok seviyesinde kilitlenmelere yol açar. |
▸ACİL RUNBOOK (0-5dk)
-- 1. Trace dosyasının konumunu öğren
SELECT value FROM v$diag_info WHERE name = 'Default Trace File';
-- 2. Aktif bloke eden oturumları gör
SELECT blocking_session, sid, serial#, username, wait_class, seconds_in_wait
FROM v$session WHERE blocking_session IS NOT NULL;
-- 3. İndekssiz foreign key'leri tespit et (klasik ORA-00060 sebebi)
SELECT c.table_name, c.constraint_name, cc.column_name
FROM user_constraints c
JOIN user_cons_columns cc ON c.constraint_name = cc.constraint_name
WHERE c.constraint_type = 'R'
AND NOT EXISTS (
SELECT 1 FROM user_ind_columns ic
WHERE ic.table_name = c.table_name AND ic.column_name = cc.column_name
);▸KALICI BLUEPRINT
- 1Foreign Key İndeksleme: Tüm yabancı anahtar (FK) kolonlarına istisnasız B-Tree indeks konmalıdır.
- 2Sıralı Güncelleme Standardı: Çoklu satır güncellemelerinde satırlar her zaman
ORDER BY idile sıralanarak kilitlenmelidir. - 3`NOWAIT` veya `SKIP LOCKED`:
SELECT ... FOR UPDATE NOWAITile kilit alınamıyorsa anında dönülmeli, sonsuz bekleme engellenmelidir.
▸Doğrulama
SELECT * FROM v$wait_chains WHERE blocking_session IS NOT NULL;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-01555: snapshot too old Teşhisi ve Kalıcı Çözüm
Uzun süren okuma sorguları devam ederken commit edilmiş diğer transaction'ların undo segmentlerini ezmesi; v$undostat ile MAXQUERYLEN analizi ve RETENTION GUARANTEE politikası.