Oracle Benzersiz Kısıtlama İhlali: Sequence Geri Kalması, MERGE Kullanımı ve LOG ERRORS INTO Yöntemi
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.
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 kayıt eklerken işlem durdurulur ve şu hata döner:
ORA-00001: unique constraint (PROD.PK_USERS) violated▸Sahada Ne Görürsün?
Tabloya yeni kayıt eklenemez. Sequence kullanılmasına rağmen Oracle var olan bir birincil anahtarı tekrar üretip benzersizlik kısıtlamasına çarpar.
▸Kök Neden Matrisi
| Olasılık | Kök Neden | Açıklama |
|---|---|---|
| %60 | Sequence'in Geride Kalması | Manuel veri yüklemelerinde ID elle verilmiş, sequence sayacı tablodaki MAX(id) değerinin gerisinde kalmıştır. |
| %25 | ETL / Batch Mükerrer Kaydı | Veri yükleme scripti aynı doğal anahtara (TCKN, Email) sahip satırı ikinci kez eklemeye çalışır. |
| %15 | Sequence CACHE Kaybı (Instance Crash) | CACHE 20 olan sequence sunucu beklenmedik kapandığında numaraları atlamış veya senkronizasyon kaymıştır. |
▸ACİL RUNBOOK (0-5dk)
-- 1. Kısıtlamanın hangi tablo ve kolona ait olduğunu gör
SELECT constraint_name, table_name FROM user_constraints WHERE constraint_name = 'PK_USERS';
-- 2. Tablodaki en büyük ID ile sequence değerini karşılaştır
SELECT MAX(id) FROM users;
SELECT PROD.USERS_SEQ.NEXTVAL FROM dual;
-- 3. Sequence'i hızlıca tablodaki maksimum ID'nin üzerine atlat
-- Fark 100 ise:
ALTER SEQUENCE PROD.USERS_SEQ INCREMENT BY 150;
SELECT PROD.USERS_SEQ.NEXTVAL FROM dual;
ALTER SEQUENCE PROD.USERS_SEQ INCREMENT BY 1;▸KALICI BLUEPRINT
- 1Oracle 12c+ IDENTITY Kolonu: Trigger + Sequence ikilisi yerine Oracle'ın yerel
GENERATED BY DEFAULT AS IDENTITYözelliği kullanılmalıdır. - 2MERGE Kullanımı: İdempotent veri aktarımlarında
INSERTyerineMERGE INTO ... WHEN NOT MATCHED THEN INSERTdeseni uygulanmalıdır. - 3DML Error Logging: Toplu yüklemelerde tek bir hata tüm batch'i bozmasın diye
LOG ERRORS INTO err$_users REJECT LIMIT UNLIMITEDkullanılmalıdır.
▸Doğrulama
SELECT PROD.USERS_SEQ.CURRVAL, (SELECT MAX(id) FROM users) AS max_id FROM dual;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-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ü.
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ı.