Snapshot too old

Tengo un proceso en oracle 9.2, que si lo ejecuto solo el, no me da el error ORA-01555: snapshot too old: rollback segment number 5 with name "_SYSSMU5$" too small, en cambio si lo ejecuto dentro de la cadena de procesos me da este error.

1 Respuesta

Respuesta
1
Tienes muchas consultas en tu BD que tardan mucho o son mulla grandes y vienes haciendo commit al final de todo. Aumenta el UNDO_RETENTION el doble y optimiza el proceso que está dando el error.
He visto que tengo el parametro undo_management = AUTO.
El resultado de la query me da el siguiente valor 49397 y yo tengo el parametro undo_retention = 1800.
También tengo el datafile del Undo en autoextend.
Lo que no entiendo realmente es lo siguiente:
¿Por qué se produce este error, es de programación?
Supongo el valor resultado de la query 49397 serán segundo, ¿No será demasiado?
Gracias por el tiempo que me estas dedicando
Saludos.
Es raro ver este error en 9i, eso debería ser cosa del pasado con 8i. Contestame algo:
1.- ¿Estas usando Tablespace UNDO en vez de Rollback Segment?
2.- ¿Tus tablespaces son manejados localmente o por diccionario?
Con la anterior información te podré ayudar.
1.- El tablespace de Undo. Aunque he observado desde el enterprice manager que tengo dentro de Almacenamiento el apartado Segmentos de Rollback y dentro SYSTEM.
2.- Los tablespaces están manejados localmente.
Espero que te sirva
Gracias
Ok, si todo fue instalado bien, de seguro tu BD se encuentra en Automatic Undo Management, por lo tanto:
1.- Conectate como System o Sys y ejecuta:
select max(maxquerylen) from v$undostat;
2.- Verifica el valor del parámetro de UNDO_RETENTION
show parameter undo_retention
3.- Si el valor anterior es menor al resultado de la consulta, entonces modifica el parámetro con el valor que recibiste de la consulta.
4.- Debes aumentar el tamaño del tablespace UNDO y colocar su datafile en autoextend = ON
Si tienes duda del último punto me avisas ya que requiere explicación detallada, de igual manera existe una fórmula sencilla para un cálculo aproximado del tamaño ideal del UNDO.
El manejo del UNO es automático y transparente, toda transacciónd MDL que incurra en cambio del dato, guarda un before image en los UNDOS (Memoria) y las transacción en los Redo Logs.
Cuando haces commit, el dato viejo permanece allí hasta tanto el RDBMS decida cuando liberarlo, ahora desde 9i en adelante, permanece más tiempo por razones del flahsback query, el undo retention, etc.
No te recomiendo dentro de un cursor hacer commit por cada registro, porque tirás al suelo el proceso de lo lento e ineficiente que sería. Sin embargo, debes manejarlo al final después de cerrar el cursor. Si tu transacción es en lotes y por lo tanto muy grande, debes aumentar el tamaño del tablespace UNDO y hacer commit intercalados después de cada cursor (preferiblemente utiliza cursores implícitos) o dividir la dada en sectores según un criterio lógico, etc.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas