ORA-01552: no se puede usar segm. rollback SYSTEM para tablespace ‘

En esta entrada de blog voy a intentar dar alguna solución a este error sobretodo para versiones antiguas de ORACLE. En versiones a partir de la 10G la solución estaría más basada en los tablespace de UNDO que en los segmentos de rollback propiamente dichos.

El error que suele aparecer es el siguiente:

Error de Java Gateway: JDBC Gateway SP execute(0) error 0:
 ORA-01552: no se puede usar segm. rollback SYSTEM para tablespace '<tablespace_afectado>' NO-SYSTEM

Donde … tablespace_afectado corresponderá al tablespace específico de tu BBDD.

Lo primero que tenemos que hacer es consultar el fichero de alertas del servidor Oracle. Normalmente ubicado en $ORACLE_HOME/oracle/admin/<SID>/bdump. El fichero de alertas suele llamarse alert_<SID>.log y almacena todos los movimientos y errores de la BBDD. Donde <SID> es el nombre de nuestra instancia.

Normalmente en esta ruta, se almacenan también los ficheros de traza que tienen la extensión.trc y almacenarán el error concreto de manera más específica que el fichero alert_<SID>.log.

En el caso que nos ocupa, el error aparecerá en el fichero de alertas, pero muy probablemente en el mismo fichero de alerta se nos indicará el nombre del fichero de traza que almacenará el error “origen” que ha provocado el error que finalmente vemos en el fichero de traza.

Por tanto, miraremos el fichero de alerta para encontrar el fichero de traza que miraremos posteriormente para averiguar “el nuevo error” o el “error origen” para ponerle remedio.

En el ejemplo siguiente vemos un posible  caso de lo que puede aparecer en el fichero de alerta:

FULL status of rollback segment 19 set.
ORA-1650: unable to extend rollback segment RBS9 by 128 intablespace RBS

Failure to extend rollback segment 10 because of 1650 condition
FULL status of rollback segment 10 set.
Thu Aug 22 14:04:52 2013
Errors in file /oracle/admin/<SID>/bdump/snp3_3448_p103.trc:
ORA-12012: error on auto execute of job 121
ORA-01552: cannot use system rollback segment for non-system tablespace '<tablespace_afectado>'

Lo siguiente sería consultar el fichero de traza que hemos visto en el de alerta….

Si nos fijamos en el ejemplo anterior, en negrita, tenemos el nombre del fichero de traza que nos detalla de manera más precisa el error que ha provocado la falta de espacio en los rollback segments: (snp3_3448_p103.trc).

Si miramos su contenido veremos algo como:

Unix process pid: 3448, image: oracle@h0514 (SNP3)
*** SESSION ID:(511.55794) 2013-08-12 14:25:26.821
*** 2013-08-12 14:25:26.821
ORA-12012: error on auto execute of job 101
ORA-01555: snapshot too old: rollback segment number 6 with name "RBS5" too small
ORA-06512: at "OPS$USUARIO.PROCEDIMIENTO", line 109

Este fichero nos informa del pid del proceso Unix por si tenemos que cancelarlo, el segmento de rollback afectado y el procedimiento, acción, función, etc… que se estaba ejecutando y que ha provocado el error. Esto lo usaremos para informar al usuario que lanza dicho proceso o a los desarrolladores de que es lo que está provocando la carga excesiva, por si es necesario, crear algún segmento de rollback especial para este proceso y especificarlo en la aplicación por medio del comando:

SQL> set transaction use rollback segment <nombre_tablespace_rollback>;

Pero la solución para evitar el error ORA_01552 sería ampliar con un datafile <tablespace_afectado> y revisar la contención, que los datafiles del tablespace del segmento de rollback tengan espacio y el parámetro OPTIMAL de los segmentos de rollback.

Para modificar el OPTIMAL de un segmento de rollback se hace:

ALTER ROLLBACK SEGMENT "RBS5" STORAGE ( OPTIMAL 4096K);

This entry was posted in Administración Oracle, ORA-????? and tagged , , , . Bookmark the permalink.

Deja un comentario