Browse Tag: LOB

ORA-01555 Instantánea demasiado antigua (problemas con LOBS)

Los errores ORA-1555 pueden ocurrir cuando una consulta no puede retener (el suficiente tiempo necesario) los datos en el UNDO para construir una copia de los datos en el momento que la consulta comenzó, dado que si otra transacción modifica alguno de los datos leídos, debemos poder satisfacer lo que llamamos lectura consistente. Existe un parámetro UNDO_RETENTION que le dice al UNDO que mantenga los datos por ese periodo de tiempo (en segundos) y así garantiza las lecturas consistentes.

En esta entrada vamos a revisar en concreto el siguiente error:

ORA-01555: instantánea demasiado antigua: número de segmento de rollback  con nombre “” demasiado pequeño %j

 El problema parece venir de los LOBS, ya que el error no nos da ningún nombre de segmento.

Las columnas que contienen LOBS pueden permitir almacenar datos en la fila (INLINE LOBS) o no (OUT OF LINE LOBS).

Posibles pasos para solucionar estos problemas en LOBS

ORA-01555 en LOBS significa que no tenemos el (lob_id + versión) que esperamos, por lo tanto puede tener un problema de lectura consistente o una corrupción en el lob segment.

a) Chequear corrupción en LOBS

      Una de las principales razones de los ORA-01555 con LOBS es la corrupción. En caso de corrupción el formato de error será el siguiente:

      ORA-01555: snapshot too old: rollback segment number  with name “” too small
      ORA-22924: snapshot too old

Con la siguiente nota de soporte de Oracle podemos confirmar la corrupción en LOB SEGMENTS.

Export Fails With Errors ORA-2354 ORA-1555 ORA-22924 And How To Confirm LOB Segment Corruption Using Export Utility (Doc ID 833635.1)

b.) Issues with Retention/Pctversion values

PCTVERSION and RETENTION

PCTVERSION afecta a la reclamación de viejas copias de datos LOB. Esto afecta a la disponibilidad de las lecturas consistentes. Si una session necesita usar una vieja version de un LOB y esta se ha sobreescrito (porque el PCTVERSION demasiado pequeño) entonces el usuario verá el siguiente error:

ORA-01555: snapshot too old: rollback segment number with name “” too small
ORA-22924: snapshot too old

Alternativamente el parámetro RETENTION es usado para determiner cuanto tiempo (en segundos) el lob undo debería ser retenido. No se puede configurar el valor de RETENTION de forma explícita. La cantidad de tiempo de retención de LOB versions es determinado por el parámetro UNDO_RETENTION. El uso del parámetro RETENTION es soportado solamente en Automatic Undo Management mode.

Si el valor de PCTVERSION o RETENTION es configurado demasiado grande y si las queries en el lob segment son relativamente pequeñas, entonces gastaríamos una porción grande del segment en retener older lob versions. En caso de valores pequeños, ORA-01555 pueden aparecer.

En 11g podemos usar retenciónes específicas para cada LOB segment.

c.) More checks

Si BLOB/CLOB están NOCACHE, entonces chequear CACHE puede ayudar o no tiene efectos.

d.) Bugs

He revisado los posibles BUGS y he encontrado los siguientes:

d.1) BUG 5636728 – LOB corruption / ORA-1555 when reading LOBs after a SHRINK operation

Versions confirmed as being affected – 10.2.0.3

d.2)  Bug 5212539 – LOB corruption for NOCACHE LOBs (ORA-1555/ORA-22924)

Versions confirmed as being affected

9.2.0.6

9.2.0.7

10.1.0.4

10.1.0.5

10.2.0.1

10.2.0.2