sábado, 21 de julio de 2012

11.03 GESTIONAR UNDO


Una características importante de los Segmentos UNDO es que son gestionado automáticamente, pero debe estableces los limites que Oracle va a gestionar. Después de considerar la naturaleza y el volumen de la actividad en su base de datos, se establece ciertos parámetros de la instancia y ajusta el tamaño de su Tablespace UNDO con el fin de alcanzar sus objetivos.

Condiciones de Error relacionados a UNDO.
Los principios son simples, primero, siempre debe haber suficiente espacio UNDO disponible para permitir  a todas las transacciones continuar, y segundo lugar, siempre debe ser suficiente  datos UNDO disponibles para todas las consultas para tener éxito. El primer principio requiere que su Tablespace UNDO debe ser lo suficientemente grande para acomodar el peor de los casos para demando Undo. Se debe tener suficiente espacio asignado para el el uso máximo de Datos Undo Activos generados por la carga de trabajo de transacciones. Tenga en cuenta que esto podría no ser  el mayor numero de transacciones concurrentes; podría ser que durante el funcionamiento normal tiene muchas transacciones pequeñas, pero el total de Undo que generan  puede ser menor que el generado  por un trabajo  por lote de fin de mes. el segundo principio requiere que haya espacio adicional en el Tablespace Undo para almacenar Datos Undo caducado que puede ser necesario para la consistencia de lectura.

Si una transacción se queda sin espacio UNDO, esta fallara con el error ORA-30036, “no se puede extender el segmento en el Tablespace Undo”. La declaración que origina el proble es hecha Roll Back, pero el resto de las transacciones se mantiene intactas y sin confirmar (uncommitted). El algoritmo que asigna espacio en el Tablespace Undo para segmentos Undo significa que esta condición de error solo se levantara si el Tablespace Undo está completamente lleno de Datos Undo Activos.

Si una consulta encuentra un Block que ha sido cambiado desde que comenzó la consulta, irá al segmento Undo a buscar la versión preupdate de los datos. Si, cuando va al segmento Undo, ese pedazo de Datos Undo ha sido sobrescrito, la consulta fallara en la lectura consistente con un famoso error ORA-1555 “snapshot too old”.

Si el tablespace Undo es insuficiente para el volumen de transacciones y la duración de las consultas, Oracle tiene la opción: ya sea que las transacciones de éxito y el riesgo de querys fallando con ORA-1555 o querys teniendo éxito y el riesgo de transacciones fallando con ORA-30036. El comportamiento por defecto es permitir que las transacciones tengan éxito para que puedan sobrescribir el Undo Expridado.
If the undo tablespace is undersized for the transaction volume and the length of queries, Oracle has a choice: either let transactions succeed and risk queries failing with ORA-1555 or let queries succeed and risk transactions failing with ORA- 30036. The default behavior is to let the transactions succeed, to allow them to overwrite unexpired undo.

Examen
Si una sentencia DML se queda sin espacio undo, la porción de ella que había tenido éxito será hecha rollback. El resto de la transacción se mantiene intacta y sin confirmar (uncommitted).

Parámetros para la Gestión de Undo y Garantizar la Retención.
Hay tres parámetros para controlar Undo: UNDO_MANAGEMENT, UNDO_TABLESPACE y UNDO_RETENTION.

UNDO_MANAGEMENT por defecto es AUTO con la versión 11g. Es posible establecerlo este a MANUAL, lo que significa que Oracle no utilizara segmentos Undo en todo.  Esto es para compatibilidad atrás, y si se utiliza esto, usted tendrá que hace una vasta cantidad de trabajo de crear y ajustar Segmentos RollBack, no lo hagas. Oracle Corporación recomienda configurar este parámetro a AUTO, apara habilitar el uso de Segmentos Undo. Este parámetro es Estático, esto significa que si es cambiado el cambio no surtirá efecto hasta que la instancia sea reiniciada. Los otros parámetros son dinámicos-puedan ser cambiados mientras la instancia está corriendo.
Si usted está usando UNDO_MANAGEMENT=AUTO usted también debe especificar UNDO_TABLESPACE. Este parámetro nomina un Tablespace, que debe haber sido creado como un Tablespace Undo, como los tablespace undo Activos. Todos los Segmentos Undo dentro del serán  traídos en línea (es decir disponible para su uso) de forma automática.
Por último, UNDO_RETENTION, establece en segundo, es generalmente opcional.  Especifica el objetivo para mantener inactivo Datos Undo y determina cuando se clasifica como expirado algo que no ha expirado. Si, por ejemplo, su larga consulta en ejecución es de treinta minutos, se establece el parámetro a 1800. Oracle intentara mantener todos los Datos Undo por al menos 1800 segundo y su consulta por lo tanto nuca fallara con ORA-1555. Si embargo, si no se establece este parámetro, o se establece en cero, Oracle todavía mantendrá los datos por largo tiempo mientras pueda.  El algoritmo de control que expiro los Datos Undo se seobrescribe primero siempre elige a sobrescribir el pedazo mas antiguo, UNDO_RETENTION es siempre el máximo permitido por el tamaño del Tablesapce.

The algorithm controlling which expired undo data is overwritten first will always choose to overwrite the oldest bit of data; therefore, UNDO_RETENTION is always at the maximum allowed by the size of the tablespace.

En el Trabajo
Algunas consultas pueden ser muy largas ejecutándose en realidad.  Consultas de varios días no son desconocidos. Usted necesitara un tablespace Undo de tamaño de Jupiter si se va ha ejecutar este tipo de consulta con éxito durante procesamiento norma.  Es posible que desee considerar limitar la carga de trabajo DML durante los recorridos largosinformes.

Donde el parámetro UNDO_RETENTION no es opcional es si ha configurado Undo para garantizar la retención (Guarantedd Undo Retention). El modo por defecto de operación para Undo es que Oracle favorece transacciones encima de consultas. Si el tamaño del Tablespace Undo es tal que una elección tiene que ser hecha entre la posibilidad  que una consulta falle con ORA-1555 y la certeza  de una transacción con ORA-30036, Oracle optara por permitir a la transacción continuar sobrescribiendo datos Undo que una consulta que podría necesitar. En otras palabras, la retención de Undo solo es un objetivo que oracle va a tratar de lograr. Pero puede haber circunstancias cuando consultas exitosas son consideradas más importantes que una transacción exitosa. Un ejemplo podría ser la facturación de fin de mes para obtener las utilidades, cuando podría ser aceptable para operaciones de riesgo de ser bloqueado por algunas horas mientras el reporte se está generando. Otro cso es si usted está haciendo uso de consultas flashback, que se basan en datos Undo.
Garantizar Undo Retention, significa que datos Undo nunca serán sobrescritos hasta el momento especificado por la retención de Undo haya pasado. Esta habilitado en el tablespace level. Este atributo puede ser especificado en el tiempo de creación del tablespace, o un tablespace undo puede ser modificado posteriormente para habilitarlo. Una vez que active un tablespace undo para el cual se ha especificado la garantía de retención. Todas las consultas se realizan correctamente, siempre que termine dentro del tiempo de Undo Retention; usted nunca tendrá errores “snapshot errors old” de nuevo. La desventaja es que la transacciones pueden fallar por falta de espacio Undo.

Si el parámetro UNDO_RETENTION ha sido establecido, y los datafiles que conforman el Tablespace Undo son establecidos a Autoextend, entonces Oracle incrementara el tamaño de los datafiles automáticamente si es necesario para mantener el Undo Retention. Esta combinación de garantizar Undo Retention y autoextend de datafiles significa que transacciones y consultas siempre serán exitosas-asiminedo que tiene suficiente espacio en disco. Si no la autoextension fallara.

Una base de datos podría tener un tablespace utilizado para operaciones normales donde undo retention no es garantizado y otro será usado durante el reporte de fin de mes donde la retencion  esta garantizada, tales sistemas pueden ser configurados asi,


Dimensionando y Monitoreo de Tablespace Undo
El tablespace debe ser lo suficientemente granda para almacenar  el peor caso de todos Undos generados por las transacciones concurrentes, que serán Undo Active, además de suficiente Undo Unexpired para satisfacer las consultas grandes en ejecución. En un entorno avanzado, es posible agregar espacion para permitir consultas flashback también. El algoritmo es simple: calcular la velocidad a la que se está siendo generando Undo en su hora pico y multiplicar por la duración de su consulta más larga. Hay una vista V$UNDOSTAT que le dice todo lo que necesita saber. También hay un asesor con el Database Control que presentara información de una manera inmediata y comprensible.

La figura 11-4 muestra la ventana de Gestión de Undo del Database Control. Para alcanzar esto, tomar la ficha server de la página principal de su base de datos, luego el Link Automatic Undo Management en la seccion Database Configuration.

La seccion de Configuracion de la pantalla muestra que el Tablespace Undo actualmente que está en uso es llamado UNDO1 y es de 100MB de tamaño, pero los datafiles para el tablesapce son autoextensibles. Haciendo su datafiles undo autoextensibles asegura que transacciones nunca se quedaran sin espacio, pero  Oracle no los extiende simplemente para cumplir con el objetivo UNDO_RETENTION, por lo que es todavía posible para una consulta a fallar con "snapshot too old". Sin embargo no debe confiar en la capacidad de autoextend. Su tablespace debería estar en el tamaño correcto para iniciar. El botón Change Tablespace emite un comando ALTER SYSTEM para activar un tablespace undo alternativo.





Más información dada en la ficha System Activity, mostrada en el Figura 11-5, dice que su pico de generación de Undo fue solo 1664KB por minuto, y la consulta más larga  fue de 25 minutos. El mínimo tamaño del Tablespace Undo será absolutamente seguro para prevenir errores, debería ser en kilobytes.

1664 * 25 = 40265

Que es algo más de 40M, Si el tamaño actual fuera menos, esto sería señalado en la sección de Undo Advisor. No ha habido errores en las transacciones causada por la falta de undospace, y no errores de consulta por falta de datos de deshacer.

Flashback Query.
Flashback query puede imponer exigencias adicionales sobre el Sistema Undo. Flashback query es un servicio que permite a los usuarios ver la base de datos como fue en un momento en el pasado. Hay varios metodos de realizar consultas flashback query, pero el mas simple es una sentencia SELECT con una clausula AS OF por ejemplo:

select * from scott.emp as of timestamp (systimestamp - 1/1440);

Esta declaración regresara todas las filas en la tabla SCOTT.EMP de hace 10 minutos. Las filas que se han eliminado se verán, filas que  se han insertado no se verán, y las filas que se han actualizado se verán con sus valores antiguos. Este es el caso si o no las sentencias DML han sido confirmadas. Para ejecutar una consulta flashback query, datos Undo son utilizados para hacer roll back todos los cambios: Las filas que han sido eliminadas son extraídas desde los segmentos undo e insertar de regreso en el resultado; filas que han sido insertadas son eliminadas del conjunto de resultados.
Esta sentencia trata de ver la taba como lo fue hace un día:

select * from scott.emp as of timestamp (systimestamp - 1);

La primera sentencia es probable tenga exito-esta segunda sentencia probablemente falle con un “snapshot too old” error. El fallo será porque los Datos Undo necesarios para reconstruir la versión de la tabla que fue de hace un día han sido sobrescritos.








Escenarios y Soluciones

A veces usuarios cometen errores terribles. Eliminar datos, hacer actualizaciones inapropiadas, se hacen dos veces las cosas no una vez, y asi sucesivamente ¿Que consideraciones deben ser tomadas para corregir estos errores?
Existen varios enfoques para la corrección de errores del usuario. El más drástico es una "recuperación incompleta", que pone la base de datos al estado en que se encontraba antes del error, pero esto va a perder todo el trabajo realizado posteriormente y puede tardar un tiempo (long) tiempo. Un "flashback de base de datos" tiene el mismo resultado, pero será mucho más rápido. Una consulta de flashback a menudo la mejor solución, pero tendrás que ser rápido, o los datos de deshacer se han expirado.

Como se puede asegurar que ninguna consulta nunca fallara por problemas de undo.
Vas a tener que trabajar el tiempo de la consulta es el mas largo. En cuanto a la columna MAXQUERYLEN de la vista $UNDOSTAT ayudara. Establecer el parámetro UNDO_RETENTION por lo menos a este valor. A continuación. Establezca a autoextent los datafiles Undo Tablespace y habilite RETENTION GUARANTEE para el tablespace. Pero recuerde que esto plantea la posibilidad de llenar el espacio en disco, que puede tener resultados desastrosos. Usted debe controlar la situación.

Flashback query puede ser una herramienta valiosa. Por ejemplo, si debido a algún error una eliminación ha ocurrido en algún momento de la ultima hora, este comando reversa mediante la inserción todas las filas eliminadas de regreso a la tabla.

insert into scott.emp
(select from * scott.emp as of timestamp (systimestamp – 1/24)
minus
select * from scott.emp);

Si el flashback  query es probablemente que se usado, entonces el sistema Undo debe estar configurado para manejar, al establecer el parametro UNDO_RETENTION a un valor apropiado. Si desea que la capacidad de flash back query de un día, se debe establecer a 86400 segundos. El tablespace undo debe ser del tamaño adecuado. Entonces para estar seguros del éxito. O bien permitir la extension automatica para los datafiles del tablespace undo o habilitar la retention guarantee para el tablaspace.

Creando y Gestionando Tablespace Undo.
Hasta ahora la gestión  de datafiles se refiere, un tablespace undo es lo mismo como cualquier tablepace: archivos pueden ser agregados, ajustados de tamaño, tomados online y offline, movido o renombrado. Pero no es posible especificar cualquier opción de almacenamiento: usted no puede especificar automatic segment space management, usted no puede especificar un uniform extent size. Para crear un tablespace utilice la palabra UNDO:

CREATE UNDO TABLESPACE tablespace_name
DATAFILE datafile_name SIZE size
[ RETENTION NOGUARANTEE | GUARANTEE ] ;

Por default, el tablespace no garantiza undo retention. Esta características pueden ser pueden ser especificadas en el momento de creación del tablespace o establecerlas posteriormente.

ALTER TABLESPACE tablespace_name
retention [ GUARANTEE | NOGUARANTEE ] ;

no es posible crear segmentos en un tablespace undo, con excepción que los segmentos undo que serán creados automáticamente. Inicialmente, habrá un pool de 10 segmentos undo creados en un tablespace undo. Mas serán creados si hay mas  de diez transacciones concurrentes. Oracle monitora la velocidad de transacciones concurrentes y ajusta el numero de segmentos necesarios.
No importa cuantos tablespace undo pueda haber en una base de datos,  en general solo uno estará en uso a la vez. Los segmentos Undo en este tablespace tendrán un estatus online (lo que significa que esta disponible para su uso); los segmentos en cualquier otro tablespace tendrá estatus offline, lo que significa que no serán utilizados. Si el tablespace undo es cambiado, todos los segmentos undo en el viejo tablespace serán hechos offline, y los del nuevo tablespace undo seran hechos online. Hay dos excepciones para esto:

•                     En una base de datos RAC, cada instancia que abre las base de datos debe tener su propio tablespace undo. Esto puede ser controlado con el ajuste del parametro UNDO_TABLESPACE a un valor diferente para cada instancia. Cada instancia aportara su propios segmentos undo en linea.
•                     Si el tablespace undo es cambiado mediante el parametro UNDO_TABLESPACE, cualquier segmento en el tablespace que estaba soportando una transacción en el momento del cambio permanecerá online hasta que la transacción finalice.


Examen.
Salvo especifique en tiempo de creación en la clausula del Datafile, el datafile de un tablespace undo no se establecerá a autoextend. Pero si su base de datos es creada con el DBCA, permitirá la extensión automática del datafile del tablespace undo con un maximo de ilimitado. Extension automática puede ser habilitada o des habilitada en cualquier momento ya que puede ser de cualquier archivo de datos.

Ejercicio 11-3
Trabajr con Tablespace Undo.
In this exercise, you will create an undo tablespace with Database Control, and then verify the configuration with SQL*Plus.
1. Connect to your instance as user SYSTEM with Database Control.
2. From the Server tab, in the Storage section take the Tablespaces link.
3. Click Create.
4. Enter UNDO2 as the tablespace name, and set the radio buttons for Locally Managed, Undo, and Read Write.
5. At the bottom of the screen, click Add to specify a datafile.
6. Enter UNDO2-01.DBF as the File Name, leave everything else on default, and click Continue.
7. On the Create Tablespace screen, click Show SQL, and study the statement used to create your undo tablespace. Click Return to return to the Create Tablespace screen, and click OK to create the tablespace.
8. Connect to your instance as user SYSTEM with SQL*Plus.
9. Run this query, which will return one row for each tablespace in your database: select tablespace_name,contents,retention from dba_tablespaces;
Note that your new tablespace has contents UNDO, meaning that it can only be used for undo segments, and that retention is NOGUARANTEE.
10. Run this query, which will return one row for each rollback or undo segment in your database:
select tablespace_name, segment_name, status from dba_rollback_segs;
Note that a number of undo segments have been created automatically in your new undo tablespace, but that they are all offline.
11. Adjust your instance to use the new undo tablespace. Use a SCOPE clause to ensure that the change will not be permanent:
alter system set undo_tablespace=undo2 scope=memory;
12. Rerun the query from Step 9. You will see that the undo segments in the new tablespace have bee brought online, and those in the previously active undo tablespace are offline.

Dentro del Examen.
La base de datos oracle implementa atomicidad, aislamiento y lecturas consistentes de transacciones a través del uso del segmento undo. Los viejos segmentos rollback(y un segmento rollback siempre existirá, utilizando cuando se crea la base de datos) pueden ser todavía utilizados, pero esto es muy mala practica.
Segmentos undo son creados automáticamente en un tablespace undo: un tablespace no puede contener otro tipo de objeto. La base de datos crea segmentos undo sobre demanda, tratando de coincidir el numero de segmentos  con el numero de transacciones concurrentes. Cada segmento se expande cuando sea necesario  para dar cabida a su transacción. Como DBA todo lo que necesita es asegurar que e tablespace undo es suficientemente grande para la carga de trabajo.
La gestión  automática  del mecanismo undo por default a favor de querys. Si un tablespace undo es insuficiente, transacciones continuaran incluso hasta que se tiene que sobrescribir undo expirado, por lo tanto correr el riesgo de fracaso con el error ora-1555 “snapshot too old”. Este comportamiento  puede ser modificado para garantizar qie las consultas tengan éxito, tal vez el riesgo de fallo de transacciones.
Monitorear el uso de Undo es simple atraves del database control undo advisor o mediante la vista v$undostat.



Resumen de Certificación.
Undo data se genera para permitir la atomicidad de transacciones, consistencia en lectura y aislamiento de transacciones. La base de datos oracle garantiza la integridad transaccional absoluta, pero no necesariamente una coherencia de lectura. Si el sistema undo no es apropiadamente configurado, las consultas pueden fallar debido a la falta de datos undo, pero si una consulta tiene éxito sera coherente.
Este comportamiento puede ser modificado, permitiendo la RETENTION GUARANTEE, aunque esto pueda significar que transacciones fallen. Datos undo son almacenados en un tablespace undo contiene segmentos undo gestionados y creados automáticamente. Puede haber más de un tablespaces de deshacer en una base de datos, pero sólo uno estará en uso en un momento dado, esto es controlado por un parámetro de instancia dinámica, UNDO_TABLESPACE.



Dos minutos.
Explicando el Propósito de Undo
·                    Todas las sentencias DML generan Datos Undo.
·                    Datos Undo son utilizados para hacer Rollback a transacciones y aislamiento y para proporcionar lecturas consistentes y también para consultas Flashback.
·                    Gestión automática de Undo utilizando Segmentos Undo es por defecto con la versión 11g.
Entender como las Transacciones Generan Undo.
·                    Datos Undo siempre serán mantenidos hasta que la transacción que los genero sea completada con un COMMIT o un ROLLBACK. Esto es Undo Activo.
·                    Datos Undo serán retenidos por un periodo después de convertirse en Inactivo para satisfacer cualquier requisito de lectura consistente  de consultas largar.
·                    Undo Expirado son datos que ya no se necesitan para lecturas consistentes y puede ser sobrescrito en cualquier momento como espacio reutilizado en segmentos Undo.
Gestionar Undo.
·                    Una instancia utilizara segmentos undo en un tablespace undo.
·                    Mas tablespace undo puede existir, pero solo uno será utilizado a la vez.
·                    El tablespace undo deberá ser grande para almacenar el promedio máximo de undo generado y la consulta mas grande.
·                    Datafiles de Tablespace son datafiles como cualquier otro.


No hay comentarios:

Publicar un comentario