martes, 9 de agosto de 2011

UNDO SEGMENT TUNING & DEFINICION


INTRODUCCION

A partir de la versión 9i de Oracle el UNDO SEGMENT entró a reemplazar a los ROLLBACK SEGMENTS que cumplían con la misma tarea, pero el UNDO SEGMENTS necesita de menor administracion que los ROLLBACK SEGMENT.  Esto es gracias a que el UNDO SEGMENT tiene una gestión automática.

Por que usar UNDO SEGMENT en vez del ROLLBACK SEGMENT?
Oracle siempre busca a la gestión automática de estos segmentos y esto se logra gracias a la gestión automática del UNDO SEGMENT, indicando cual es el tablespace UNDO para cada instancia de base de datos. Con los ROLLBACK SEGMENT hay que definir cada uno de estos segmentos para cada tablespace.


La tarea del UNDO SEGMENT es garantizar la integridad de los datos que son:

o   Transaction Rollback( Deshacer transacciones): Guardar en el UNDO SEGMENT los regisros de datos antes de la modificación. Si la transacción es deshecha (Rollback)  los registros se restablecen con la imagen  almacenada en el UNDO SEGMENT para revertir los cambios no confirmados.

o   Transaction Recovery( Recuperación de transacciones) : Esto en los caso de que la base de datos Oracle falla, todas las transacciones en progreso y no confirmadas deben de revertirse.

o   Read Consistency( Lectura Consistente): Oracle mantiene el concepto de lectura consistente y esto consiste en que muchos usuarios están accesando simultáneamente a los datos. Cada sesión de usuario no presentara a las demás sesiones de usuarios los cambios realizado de los datos hasta que los confirme (commit). De esto se trata la consistencia, mantener oculto las modificaciones de datos a las demás sesiones de usuarios hasta que las confirme.

o   Apoya a la generación de consultas SQL complejas que necesitan crear temporalmente bloques de datos en el UNDO_SEGMENT. Si tenemos un reporte o consulta muy compleja que necesita de mucha información, Oracle se apoyará del UNDO_SEGMENT para armar el set de información requerido.

Lectura consistente de datos
 En la imagen "Lectura consistente de datos", se muestra cuando una sesion de usuario realiza modificaciones a la tabla employee, en la tabla se realiza el cambio realizado por el update, pero antes se saca una imagen del dato (Undo image) para almacenarlo en el UNDO SEGMENT, las demas sesiones de usuarios que intenten accesar a los datos de la tabla employee no leeran los datos modificados en la tabla si no de la imagen almacenda en el UNDO SEGMENT, esto se realizara hasta que la sesion que modifique realice un commit o rollback. 
Si se realiza un commit, se liberará el segmento de UNDO usado.
Si se realiza un rollback, se reversará el cambio realizado en la tabla employee copiando la imagen respaldada en el UNDO SEGMENT a la tabla y posterior a eso se liberar el segmento de UNDO usado.

ADMINISTRACION AUTOMATICA DEL UNDO

Crear el tablespace tipo UNDO.
CREATE UNDO TABLESPACE UNDOTBS2
DATAFILE '+DATA' SIZE 12400M
AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
ONLINE;

UNDO_MANAGEMENT
Hay que cambiar la configuración a gestión automática la administración del UNDO, esto se logra cambiando el parámetro de base de datos UNDO_MANAGEMENT;
ALTER SYSTEM SET UNDO_MANAGEMENT =AUTO SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;

UNDO_TABLESPACE
Configurar cual es el tablespace UNDO.
ALTER SYSTEM SET UNDO_TABLESPACE =UNDOTBS2 SCOPE=BOTH;

UNDO_RETENTION
Este parámetro viene configurado por defecto con 900 (15 minutos ) medido en segundos y especifica el tiempo que el segmento perdurará en el UNDO SEGMENT antes de ser liberado para ser reutilizado.

TUNEA LOS PARAMETROS DEL UNDO SEGMENT.

Cuáles son los parámetros ideales?
No existe una configuración inicial perfecta con la que podamos iniciar, pero si podemos afinarla con el transcurso del tiempo y es una tarea del DBA obtener el valor optimo para el mejor desempeño de la base de datos.

NOTA: Estas evaluaciones, deberán realizarse después de un periodo de operación de la base para que las estadiscas tengan la suficiente información como para dar un resultado adecuado. Esto por los casos en que es una base de datos que arranca su operación y se quiera estimar estos valores.

Cuál es el valor ideal para el UNDO_RETENTION?
Para esto podemos usar la siguiente fórmula:

Fórmula para determinar cual es el valor ideal para el UNDO_RETENTION

ALTER SYSTEM SET UNDO_RETENTION =300 SCOPE=BOTH;

Donde:
ACTUAL TAMAÑO DEL UNDO
SELECT SUM (a.bytes) / 1024 / 1024 "MB TAMAÑO ACTUAL 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#;

UNDO_BLOCK_PER_SEC: Cantidad de bloques undo que se transfieren por segundo
SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
      "UNDO_BLOCK_PER_SEC"
  FROM v$undostat; 

DB_BLOCK_SIZE: Tamaño del bloque de datos que maneja la base.
SELECT TO_NUMBER(value) "DB_BLOCK_SIZE KB"
 FROM v$parameter
WHERE name = 'db_block_size';

VALOR OPTIMO PARA EL UNDO RETENTION
SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE MB",
       SUBSTR(e.value,1,25) "ACTUAL UNDO RETENTION [Sec]",
       ROUND((d.undo_size / (to_number(f.value) *
       g.undo_block_per_sec))) "SUGERIDO UNDO RETENTION [Sec]"
  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'

Cuál es el tamaño ideal para el tablespase UNDO?
Fórmula para determinar el tamaño ideal del UNDO TABLESPACE
 Se deberá modificar el tamaño del tablespace con el valor recomendado.
SELECT d.undo_size/(1024*1024) "TAMAÑO ACTUAL UNDO MB",
       SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]",
       (TO_NUMBER(e.value) * TO_NUMBER(f.value) *
       g.undo_block_per_sec) / (1024*1024)
      "TAMAÑO UNDO NECESARIO MB"
  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'

Si el valor recomendado es menor al tamaño actual, estara a criterio del DBA disminuir el tamaño o en su defecto aumentar el UNDO_RETENTION, por que a mayor tamaño de lo necesario, mayor tiempo de retención podemos especificar.

ERRORES QUE SE PUEDEN PRESENTAR RELACIONADOS CON EL UNDO SEGMENT.

ORA-30036: Unable to extend segment by nombre_segmento in undo tablespace nombre_tablespace

CAUSA
Este error pasa cuando el tamaño del UNDO TABLESPACE se agotó y no se pueden crear nuevos segmentos.
El parámetro UNDO RETENTION tiene un valor muy elevado que no deja liberar los segmentos del UNDO_SEGMENT para que sean reutilizados.

SOLUCION
Aumentar el tamaño al UNDO TABLESPACE y como recomendación habilitar el AUTO EXTENT con un valor  del 10% de tamaño del tablespace.
Analizar el tamaño del UNDO_RETENTION y evaluar disminuir el tamaño.

ORA-30019:  Illegal rollback segment operation in Automatic Undo mode

CAUSA
Esto ocurre cuando tratamos  con ROLLBACK SEGMENT en bloque PL/SQL (Es una programación antigua donde se usa el comando “SET TRANSACTION USE ROLLBACK SEGMENT”) y la base de datos Oracle está configurada  en administración automática del UNDO.

SOLUCION
Oracle permite coexistir al UNDO SEGMENT y el ROLLBACK SEGMENT para mantener la compatibilidad con versiones anteriores de Base de datos, pero para esto se deberá configurar el parámetro de base de datos UNDO_SUPPRESS_ERRORS=TRUE.
Si no desea realizar esta configuración, se debera cambiar la linea de código que hace el seteo del ROLLBACK SEGMENT.

ORA-1555 snapshot too old

CAUSA
Esto ocurre cuando Oracle no puede lograr una lectura consistente de los datos. Alguna sesión trata de accesar a datos que deberían encontrarse en la UNDO SEGMENT, pero no los encuentra.

SOLUCION
Se deberá evaluar el valor con el que se deberá aumentar el UNDO_RETENTION para poder mantener la lectura consistente.

1 comentario: