Manual del estudiante de Ingeniería en Sistemas de UTN/Bases de datos avanzadas/Arquitectura de la base de datos Oracle

De Wikilibros, la colección de libros de texto de contenido libre.

Instancia Oracle[editar]

Cada vez que se arranca una base de datos se asigna en la memoria un Área Global del Sistema (SGA), que emplean los usuarios para compartir información de la base, y algunos procesos background de Oracle son inicializados. Estos procesos, junto con la memoria buffer, constituyen la Instancia Oracle.

Los procesos de usuario y los procesos Oracle[editar]

Un proceso de usuario ejecuta el código de un programa de aplicación o una herramienta Oracle, y se comunica con los procesos del servidor.

Los procesos del servidor son creados por Oracle para capturar los requerimientos de los procesos de usuario.

Los procesos background realizan las operaciones de I/O y monitorean a los otros procesos; lo realizan asincrónicamente para proveer mayor paralelismo y mejorar la performance.

Database Writer (DBWR)
Escribe los bloques modificados desde el DB buffer a los datafiles.
Log Writer (LGWR)
Escribe las entradas del redo log generadas en el redo log buffer al disco.
Checkpoint (CKPT)
Da una señal al DBWR de los checkpoints y actualiza todos los datafiles y control files para indicar el más reciente checkpoint.
System Monitor (SMON)
Realiza la recuperación de la instancia cuando se realiza el startup. Limpia los segmentos temporales y recupera transacciones muertas durante alguna falla. Agrupa extents libres que tienen PCTINCREASE=1.
Process Monitor (PMON)
Realiza la recuperación de los procesos cuando un proceso de usuario falla; limpia el caché y libera recursos que el proceso usaba.
Archiver (ARCH)
Copia el redo log file online a un almacenamiento de archivo cuando está lleno.
Recoverer (RECO)
Resuelve transacciones distribuidas que quedaron pendientes durante una falla en una DB distribuida.
Dispatcher (Dnnn)
Se presentan cuando es usada una configuración de server multithread.
Lock (LCKn)
Es usado para el bloqueo inter-instancia en el Oracle Parallel Server.

Estructura lógica de la DB[editar]

Tablespaces[editar]

La DB está dividida en una o más unidades lógicas de almacenamiento llamadas tablespaces, que a su vez pueden estar constituidos por uno o más archivos del S.O., llamados datafiles. Representan un nivel medio entre la DB y los datafiles. Por su parte, un datafile puede ser asociado con sólo una tablespace y una base de datos.

Data blocks[editar]

Un bloque de datos del Oracle Server es la menor unidad de almacenamiento usada por la base de datos.

Extents[editar]

Un extent es un conjunto de bloques de datos contiguos.

Segments[editar]

Un conjunto de uno o más extents que contiene todos los datos para una estructura específica en un tablespace.

  • El segmento de datos es una colección de extents que mantiene todos los datos para una tabla o cluster.
  • El segmento de índices mantiene todos los datos para un índice.
  • El segmento de rollback mantiene datos para rollback, consistencia de lecturas o recuperación
  • El segmento temporario es una colección de extents que mantiene datos pertenecientes a objetos temporales (consultas largas que necesitan guardar resultados intermedios).

Schemas Objects[editar]

Es la estructura lógica que refiere directamente a los datos de la DB.

Consideraciones[editar]

  • Especificaciones a nivel de segmento solapan las del tablespace (no MIN. EXTENT).
  • Un tamaño de extensión mínima se aplica a todas las asignadas al tablespace.
  • Por omisión se emplean las especificaciones del tablespace.
  • Cuando no se tienen especificaciones para el tablespace se emplean las del Servidor ORACLE.
  • La modificación de parámetros de almacenamiento se aplican a extensiones futuras.
  • Existen parámetros que se especifican a nivel de segmento no de tablespace.

Estructura física de la DB[editar]

Datafiles[editar]

Contienen todos los datos de la base de datos, como las tablas e índices.

Redo Log files[editar]

Mantienen registros de todos los cambios hechos a la base de datos, con fines de recuperación.

Control files[editar]

Almacenan la estructura física y el estado de la base de datos.

Bloques de datos, Extensiones y Segmentos[editar]

Estas son las unidades de asignación de espacio para una Base de Datos. Un Bloque de Datos se corresponde con un número específico de bytes relacionado con el espacio de datos físico en el disco.

Oracle requiere los datos en múltiplos del Bloque de Datos de Oracle. Cuando se crea la Base de Datos Oracle se debe setear la medida del Bloque de Datos (parámetro db_block_size), procurando que sea un múltiplo de la medida del bloque del sistema operativo, dentro de un límite máximo para evitar I/O innecesarios.

La extensión (extent) que es un número específico de Bloques de Datos contiguos asignados para almacenar un tipo específico de información.

Un segmento es un conjunto de extensiones que se han asignado a un tipo específico de estructura de datos. Por ejemplo cada tabla de datos es almacenada en su propio segmento de datos, mientras que cada índice de datos es almacenado en su propio segmento de índice.

Cuando una extensión existente en un segmento esta llena, Oracle asigna otra extensión para ese segmento.


Debido a que las extensiones son asignadas en la medida que son necesarias, las extensiones de los segmentos pueden o no ser contiguas en el disco.

Un segmento y todas sus extensiones son almacenados en un Tablespace, dentro del cual un segmento puede extenderse sobre los archivos de datos (tener extensiones con datos en más de un archivo). Cada extensión puede contener datos de un archivo solamente.

Formato del bloque de datos[editar]

El bloque está dividido en el overhead, los datos de fila, y el espacio libre entre ellos dos.

El overhead[editar]

El overhead está constituido por:

Cabecera (Header)
contiene información general del bloque tales como la dirección del bloque y el tipo de segmento (datos, índices o rollback).
Directorio de tablas (Table Directory)
contiene información acerca de aquellas tablas que tienen filas en este bloque.
Directorio de filas (Row Directory)
contiene información sobre las filas actuales en el bloque, incluyendo direcciones para cada pedazo de fila en el área de datos.

Datos de fila[editar]

Contiene los datos de tablas o índices.

Espacio libre[editar]

Es asignado para insertar filas nuevas y actualizar aquellas que requieren espacio adicional. El espacio libre debe albergar también los datos de la transacción (transaction entry), que se requiere en un bloque por cada INSERT, UPDATE, DELETE y SELECT...FOR UPDATE que acceden a una o más filas en el bloque.

PCTFREE, PCTUSED y Encadenamiento de filas[editar]

PCTFREE Y PCTUSED permiten controlar el espacio libre para inserciones y eliminaciones de filas en los bloques de un segmento.

Estos parámetros se especifican cuando se crea o altera una tabla o cluster; para el caso de los índices se puede especificar PCTFREE.

PCTFREE
Indica el porcentaje mínimo de un bloque de datos que se debe reservar como espacio libre.
PCTUSED
Indica cuando un bloque puede volver a emplearse para insertar nuevos datos de filas.

Un bloque está disponible para inserción mientras tenga libre el porcentaje que indica PCTFREE. Cuando éste es menor, se marcará como no disponible para inserciones, hasta que el porcentaje de uso caiga debajo del parámetro PCTUSED.

En dos casos, los datos de una tabla pueden ser demasiado largos para encajar en un bloque de datos:

  • La fila es demasiado larga cuando se inserta por primera vez, en cuyo caso Oracle almacena los datos para la fila en una cadena de bloques de datos (una o más) reservadas para ese segmento.
  • Una fila que originalmente encaja se actualiza de modo tal que la longitud global se incrementa y el espacio libre del bloque se encuentra lleno; en este caso Oracle mueve la fila entera a un bloque de datos nuevo.

Asignación y liberación de espacio[editar]

Cuando el espacio existente en un segmento es usado completamente, Oracle asigna un nuevo extent para el segmento.

Asignación de extents[editar]

Cuando se crea una tabla, Oracle asigna al segmento de datos de la tabla un extent inicial compuesto por un número específico de bloques de datos.

Si los bloques de datos de un extent inicial del segmento se llenan, Oracle automáticamente asigna un extent incremental para ese segmento, que es un extent subsecuente del mismo tamaño ó de un tamaño mayor que el extent asignado previamente en ese segmento. Para propósitos de mantenimiento el bloque cabecera de cada segmento contiene un directorio de los extents de ese segmento.

Algoritmo de asignación de segmentos[editar]
  • Oracle busca en el espacio libre (del tablespace que contiene los segmentos) hasta el encontrar el primer conjunto de bloques de datos contiguos, libre, de igual o mayor tamaño que el extent incremental:
    • Coincidencia exacta: se busca un conjunto que coincidan con el tamaño del extent nuevo más un bloque adicional para reducir la fragmentación interna.
    • Espacio contiguo mayor: si encuentra un grupo mayor en al menos 5 bloques que el necesitado, divide el grupo de bloques en extents separados uno de los cuales es del tamaño que se requiere.
    • Reasignación de espacio: si Oracle no encuentra un bloque de datos contiguo igual o mayor, reordena los bloques libres de su correspondiente tablespace para formar conjuntos de bloques de datos contiguos mayores. Luego aplica los pasos anteriores.
    • Autoextensión: Si un extent no puede ser asignado después de una segunda búsqueda, Oracle trata de redimensionar los archivos por autoextensión. Si no puede hacerlo retorna un error.
  • Una vez que Oracle encuentra y asigna el espacio libre necesario en el tablespace, asigna una porción del espacio libre que corresponde al tamaño del extent incremental. Si hay remanente, queda como espacio libre.
  • Oracle actualiza la cabecera del segmento y el diccionario de datos para mostrar que un extent nuevo ha sido asignado y que el espacio asignado no está más libre.

Liberación de los extents[editar]

En general, los extents de un segmento no retornan al tablespace mientras no se eliminan los objetos cuyos datos están almacenados en el segmento (por medio de un DROP TABLE o DROP CLUSTER).

Excepciones a esto:

  • Se puede truncar la tabla o cluster con la sentencia TRUNCATE...DROP STORAGE.
  • Periódicamente, Oracle puede desasignar uno o más extents de un segmento de rollback si tienen la opción OPTIMAL especificada.
  • Un DBA puede desasignar extents no utilizados usando la instrucción SQL ALTER TABLE nombre_tabla DEALLOCATE UNUSED.
Tablas Nonclustered[editar]

En tanto existan las tablas nonclustered o hasta que se las trunca, cualquier bloque de datos asignado a su segmento de datos permanece asignado a la tabla. Después de eliminarse una tabla nonclustered, este espacio puede ser reclamado cuando otros extents requieran espacio libre.

Tablas Clustered[editar]

Almacenan su información en los segmento de datos creados para el cluster. Si se elimina una tabla en un cluster, el segmento de datos permanece para las otras tablas en el cluster y ningún extent se desasigna.

Indices[editar]

Todos los extents asignados en un segmento índice permanecen asignados en tanto y en cuanto exista el índice.

Segmentos Rollback[editar]

Oracle periódicamente chequea para ver si los segmentos de rollback de una base de datos han crecido más que su tamaño óptimo. Si un segmento rollback es mayor que su óptimo, Oracle automáticamente desasigna uno o más extents de su segmento de rollback.

Segmentos temporarios[editar]

Cuando se completa la ejecución de una sentencia que requiere un segmento temporario, Oracle automáticamente lo elimina.

Segmentos[editar]

Un segmento es un conjunto de extents que contienen todos los datos para una estructura de almacenamiento lógico específica.

Segmentos de datos[editar]

Cada tabla o partición nonclustered y cada cluster en una base de datos Oracle tiene un segmento de datos simple para mantener todos sus datos.


Los parámetros de almacenamiento determinan como sus extents de segmentos de datos son asignados. Estos parámetros afectan la eficiencia de la recuperación de datos y almacenamiento para el segmento de datos asociado con el objeto.

Segmentos de índices[editar]

Sirven para mantener los datos de los índices. Se pueden especificar los parámetros de almacenamiento para los extents del segmento de índices y el tablespace en el que se crea el segmento índice.

Segmentos temporarios[editar]

Constituyen un área de trabajo para las actividades de ordenamiento. Si dicha operación puede ser realizada en memoria este segmento no se crea. Las consultas que pueden requerir de segmentos temporarios son:

  • CREATE INDEX
  • SELECT ... ORDER BY
  • SELECT DISTINCT
  • SELECT ... GROUP BY
  • SELECT...UNION
  • SELECT...INTERSECT
  • SELECT...MINUS
  • Joins indexados o con subconsultas

Segmentos de rollback[editar]

Un segmento de rollback registra los valores viejos de los datos que fueron cambiados por cada transacción (cometida o no).

Contenido de los segmentos de rollback[editar]

Consiste de varias entradas de rollback, que incluyen información del bloque y los datos como existían antes de la operación en una transacción.


Sólo Oracle puede acceder a los segmentos de Rollback, ni los usuarios ni el DBA pueden acceder a ellos.

Las entradas de rollback cambian los bloques de datos en los segmento de rollback y Oracle registra todos los cambios de los bloques de datos, incluyendo las entradas de rollback en los redo log (que son por lo menos dos).

Si hay una falla en el sistema, Oracle automáticamente recupera la información del segmento, incluyendo las entradas de rollback para transacciones interactivas.

Una vez que se completa la recuperación, Oracle realiza los rollback de las transacciones que ni fueron completadas ni vueltas a atrás en el momento de la falla.


Para cada segmento rollback, Oracle mantiene una tabla de transacciones:
  • Una lista de todas las transacciones que usan el segmento de rollback.
  • Las entradas de rollback por cada cambio realizado por estas transacciones.

Los segmentos de rollback registran los valores de los datos antes de los cambios para cada transacción, luego vincula cada nuevo cambio al cambio previo. Si se deben recuperar una transacción, Oracle aplica los cambios en cadena a los bloques de datos en el orden que restablezcan los datos a sus valores previos.

Transacciones y segmentos rollback[editar]

Cada vez que una transacción de usuario comienza, se le asigna un segmento de rollback en una de las siguientes dos maneras:

  • Oracle puede asignar una transacción automáticamente al próximo segmento de rollback disponible. La asignación de la transacción ocurre cuando se edita la primera sentencia DML o DDL en la transacción. Nunca se asignan transacciones de solo lectura a un segmento rollback.
  • Una aplicación puede asignar una transacción a un segmento de rollback específico. Al comienzo de una transacción, un desarrollador o usuario de aplicaciones puede especificar un segmento rollback particular que Oracle debería usar cuando se ejecute la transacción.

Cuando una transacción se completa (commit), Oracle libera la información de rollback pero no la destruye inmediatamente. La información permanece en el segmento de rollback para crear vistas consistentes de lectura de los datos pertinentes para las queries que comenzaron antes que la transacción se completara exitosamente.

Oracle escribe los extents en los segmentos de rollback secuencialmente. Cuando el último extent del segmento rollback se llena, Oracle continúa escribiendo datos de rollback sobreescribiendo el primer extent en el segmento.

Una transacción que se ejecute en un período de tiempo largo puede requerir un nuevo extent para asignar un segmento de rollback.

Oracle siempre trata de reusar los extents ya asignados a una transacción.

Si el próximo extent contiene datos de transacciones que están activas todavía entonces debe asignar un extent nuevo. Esto se hace hasta que el número de extents para un segmento alcanza el parámetro de almacenamiento MAXEXTENTS.


  • PCTINCREASE le indica a Oracle cuanto ha de crecer cada extent luego que fueren usados los extents INITIAL y NEXT.
  • INITRANS, MAXTRANS especifica el número de entradas inicial y máximo que las transacciones tendrán en el bloque. Están relacionados con la concurrencia que se permite en el bloque.