jump to navigation

Oracle – Evitar los Errores ORA-1555

Fuente: http://www.ixora.com.au/tips/admin/ora-1555.htm

 Uno de los problemas más molesto que Oracle DBA en todo el mundo se enfrentan todos los días es la siguiente:

    ORA-1555: Imágenes demasiadas viejas: Número de reversión segmento 9 con el nombre “R07” demasiado pequeño.

Para la mayoría de los DBA no está nada claro lo que podría haber causado el error, e incluso más sorprendente en cuanto a cómo pueden prevenir que ocurra de nuevo. Pero quizás la cosa más exasperante acerca de este error es que las consultas son más propensas a ella cuando han estado funcionando durante mucho tiempo, y por lo tanto muchas horas de procesamiento se pueden perder.

La buena noticia es que es fácil de evitar este error total y absolutamente.

Si el bloque se ha modificado en modo alguno por otra transacción, entonces los cambios se deben deshacer para que sea coherente. Para ello, es necesario leer los datos por segmentos para deshacer a los que la información de reversión de esos cambios fueron escritos.

Sin embargo, si cualquiera de estos cambios fueron hechos por una operación discreta, entonces no habrá ninguna información de reversión, porque las transacciones discretas no generan información para deshacer. Si es así, un error ORA-1555 se incrementará. Del mismo modo, un error ORA-1555 se incrementará si los bloques de reversión requiere segmento que ya no están disponibles debido a que la medida del segmento de cancelación que contenga dichos bloques se haya desasignado en una operación de reducción, o reutilizados por las operaciones posteriores.

Tenga en cuenta que los bloques segmento de cancelación requeridos son los que fueron utilizados por otras operaciones que han modificado el bloque después de la instantánea SCN. Estos bloques pueden estar en cualquier segmento de cancelación en la base de datos.

Tenga en cuenta además que, en esos bloques no esté disponible en virtud de la reutilización medida, todas las extensiones en ese segmento de cancelación se debe haber sido utilizada al menos una vez desde el NSQ instantánea. Por ello, el mensaje de error indica que el segmento de cancelación es demasiado pequeño.

-Si es necesario, añadir segmentos adicionales para deshacer más espacios y hacer transacciones disponibles.

Tenga en cuenta que la adición de segmentos para deshacer de algo extra en conflicto con el uso de un gran tamaño óptimo, asumiendo que el espacio en el disco disponible para los segmentos para deshacer es invariante. La elección de una estrategia en este punto debiera depender del riesgo relativo de tener fracasos de coherente reversión, en lugar de obtener coherente fracasos de limpieza.

prevent_1555_setup.sql

    Esta secuencia de comandos crea una tabla agrupada en el esquema de sistema que se utiliza para implantar y registrar la protección de los segmentos para deshacer de extensión y de la reutilización.

 –prevent_1555.sql

   Esta es la secuencia de comandos principales. Está es llamada para garantizar la protección de errores Ora-1555 de un número determinado de segundos. Este comando llama protect_rbs.sql en el fondo de cada segmento de cancelación en línea.

-protect_rbs.sql

    Esta secuencia de comandos contrae el primer segmento de cancelación especificada para reducir el riesgo de quedarse sin espacio en el segmento de las tablas. A continuación, deja constancia de su protección en el control de tablas, antes de salir de una transacción no comprometidos para el descanso de la cantidad necesaria de segundos.

prevent_1555_wait.sql

    Esta secuencia de comandos se debe ejecutar después de las operaciones ficticias se han creado en cada segmento de cancelación en línea. Se espera que todas las transacciones activas finalicen. Esto es necesario en entornos con otras transacciones de larga ejecución que aún no ha terminado, porque antes deshacer esas transacciones no está protegida y podría ser requerida por el informe crítico a menos que estas operaciones se les permite terminar antes del inicio del informe crítico.

protected_rollback_segs.sql

    Esta secuencia de comandos se utiliza para informar el estado de protección de los segmentos para deshacer.


Conclusión

Leonardo Adrián Tocci – 3801-1732
Javier Hernán Lafont   – 4001-2676
Silvio Segurotti          – 1328-0148

Hay varias razones por las cuales se puede producir el error ORA-1555: snapshot too old, imagen demasiado vieja.

    El término de segmento de rollback, que lo podemos traducir como ‘segmento para deshacer’. Son objetos creados en la base de datos, con el objetivo de almacenar la información que las transacciones van modificando, para que las operaciones de consulta sean consistentes mediante la búsqueda de los datos en estos segmentos.
 

  Otro razón es en la que los datos devueltos por una consulta sean consistentes respecto al momento en que se inició la misma. Por lo tanto, la consulta nunca ve los cambios hechos por las transacciones que realizan commit durante la ejecución de la consulta.

    Oracle identifica unívocamente cualquier momento en el tiempo a través de un conjunto de números llamados Números de Cambio en el Sistema, System Change Numbers (SCN). Por eso, podemos definir un SCN como el estado en el cual se encuentra la base de datos en un momento dado en el tiempo. Esto funciona de la siguiente forma, cuando la consulta comienza a ejecutarse, Oracle marca el SCN actual, a partir de ese instante, la consulta solo podrá ver la imagen que los datos tenían al momento en que se marcó dicho SNC. De esta forma se garantiza la consistencia de lectura de los datos, ya que cualquier modificación efectuada a los mismos, no podrá ser vista por la consulta que haya comenzado su ejecución anterior a las modificaciones, aunque la misma finalice después de las modificaciones.

    Para que esto realmente pueda funcionar, se utilizan los segmentos de rollback. Cuando una transacción realiza cualquier cambio, se guarda una copia de los datos afectados, antes que los mismos sean modificados, en un segmento de rollback. Además, en la cabecera de bloque de la fila que se está modificando, se guarda la dirección del bloque del segmento de rollback donde se están escribiendo los cambios. El bloque de datos también guarda registro del SCN del último commit que modificó el bloque.

A medida que se leen los bloques de datos a través de la consulta, solo se tomarán en cuenta aquellos que tengan un SCN menor al SCN de la consulta, si un bloque ha sido modificado por alguna otra transacción sin haber hecho commit o tiene datos cambiados con un SCN mas reciente, entonces los datos se reconstruirán usando las imágenes guardadas en los segmentos de rollback. Por eso, si por alguna razón Oracle no puede reconstruir la información requerida por una consulta, que lleva demasiado tiempo ejecutándose, utilizando el snapshot almacenado en los segmentos de rollback, se producirá el error ORA-1555

A %d blogueros les gusta esto: