ORA-01555: Snapshot too old (Oracle)
El error de Oracle 'ORA-01555: snapshot too old' indica que los datos antiguos (undo) que necesita una consulta para una lectura consistente ya se han sobrescrito. Este árbol acota el origen del error (consulta larga + UNDO insuficiente, alta rotación de undo o LOB) y le lleva a la solución correcta.
¿Dónde se produce el error?
Determine primero el contexto del error. ¿El ORA-01555 clásico se produce durante un SELECT/informe de larga duración o al acceder a una columna LOB (CLOB/BLOB)? El ORA-01555 relacionado con LOB es un mecanismo distinto (PCTVERSION/RETENTION) y se resuelve por separado.
SELECT sql_id, elapsed_time/1e6 AS sec, sql_text
FROM v$sql ORDER BY elapsed_time DESC FETCH FIRST 10 ROWS ONLY;- Durante una consulta/informe de larga duración
- Al acceder a una columna LOB
¿Es suficiente el UNDO, es adecuada la retención?
Una consulta larga lee desde UNDO la imagen antigua de los bloques modificados desde que empezó. Si el tablespace de UNDO es pequeño o undo_retention es más corto que la duración de la consulta, el undo antiguo se sobrescribe. Mida el uso de UNDO y la retención.
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 longest_query_sec, MAX(tuned_undoretention) AS tuned_retention
FROM v$undostat;- El UNDO es pequeño / la retención es más corta que la consulta
- El UNDO es suficiente pero los commits son muy frecuentes
- La consulta dura excesivamente
Causa raíz: UNDO / retención insuficientes
El undo antiguo que necesitaba la consulta larga se sobrescribió porque expiró el periodo de retención o se llenó el tablespace. Amplíe el UNDO y fije una retención que cubra la duración de la consulta.
Causa raíz: alta rotación de undo (commits frecuentes)
Un DML intenso con commits muy frecuentes recicla rápidamente los bloques de undo y borra la imagen antigua que necesita la consulta larga. El efecto 'commit cleanout' lo empeora.
Causa raíz: duración de la consulta excesiva
La consulta dura tanto que ni siquiera un undo_retention razonable basta. La solución permanente es acelerar la consulta o descargar su trabajo.
Causa raíz: retención de LOB / PCTVERSION
ORA-01555 al leer un LOB indica que el espacio que guarda las versiones antiguas del LOB (RETENTION o PCTVERSION) es insuficiente. Los LOB tienen un mecanismo de versionado aparte.