Utilizamos cookies propias y de terceros. Al navegar entendemos que aceptas el uso de cookies. +Info.
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki
Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - Error ORA-01555 en Oracle 9i y aplicación de facturación
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information Error ORA-01555 en Oracle 9i y aplicación de facturación

Publicar nuevo tema Responder al tema
Foros de discusión » Oracle Database, motor de base de datos profesional   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Error ORA-01555 en Oracle 9i y aplicación de facturación Responder citando

He desarrollado una aplicación de facturación. Como base de datos utilizo Oracle Database 10g. La aplicación funciona perfectamente, salvo cuando ejecuto unos procesos de actualización que afectan a cientos de miles de registros, en este caso me aparece este error de Oracle:

ORA-01555: snapshot too old: rollback segment number 4 with name "_SYSSMU4$" too small

Y no acaba el proceso.

Como digo, funciona todo en la aplicación salvo cuando ejecuto consultas que afectan a muchos registros ¿a qué puede ser debido? soy desarrollador por no DBA de Oracle, sobre Oracle no tengo muchos conocimientos.
MensajePublicado:
Jue Feb 05, 2009 7:35 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Error ORA-01555 en Oracle 9i y aplicación de facturación Responder citando

varios escribió:
He desarrollado una aplicación de facturación. Como base de datos utilizo Oracle Database 10g. La aplicación funciona perfectamente, salvo cuando ejecuto unos procesos de actualización que afectan a cientos de miles de registros, en este caso me aparece este error de Oracle:

ORA-01555: snapshot too old: rollback segment number 4 with name "_SYSSMU4$" too small

Y no acaba el proceso.

Como digo, funciona todo en la aplicación salvo cuando ejecuto consultas que afectan a muchos registros ¿a qué puede ser debido? soy desarrollador por no DBA de Oracle, sobre Oracle no tengo muchos conocimientos.


Este error puede ser debido a que no tienes correctamente dimensionados los segmenos de desahacer (rollback segment) en Oracle.

En primer lugar, para poder ayudarte, necesitamos saber qué método de deshacer utilizas en tu base de datos Oracle. Esto lo puedes averiguar ejecutando con SQL*Plus de Oracle el comando SQL:

Código:

show parameter undo_management


Si te devuelve "AUTO" querrá decir que es Oracle quien gestionará los segmentos de anulación de forma automática (SMU ó System-Managed Undo). Si está AUTO Oracle necesitará un espacio de tablas (tablespace) de tipo deshacer. Para saber cómo se llama el tablespace asignado para este propósito podremos ejecutar la siguiente consulta SQL:

Código:

show parameter undo_tablespace


Y con este otro parámetro podremos saber el valor del parámetro undo_retencion que sirve para indicar a Oracle el tiempo (en segundos) que mantendrá los datos en el UNDO (es algo más complicado que esto):

Código:

show parameter undo_retention


El valor por defecto para este parámetro es 900 segundos (15 minutos).

El valor óptimo de este parámetro se puede calcular con la siguiente fórmula:

Código:

                              tamaño actual del tablespace UNDO
UNDO_RETENTION = ----------------------------------------------------
                             tamaño bloque * bloques por segundo


A continuación te explicamos cómo obtener cada uno de lo valores anteriores:

* tamaño actual del tablespace UNDO:
Código:

SELECT SUM(a.bytes) "Tamanio_UNDO"
FROM v$datafile a, v$tablespace b, dba_tablespaces c
WHERE c.contents = 'UNDO' AND c.STATUS = 'ONLINE'
    AND b.name = c.tablespace_name AND a.ts# = b.ts#


* tamaño bloque
Código:

SELECT TO_NUMBER(value) "Tamanio_Bloque"
FROM v$parameter
WHERE name = 'db_block_size';


* Bloques por segundo
Código:

SELECT MAX(undoblks/((end_time-begin_time)*3600*24)) "Bloques_segundo"
FROM v$undostat



En una base de datos en producción, como ejemplo:

UNDO_RETENTION (óptimo) = 5242880000 / (8192 * 16,0666666666667) = 39834,024 segundos

La consulta SQL completa que devuelve el valor óptimo para el parámetro UNDO_RETENTION:

Código:

SELECT d.undo_size/(1024*1024*1024) "Actual Tamanio_Undo (GB)",
    SUBSTR(e.value,1,25) "Actual UNDO_RETENTION (Seg.)",
       ROUND((d.undo_size / (to_number(f.value) *
       g.undo_block_per_sec))) "UNDO_RETENTION optimo (Seg.)"
  FROM (
       SELECT SUM(a.bytes) undo_size
        FROM v$datafile a, v$tablespace b, dba_tablespaces c
        WHERE c.contents = 'UNDO' AND c.STATUS = 'ONLINE'
            AND b.name = c.tablespace_name AND a.ts# = b.ts#
  ) d, v$parameter e, v$parameter f, (
      SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
          undo_block_per_sec
      FROM v$undostat
  ) g
  WHERE e.name = 'undo_retention'
  AND f.name = 'db_block_size'


Nota: esto no es aplicable a todas las bases de datos, dependerá de otros muchos factores (uso que se le esté dando, etc.).
MensajePublicado:
Mar Feb 10, 2009 7:37 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Error ORA-01555 en Oracle 9i y aplicación de facturación Responder citando

Con lo explicado en el post anterior, te puedes hacer una idea del valor que debería tener el parámetro UNDO_RETENTION, para cambiarlo:

Código:

ALTER SYSTEM SET UNDO_RETENTION=1000;


Con lo anterior indicamos a Oracle que el valor del parámetro UNDO_RETENTION será de 1000 segundos.

Oracle te permite, incluso, hacer un cálculo aproximado del tamaño que debería tener tu tablespace UNDO. Lógicamente si dispones de espacio en disco suficiente este tablespace puede estar sobredimensionado e ir aumentándolo en caso necesario. Pero si tienes poco espacio en disco o quieres optimizar el espacio esta es la consulta que te obtiene el tamaño óptimo para el tablespace UNDO:

Código:

SELECT d.undo_size/(1024*1024*1024) "Actual Tamanio_Undo (GB)",
    SUBSTR(e.value,1,25) "Actual UNDO_RETENTION (Seg.)",
    (TO_NUMBER(e.value) * TO_NUMBER(f.value) *
    g.undo_block_per_sec) / (1024*1024*1024)  "Tamanio_Undo óptimo (GB)"
  FROM (
      SELECT SUM(a.bytes) undo_size
      FROM v$datafile a, v$tablespace b, dba_tablespaces c
      WHERE c.contents = 'UNDO' AND c.STATUS = 'ONLINE'
           AND b.name = c.tablespace_name AND a.ts# = b.ts#
  ) d, v$parameter e, v$parameter f,
  (
    SELECT MAX(undoblks/((end_time-begin_time)*3600*24)) undo_block_per_sec
    FROM v$undostat
  ) g
  WHERE e.name = 'undo_retention' AND f.name = 'db_block_size'
MensajePublicado:
Mar Feb 10, 2009 7:45 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Error ORA-01555 en Oracle 9i y aplicación de facturación Responder citando

Con lo anterior pretendemos que veas cómo configurar la administración de transacciones. Obviamente el hecho de aumentar el valor del parámetro UNDO_RETENTION no te garantiza que te pueda volver a dar el error:

ORA-01555: snapshot too old: rollback segment number 4 with name "_SYSSMU4$" too small

Pero es muy probable que ajustando correctamente estos valores consigas arreglarlo.

Comentarte también, que se nos ha olvidado anteriormente, el segundo método de desahacer cambios que es MANUAL, si tienes el parámetro undo_management con el valor MANUAL indica que Oracle no gestionará de forma automática y serán los segmentos de anulación los encargados de deshacer los cambios, NO se utilizará el tablespace UNDO. Si lo tienes manual será más complicada su administración. En Oracle 9i este parámetro tiene el valor MANUAL por defecto, cambiarlo a automático es relativamente fácil, ejecutando la siguiente consulta:

Código:

alter system set undo_management=auto scope=spfile;


Tendrás que comprobar que tienes un tablespace UNDO, sino tendrás que crearlo con un comando como este:

Código:

CREATE UNDO
    TABLESPACE "UNDO"
    DATAFILE 'd:/bd/oracle/undo/UNDO.dbf' SIZE 500M


He indicarle a Oracle que a partir de ahora el tablespace UNDO por defecto será el creado con la siguiente consulta SQL:

Código:

ALTER SYSTEM SET UNDO_TABLESPACE=UNDO


Es conveniente, para que los cambios tengan efecto, detener e iniciar la base de datos.

Tras realizar estos pasos es recomendable dejar un tiempo funcionando Oracle (unos días), a continuación tendrás que reajustar el valor por defecto del parámetro UNDO_RETENTION con las consultas que te hemos explicado anteriormente.
MensajePublicado:
Mar Feb 10, 2009 7:56 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Error ORA-01555 en Oracle 9i y aplicación de facturación Responder citando

El resumen de todo, por si no tienes conocimientos de DBA y no quieres liarte demasiado, es que pruebes a aumentar el parámetro UNDO_RETENTION, tras aumentarlo (como te hemos explicado anteriormente), detén y vuelve a iniciar la base de datos y prueba a ejecutar esa consulta que te daba el error: ORA-01555. Sin te da el error ¡¡estupendo!!, si te da el error vuelves a aumentarlo otro poco y así sucesivamente.
MensajePublicado:
Mar Feb 10, 2009 7:58 pm
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » Oracle Database, motor de base de datos profesional  

Cambiar a:  
Key
  Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A