ORA-1555 y UNDO_RETENTION.

Llego a la oficina y lo primero que hago es ver el ‘log’ de un proceso que dejé corriendo el viernes en un sevidor de TEST. El proceso en cuestión es un conjunto de pesadísimos ‘MERGES’, ‘UPDATES’ e ‘INSERTS’ (una especie de proceso ETL). Descubro para mi desgracia que el viernes hubo un ORA-1555 a las 23:34:

Inicio Xxxxx x Xxxxx XXXX + Xxxxxxx: MERGE 1. 26/10/2007 13:44:11
Error en STAGE 3: ORA-12801: error signaled in parallel query server P006
ORA-01555: snapshot too old: rollback segment number 9 with name "_SYSSMU9$" too small 27/10/2007 23:34:16
Fin del proceso. 27/10/2007 23:34:16

Lo raro es que, según el ‘log’, el proceso llevaba corriendo 34 horas(!). Anteriormente, este mismo proceso se había completado en unas 17 horas (?) (Nótese que se ejecuta PARALLEL).

El caso es que viendo UNDO_RETENTION tenemos:

carlos@db01.xxxxxx> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1

lo que de hecho es claramente insuficiente. Los segmentos de ‘rollback’ se están reescribiendo demasiado pronto, y cuando Oracle ha querido hacer una vista ‘consistente’ de algun dato en el macro-proceso, se ha encontrado con que no podía, porque el segmento de ‘rollback’ (se llama “_SYSSMU9$”) había sido reutilizado (sobreescrito).

Miramos V$UNDOSTAT:

carlos@db01.xxxxxx> select BEGIN_TIME, END_TIME, MAXQUERYLEN, TUNED_UNDORETENTION
 2 from v$undostat order by maxquerylen;

BEGIN_TIME          END_TIME            MAXQUERYLEN TUNED_UNDORETENTION
------------------- ------------------- ----------- -------------------
...
26/10/2007 18:36:46 26/10/2007 18:46:46        9289               10188

Así que hay que poner un poco más de mimo en el UNDO. El tablespace ocupa 6 Gb. Teniendo en cuenta que la ocupación del ‘filesystem’ es del 56%:

[oracle@orael ~]$ df -h /bla/bla/bla/bla/undotbs01.dbf
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup01-LogVol02
                      289G  153G  122G  56% /bla

Nos podemos permitir:

carlos@db01.xxxxxx> alter system set undo_retention=10800 scope=both;

Sistema modificado.

… y volver a correr el monstruo de proceso ese.

Saludos.

Carlos.

Anuncios

2 respuestas a ORA-1555 y UNDO_RETENTION.

  1. […] un pesadísimo proceso en el que entran en juego varias tablas de muchos millones de filas y que me estaba volviendo loco, he conseguido reducir el tiempo total del proceso de unas 50 horas a sólo 3 horas y 45 […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: