Vi støder jævntligt på diverse fejl, i forbindelse med daglig drift. En af de hyppigere er bl.a. ORA-1555 Snapshot too old og lange job kørsler. Oracle manualen for denne fejl type - skriver at det er pga. for små rollback segmenter, det kan det sagtens være - men det er ikke altid tilfældet.

Når en transaktion startes, holder Oracle "øje med" tiden, eller ihvertfald det man kalder for SCN - System commit number. Hele ideen er at, når der indhentes række information, sikrer Oracle at ingen rækker har været ændret efter nuværende transaktion blev startet. F.eks kunne jeg lave en

SELECT * FROM AUDIT;

Tabellen AUDIT er en mega tabel - og når jeg henter eller udfører ovenstående select, præsenteres jeg for data som de så ud da transaktionen startede. Da det er en stor tabel - kan man godt forestille sige at en eller anden opdaterer tabellen undervejs - altså mens min select kører, og sker det, kigger Oracle i rollback segmenterne efter den originale værdi for rækken - som den så ud da transaktionen startede, og præsenterer den for mig. 

U-commitede ændringer vil altid være i rollback segmenterne og der er ikke nogen snapshot problemmer her. Men! hvis ændringen commites efter indeværende transaktion er startet, så kan der faktisk ske det, at den rollback information der eksisterede omkring rækken bliver overskrevet, enten ved efterfølgende transaktioner eller ved OPTIMAL parameteren. Så er det vi har balladen, for Oracle forsøger at finde den række information i rollback segmentet - og det findes ikke - derfor kan Oracle ikke retunere et read-consistent resultat,og ORA-1555 opstår.

Nendefor har jeg samlet et par gode links - der går i dybden med ORA-1555 - det er god læsning og kan anbefales.

  1. Ora-1555:Snapshot too old by Chitra Mitra, Ziyad Dahbour, Rama Velpuri
  2. Avoiding ORA-1555 Errors by IXORA
  3. Ask Tom on ORA-1555
  4. Finding which session/processes causes ora-1555