DBAtlas · Veritabanı operasyon atlası

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.

DBAtlas'ta aç →