ORA-01555: Snapshot too old (Oracle)
Oracle 'ORA-01555: snapshot too old' hatası, bir sorgunun tutarlı okuma için ihtiyaç duyduğu eski (undo) verinin artık üzerine yazılmış olduğunu gösterir. Bu ağaç hatanın kaynağını (uzun sorgu + yetersiz UNDO, yüksek undo devri, yoksa LOB) daraltıp doğru çözüme götürür.
Hata nerede ortaya çıkıyor?
Önce hatanın bağlamını belirle. Klasik ORA-01555 uzun süren bir SELECT/rapor sırasında mı geliyor, yoksa bir LOB (CLOB/BLOB) kolonuna erişirken mi? LOB kaynaklı ORA-01555 farklı bir mekanizmadır (PCTVERSION/RETENTION) ve ayrı çözülür.
SELECT sql_id, elapsed_time/1e6 AS sec, sql_text
FROM v$sql ORDER BY elapsed_time DESC FETCH FIRST 10 ROWS ONLY;- Uzun süren bir sorgu/rapor sırasında
- Bir LOB kolonuna erişirken
UNDO yeterli mi, retention uygun mu?
Uzun sorgu, kendisi başladığından beri değişen bloklar için eski görüntüyü UNDO'dan okur. UNDO tablespace küçükse veya undo_retention sorgu süresinden kısaysa eski undo üzerine yazılır. UNDO kullanımını ve retention'ı ölç.
SHOW PARAMETER undo_retention;
SELECT tablespace_name, SUM(bytes)/1024/1024 AS mb, status
FROM dba_undo_extents GROUP BY tablespace_name, status;
SELECT MAX(maxquerylen) AS en_uzun_sorgu_sn, MAX(tuned_undoretention) AS tuned_retention
FROM v$undostat;- UNDO küçük / retention sorgudan kısa
- UNDO yeterli ama çok sık commit var
- Sorgu aşırı uzun sürüyor
Kök neden: Yetersiz UNDO / retention
Uzun sorgunun ihtiyaç duyduğu eski undo, retention süresi dolduğu ya da tablespace dolduğu için üzerine yazıldı. UNDO'yu büyüt ve retention'ı sorgu süresini kapsayacak şekilde ayarla.
Kök neden: Yüksek undo devri (sık commit)
Sistemde çok sık commit yapan yoğun DML, undo bloklarını hızla geri dönüştürüp uzun sorgunun ihtiyaç duyduğu eski görüntüyü siler. 'Commit-cleanout' etkisi bunu ağırlaştırır.
Kök neden: Aşırı uzun sorgu süresi
Sorgu o kadar uzun sürüyor ki makul bir undo_retention bile yetmiyor. Kalıcı çözüm sorguyu hızlandırmak ya da yükünü ayırmaktır.
Kök neden: LOB retention / PCTVERSION
LOB okurken gelen ORA-01555, LOB'un eski sürümünü tutan alanın (RETENTION veya PCTVERSION) yetersiz olduğunu gösterir. LOB için ayrı bir sürümleme mekanizması vardır.