Browse Category: ora-

ora-00020: maximum number of processes (%s)

En esta nueva entrada vamos a ver cómo solucionar el error ORA-00020: maximum number of processes (%s) exceded, el cuál nos impide conectar a la Base de Datos. Hay un post muy bueno de Tanel Poder donde nos explica muy bien cómo conectar a la Base de Datos para incrementar los procesos “How to log on even when SYSDBA can’t do so?“.

Errores Obtenidos

ora-12520

Lo primero que llamó mi atención es que al intentar conectar a la Base de Datos conseguí el siguiente error:

ora-12520
ora-12520

ora-00020

Después de revisar el tnsnames, intentar entrar varias veces y seguir con el error ora-12520 intenté entrar como sysdba y conseguí el siguiente error:

ora-00020
ora-00020

Como hemos excedido el número máximo de procesos no podemos conectar ni como sysdba, para lo que yo pensaba que tendríamos alguna conexión reservada. Ante esto leí el post de Tanel Poder  citado anteriormente y vi que podría utilizar la siguiente opción -prelim para “conexiones preliminares” y saltarme ciertos pasos realizados al conectar a sql*plus. Estos pasos llevados a cabo cuando conectamos a sql*plus son los siguientes:

  1. A new Oracle process is started (either by the listener or by local sqlplus if using the local BEQ connection)
  2. The new process attaches to SGA shared memory segments (so it could access all the needed SGA structures)
  3. The new process allocates process and session state objects and initializes new session structures in SGA

Con la opción -prelim sólo se llevan a cabo los pasos 1 y 2, con lo cuál pude acceder a la consola y reiniciar la Base de Datos, sin tener que tirar el servicio de Windows o matar el proceso directamente:

prelim
prelim

Una vez dentro pude ejecutar un shutdown abort (no me dejó realizar un shutdown immediate), salir y volver a iniciar la instancia:

shutdown
shutdown
connect
connect

Una vez conectados lo que hice fue incrementar el parámetro processes para que no me vuelva a ocurrir el mismo error. Posteriormente reinicié la instancia para que se llevaran a cabo los cambios e inicié la instancia de nuevo:

processes
processes

 

startup
startup

 

 

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