Tecnología de Bases de Datos Práctica 1 El SGBD Oracle Introducción al servidor Oracle y sus herramientas Profesores: Juan Carlos Casamayor, Laura Mota y Mª José Vicent 1 Práctica 1. Objetivos: Conocer la estructura del servidor Oracle. Conocer las dos componentes de un servidor Oracle: la instancia y el almacenamiento secundario. Conocer el concepto de conexión con el servidor Oracle y los modos de conexión. Utilizar las herramientas Oracle: SQL*Plus y SQL Developer. Conocer la forma de arrancar y apagar el servidor Oracle. 2 2 Práctica 1. Descripción del servidor Oracle Servidor Oracle SGA: Reserva de memoria principal para uso del servidor (temporal) Ordenador con software Oracle Instancia SGA Procesos de fondo Base de Datos Oracle Almacenamiento secundario del servidor (permanente) El identificador del servidor Oracle que se va a utilizar en las prácticas es prueba 3 En un ordenador que va a desempeñar las funciones de servidor de bases de datos y en el que se encuentra instalado el software de Oracle, se podrá poner en funcionamiento este servidor. Una vez hecha esta puesta en funcionamiento en el ordenador se encontrarán dos componentes asociadas al servidor Oracle, la instancia y la base de datos Oracle que explicaré más adelante. En un ordenador que va a hacer de servidor Oracle es posible poner en marcha más de un servidor, sin embargo, esto no es común. Habitualmente en un ordenador que va a realizar la función de servidor de bases de datos, se pone en marcha un servidor Oracle con los recursos suficientes para poder dar servicio al conjunto de usuarios que así lo requieran. 3 Práctica 1. Instancia Oracle Instancia SGA Área compartida Buffers datos Buffer diario Procesos de fondo DBWR LGWR CKPT SMON PMON ARC Instancia Oracle: SGA (System Global Area) + Procesos de fondo Es el medio para acceder al almacenamiento secundario (Base de Datos Oracle) del servidor. System Global Area (SGA): reserva en memoria principal, contiene bloques de disco (transferidos) e información de control para uso del servidor. Procesos de fondo: realizan tareas del servidor. 4 La primera de las componentes de un servidor Oracle es la instancia que está compuesta por: • SGA (Systema Global Area): área de memoria principal de uso exclusivo para el servidor Oracle, y en la que se pueden distinguir tres componentes (Cache de buffers de base de datos, buffer de diario y área compartida) con diferentes usos que después veremos. La SGA es muy grande, centenares de megas o incluso gigas y es la componente que permite acceder a la información almacenada en disco. • Procesos de fondo: estos procesos realizan tareas comunes del servidor sin dar un servicio específico a las solicitudes de los usuarios. 4 Práctica 1. SGA: System Global Area SGA Área compartida Buffers datos Buffer diario System Global Area (SGA): reservada en memoria principal, contiene datos e información de control para uso del servidor. Consta de tres partes: Cache de Buffers de Base de Datos. Buffer de Diario. Área Compartida. 5 5 Práctica 1. SGA: Área compartida SGA Área compartida Buffers datos Área compartida Buffer diario Cache de biblioteca Cache de diccionario de datos Área compartida: Cache de biblioteca: contiene el texto de las últimas instrucciones SQL, el código del análisis, y un plan para su ejecución. Cache del diccionario de datos: contiene la definición de las tablas recientemente accedidas y los privilegios de los usuarios conectados. 6 El área compartida permite optimizar el funcionamiento del servidor. 6 Práctica 1. SGA: Cache de buffers de base de datos SGA Área compartida Buffers datos Buffer diario Buffer de datos: Almacena los bloques de datos y de índices que han sido accedidos más recientemente para agilizar el acceso. Sirve para minimizar los accesos a la memoria secundaria. Puede ser muy grande. 7 7 Práctica 1. SGA: Buffer de diario SGA Área compartida Buffers datos Buffer diario Buffer de diario: Almacena los cambios realizados por las transacciones sobre la BD con fines de recuperación. Se utiliza secuencialmente. Buffer circular (se reescribe). Pequeño. 8 Mucho más pequeño que la zona de buffers de datos, varias decenas de megas. 8 Práctica 1. Procesos de fondo Instancia SGA Procesos de fondo DBWR LGWR CKPT SMON PMON ARC Procesos de fondo: realizan las tareas generales del servidor, no están dedicados a ninguna conexión de usuario. DBWR: escritor de base de datos LGWR escritor de diario CKPT: proceso de puntos de control SMON: monitor del sistema PMON: monitor de procesos ARC: archivador … 9 DBWR: transfiere los buffers de base de datos que han sido modificados y los reescribe en el disco. LGWR: transfiere las entradas del diario y las escribe en el fichero de diario en disco. CKPT: realiza las tareas asociadas a la ejecución de un punto de control. SMON: supervisor del sistema que se encarga de todas las recuperaciones que sean necesarias durante el arranque. PMON: monitor de procesos que libera los recursos de una transacción cuando ésta falla ARC: relacionado con guardar el diario en disco. 9 Práctica 1. Almacenamiento secundario de Oracle Ficheros de control Fichero de parámetros Fichero de palabra de paso Ficheros de diario archivados Ficheros de datos Ficheros de diario Base de datos Oracle 10 El almacenamiento secundario de Oracle está compuesto por una serie de ficheros que caen bajo la denominación de base de datos Oracle. Además, hay otro conjunto de ficheros de un uso menos relevante como son el fichero de parámetros, el fichero de palabra de paso y los ficheros diarios archivados. Hay que destacar que Oracle usa una terminología propia, no hay que confundir el término base de datos de Oracle con el que comúnmente se usa en campo de las bases de datos. 10 Práctica 1. Almacenamiento secundario de Oracle Datos sobre el estado del servidor y estructura física del almacenamiento secundario Ficheros de control Fichero de parámetros Fichero de palabra de paso Ficheros de diario archivados Ficheros de datos Ficheros de diario Base de datos Oracle Objetos de base de datos (tablas, índices, disparadores, …) de todos los usuarios de la BD Oracle Información sobre las transacciones ejecutadas para tareas de recuperación 11 Los ficheros que componen la base de datos Oracle son: • Ficheros de control: si hay varios (es lo recomendado) son todos réplicas. En ellos están registrados datos sobre el estado del servidor y sobre la estructura física del almacenamiento secundario. • Ficheros de datos: constituyen el espacio donde se almacenan todos los datos de los objetos de los usuarios (tablas, índices, etc.). Existen algunos ficheros de datos especiales que el servidor usa para la realización de sus tareas, como el espacio de deshacer (control de concurrencia y recuperación) y el espacio temporal (realización de paginado virtual para ordenaciones). • Ficheros de diario: son los ficheros donde se registra toda la información de las operaciones de actualización en las transacciones de usuarios, para realizar la recuperación, si fuese necesario. 11 Práctica 1. Almacenamiento secundario de Oracle Definición de la Instancia Ficheros de control Fichero de parámetros Fichero de palabra de paso Ficheros de diario archivados Ficheros de datos Ficheros de diario Base de datos Oracle Ficheros de diario históricos Usuarios con autorización para arrancar el servidor 12 Fuera de la base de datos Oracle hay otros ficheros de interés: • Fichero de parámetros: en este fichero se les da valor a los parámetros que configuran el servidor Oracle. Hay parámetros para todas las componentes del servidor y para definir el funcionamiento de multitud aspectos (existen más de 1000 parámetros, todos ellos con un valor por defecto de forma que sólo es necesario establecer los que se deseen). • Fichero de palabra de paso: en este fichero se registra la acreditación de aquellos usuarios que necesiten realizar una administración remota con privilegio de conexión SYSDBA. • Ficheros de diario archivados: corresponden a los ficheros de diario que un proceso de fondo, el archivador, va guardando en una ubicación diferente para salvaguardarlos. Fichero de parámetros en: /opt/oracle/admin/prueba/scripts/initpruebaTemp.ora 12 Práctica 1. Base de datos e instancia Oracle Servidor Oracle BD Parar el servidor Oracle Arrancar el servidor Oracle Servidor Oracle Instancia Ordenador con software Oracle El servidor no se puede utilizar El servidor ya se puede utilizar BD 13 En un ordenador que realiza las tareas de servidor Oracle, hasta que no se haya arrancado la instancia, y por tanto realizado la reserva de memoria correspondiente a la SGA y puesto en marcha los procesos de fondo, el servidor de base de datos no es operativo y, por tanto, la información almacenada en las estructuras físicas de la base de datos Oracle no es accesibles. La única forma de acceder a la información almacenada en la base de datos Oracle es arrancando la instancia asociada a esa base de datos. 13 Práctica 1. Conexión con el servidor Oracle Instancia Servidor Oracle BD Usuarios predefinidos en el servidor Oracle: sys (oracle) system (oracle) … Conexión cliente‐servidor SQL*Plus SQL Developer Herramientas Oracle Usuario Linux: oracle (TBD.2021) Acceso a la máquina virtual: portal‐ng.dsic.cloud Usuario: <usuario_DSIC> (<contraseña_DSIC>) Máquina virtual (Linux): Escritorio remoto: TBD‐xxx‐v2 TBD‐xxx‐v2 Vídeo: 1.- Acceso y arranque de la máquina virtual Vídeo: 2.- Conexión a la máquina virtual 14 14 Práctica 1. Proceso Listener El proceso listener es un proceso de Oracle que se ejecuta en el ordenador donde está instalado el servidor Oracle, y tiene como función atender las peticiones de conexión al servidor por la red. 1. Poner en marcha el proceso listener (desde una terminal Linux): $ lsnrctl start 2. Parar el proceso listener (desde una terminal Linux): $ lsnrctl stop /home/oracle/app/oracle/product/12.1.0/dbhome_1/network/admin 15 El proceso listener es un proceso de Oracle, tipo demonio, que se ejecuta en el ordenador donde está instalado el servidor Oracle, y tiene como función atender las peticiones de conexión al servidor por la red. La configuración de este proceso se encuentra en el fichero listener.ora que se encuentra en un directorio de instalación del servidor. Listener es un proceso servidor que provee la conectividad de red con la base de datos Oracle. El listener está configurado para escuchar la conexión en un puerto específico en el servidor de base de datos. Cuando se pide una conexión a la base de datos, el listener devuelve la información relativa a la conexión. La información de una conexión para una instancia de una base de datos provee el nombre de usuario, la contraseña y el SID de la base de datos. Si estos datos no son correctos se devolverá un mensaje de error. Sin este proceso no se puede establecer la conexión al servidor. 15 Práctica 1. Conexión a un servidor Oracle: sesión Servidor Cliente Proceso Servidor 3 2 SQL* Plus Proceso Usuario 1 listener Servidor Oracle connect hr/pp_hr@prueba tnsnames.ora listener.ora Servicio prueba: parámetros de conexión al servidor Oracle. (fichero de servicios en el ordenador cliente: tnsnames.ora) 16 Las fases para establecer una conexión entre un programa cliente y un servidor Oracle son las siguientes una vez el listener está arrancado: (1) Petición de conexión: desde un ordenador cliente se realiza una petición de conexión usando alguna herramienta cliente. En la transparencia esta herramienta cliente es el SQL*Plus. En la petición el usuario proporciona una cadena de conexión en la que se incluye el nombre de un servicio (prueba). Este servicio está definido localmente en un fichero de servicios (tnsnames.ora) que le permite saber al proceso usuario los datos de la conexión: ordenador servidor, puerto de escucha en el ordenador servidor del listener de Oracle y el SID del servidor al que nos queremos conectar. En la cadena aparece además el nombre del usuario de la conexión y su contraseña. Resolución de la petición de conexión: el proceso usuario del ordenador cliente se pone en contacto por la red con el proceso listener del ordenador servidor, proporcionándole los datos de la conexión. El listener comprueba la petición de conexión y la acreditación del usuario. (2) Puesta en marcha de un proceso servidor: si todo es correcto, el listener pone en marcha un proceso servidor en el ordenador servidor y le deriva la conexión del proceso usuario. (3) Mantenimiento de la conexión: a partir de ese momento el proceso usuario y el proceso servidor mantienen la conexión. 16 Práctica 1. Proceso usuario – Proceso servidor Proceso usuario: Se ejecuta en el ordenador cliente. Se lanza cuando una herramienta o una aplicación se ejecuta en el ordenador cliente. Genera llamadas al servidor Oracle. Proceso servidor: Se ejecuta en el ordenador servidor. Sirve a un único proceso usuario. Utiliza un área exclusiva de memoria (PGA) para funciones de: ordenación, información de la sesión, … Procesa las llamadas generadas por el proceso usuario. Devuelve los resultados al proceso usuario. 17 17 Práctica 1. Conexión con el servidor Oracle: modos Conexión en modo NORMAL: Para realizar tareas de usuario final o tareas administrativas que no afectan al servidor. Conexión en modo SYSDBA: Para realizar tareas administrativas que afectan al servidor: • Arrancar. • Parar. • Realizar copias de seguridad completas. • Realizar restauraciones de la base de datos completas. 18 Se haga desde donde se haga la conexión, existen dos modos de conexión con el servidor Oracle: • En modo normal: es una conexión para realizar tareas de usuario final (manejar la información de sus objetos o manipular sus objetos) o tareas administrativas que no afectan de forma sustancial al servidor como un todo (crear o alterar usuarios, modificar el almacenamiento secundario, alterar la configuración de algún recurso del servidor, etc.). • En modo SYSDBA: es una conexión para realizar tareas administrativas que afectan de forma sustancial al servidor (arrancar, parar, realizar copias de seguridad completas de la base de datos, restaurar completamente la base de datos, etc.). 18 Práctica 1. Conexión con el servidor Oracle: usuarios Usuarios predefinidos: Administradores: • sys: Administrador con privilegio de conexión en modo SYSDBA. Puede realizar todas las tareas administrativas. • system: Administrador sin privilegio de conexión en modo SYSDBA. Puede realizar tareas administrativas que no exijan el modo SYSDBA. Otros usuarios. Contraseña para sys y system: oracle 19 Cuando se instala el software del servidor Oracle y se crea una base de datos Oracle, siempre se crean un conjunto de usuarios predefinidos. Entre ellos cabe distinguir: • Usuario sys: es el administrador con más privilegios (puede hacer cualquier operación sobre el servidor). Siempre se debe conectar en modo SYSDBA. • Usuario system: puede tareas administrativas que no exijan el modo de conexión SYSDBA, ya que no tiene este privilegio de modo de conexión. Estas tareas son casi todas excepto algunas que tienen un impacto global sobre el servidor (apagar o arrancar el servidor, realizar una copia de seguridad completa de la base de datos o una restauración completa de la base de datos, etc.). Además de estos dos usuarios, pueden crearse otros muchos dependiendo del software que se instale en el ordenador que va a realizar las tareas de servidor. 19 Práctica 1. Herramientas Oracle SQL*Plus: Herramienta de línea de comandos para la administración y uso de un servidor Oracle. Exige el conocimiento del lenguaje. Muy básica. Incomoda. Siempre funciona. SQL Developer: Herramienta gráfica para la administración y uso de un servidor Oracle. Muy cómoda. Muchas funcionalidades y modos de uso. Necesita el entorno gráfico. 20 Las herramientas Oracle que utilizaremos son: • SQL*Plus: • Herramienta en modo línea de comando con la que se pueden realizar tareas administrativas o acciones de usuario final contra un servidor Oracle. • Es muy básica y un podo rudimentaria. Exige un conocimiento preciso del lenguaje. • La ventaja es que funciona en cualquier contexto, usando cualquier soporte de conexión y no necesita soporte gráfico. • SQL Developer: • Es una herramienta gráfica con la que se pueden realizar tanto tareas administrativas como trabajos de usuario final. • Es muy cómoda y moderna. Tiene muchas funcionalidades y es muy versátil. • Necesita que el entorno gráfico del ordenador en el que se ejecute este activado y es un poco pesada (está desarrollada en Java) • Es de instalación autónoma y sirve tanto para realizar conexiones locales como remotas. 20 Práctica 1. Herramienta SQL*Plus Ejecutar la herramienta (desde terminal LINUX): $ sqlplus /nolog (sin conexión) Conectarse al servidor Oracle SQL> connect usuario/contraseña [@servicio] [AS {NORMAL|SYSDBA}] Ejecutar la herramienta + Conectarse al servidor Oracle $ sqlplus usuario/contraseña [@servicio] [AS {NORMAL|SYSDBA}] Ejemplos: SQL> connect system/oracle SQL> connect sys/oracle as sysdba Parámetros de conexión: definidos en el servicio o valores por defecto (variables del sistema) 21 Para poner en marcha el SQL*Plus tenemos que ejecutar en una terminal de Linux el comando: sqlplus usuario/contraseña[@servicio] [as {normal|sysdba}] Toda la cadena detrás del comando sqlplus es la “cadena de conexión”. La parte del servicio está relacionado con las conexiones remotas que no veremos en esta asignatura. Ejemplos de cadenas de conexión: • system/oracle: al ponerse en marcha el SQL*Plus se intentará establecer una conexión con el usuario Oracle system y le estamos indicando que la contraseña de este usuario es oracle, para que el servidor haga la verificación. • /nolog: es una cadena de conexión especial que le indica a la herramienta SQL*Plus que no realice el intento de establecer conexión en su puesta en marcha. Más adelante, una vez lanzada la herramienta, tendremos que conectarnos al servidor, mediante la ejecución de la instrucción correspondiente. • sys/oracle as sysdba: lo mismo que en el primer ejemplo, sólo que ahora al poner en marcha el SQL*Plus se intentará establecer una conexión con el usuario sys. Como este usuario siempre se ha de conectar en modo SYSDBA, se usa ese modo de conexión. 21 Práctica 1. Arrancar el servidor Oracle en SQL*Plus 1. Poner en marcha el proceso listener: $ lsnrctl start 2. Ejecutar la herramienta SQL*Plus $ sqlplus /nolog 3. Arrancar el servidor Oracle: Conectarse con el usuario sys en modo SYSDBA SQL> connect sys/oracle as sysdba Arrancar el servidor SQL> startup Vídeo: 3.- Arrancar y parar el Oracle 22 22 Práctica 1. Parar el servidor Oracle en SQL*Plus 1. Parar el servidor Oracle: Conectarse con el usuario sys en modo SYSDBA SQL> connect sys/oracle as sysdba Apagar el servidor SQL> shutdown 2. Cerrar la herramienta SQL*Plus SQL> exit 3. Parar el proceso listener : $ lsnrctl stop Video: 3.- Arrancar y parar el Oracle 23 Modos de parada del servidor: • Normal: la parada se espera a que no haya sesiones abiertas. • Transactional: la parada se espera a que no haya transacciones activas. • Immediate: se fuerza un punto de control, y se cierran todos los ficheros. • Abort: se apaga el servidor sin miramientos. 23 Práctica 1. Herramienta SQL Developer Ejecutar la herramienta (desde terminal LINUX): $ sqldeveloper Tipos de uso de la herramienta (ventanas): Navegación de esquemas de usuario: Ventana de navegación de esquemas. Administración del servidor Oracle: Ventana de administración. Ejecución de instrucciones (SQL, SQL*Plus y PL/SQL): Ventana de Trabajo de SQL. Vídeo: 4.- Arrancar el SQL Developer. Creación de conexiones 24 La herramienta SQL Developer tiene diferentes tipos de usos, de los que se pueden destacar tres: • Navegación de esquemas: esta forma de uso está orientada a un usuario normal. Al conectarse la herramienta presenta el esquema de objetos del usuario, catalogado por tipo de objeto, permitiendo la navegación por él. • Administración del servidor: este uso está orientado a administradores de la base de datos. Permite operar sobre el servidor, alterar su configuración en sus diversas componentes y realizar tareas que afectan globalmente sobre el servidor (en esta versión no se puede arrancar y parar el servidor desde el SQL Developer). • Ejecución de instrucciones: existe una hoja de trabajo que permite ejecutar instrucciones SQL, SQL*Plus y bloques de programa PL/SQL. Con esta forma de uso se puede realizar cualquier operación sobre el servidor, aunque se requiere un conocimiento del lenguaje. 24 Práctica 1. SQL Developer: conexiones Para trabajar con el sistema usando el SQL Developer hay que utilizar conexiones. Conexión en SQL Developer: definición de un conjunto de parámetros de conexión a un servidor Oracle. Definición de conexiones: local a la herramienta SQL Developer Video: 4.- Arrancar el SQL Developer. Creación de conexiones 25 Lo primero que se debe hace cuando se empieza a trabajar con el SQL Developer es crear una conexión. Una conexión del SQL Developer es una denominación a la información que determina el servidor Oracle con el que se quiere conectar. La forma de crear una conexión de este tipo es elegir en el menú Ver la opción Conexiones. Al crear una conexión aparece una ventana en la que hay que especificar los siguientes datos: • Nombre de conexión: es un identificador para la conexión que se está creando. • Usuario: si se especifica, esta conexión sólo podrá ser utilizada por ese usuario para establecer la conexión con el servidor Oracle. • Contraseña: si se especifica y se guarda, al usar esta conexión del SQL Developer, no se pedirá el usuario y la contraseña establecida para la acreditación al conectarse con el servidor Oracle. • Tipo de conexión: es la forma de establecer la conexión con el servidor. Hay que dejar el valor Básico. • Rol: define el modo de conexión, valor por defecto corresponde a un modo de conexión normal, y SYSDBA a un modo de conexión SYSDBA. • Nombre del host: es el ordenador que hace de servidor Oracle. Hay que indicar el nombre completo o la IP de este ordenador. • Puerto: es el puerto en el ordenador que hace de servidor Oracle donde se encuentra escuchando el listener. • SID (System Identification): es el identificador que distingue a la instancia Oracle que se está ejecutando en el ordenador que hace de servidor Oracle. 25 Práctica 1. SQL Developer: Navegación de esquemas 26 Al conectarse en modo normal, la navegación de esquemas es la forma de trabajo por defecto. En esta forma de trabajo, en la ventana Conexiones del menú Ver se despliega la taxonomía de objetos de la base de datos Oracle (tablas, índices, vistas, disparadores, …) de forma que se puede ir navegando por todos ellos y seleccionar alguno de algún tipo para realizar operaciones sobre él. Las acciones que se pueden realizar sobre cada objeto dependen del tipo de objeto que tenga. 26 Práctica 1. SQL Developer: Administración Para administrar el sistema usando el SQL Developer hay que utilizar conexiones de tipo DBA. Conexión DBA: es una conexión de las ya creadas que se incluye en la lista de conexiones DBA (Opción DBA del menú Ver) . Ventana conexiones DBA Permite: • Crear una nueva conexión e incluirla en DBA o • Elegir una existente e incluirla en DBA 27 Al elegir esta opción, se puede crear una conexión para trabajar en modo DBA. Para ello hay que elegir una de las conexiones SQL Developer ya creadas que permita el modo de conexión SYSDBA con el servidor Oracle (o crearla en ese momento si no existe ninguna). Para administrar el servidor desde el SQL Developer, es necesario tener creada al menos una conexión de este tipo. Lo que se podrá administrar en este modo dependerá de los privilegios del usuario que se conecte. 27 Práctica 1. SQL Developer: Administración 28 Si se está conectado en modo administrativo, el SQL Developer proporciona una visión del servidor Oracle, permitiendo observar sus componentes agrupadas en varias categorías de las que vamos a estudiar: • Almacenamiento: da acceso a todos los elementos que requieren almacenamiento secundario, ficheros diarios archivados, ficheros de control, ficheros de datos, ficheros de diario (grupos de Redo Logs), Segmentos de Rollback, Tablespaces y Grupos de Tablespaces Temporales. • Configuración de la Base de Datos: en esta sección se pueden consultar y editar los parámetros de configuración del servidor. • Seguridad: aquí se pueden administrar todos los aspectos de seguridad del servidor Oracle, usuarios, roles y perfiles. 28 Práctica 1. SQL Developer: hoja de trabajo SQL 29 El último tipo de uso posible en el SQL Developer es la ejecución de instrucciones. Este uso se realiza mediante la herramienta Hoja de Trabajo de SQL, que se encuentra en el menú Herramientas. Esta herramienta permite ejecutar instrucciones SQL, SQL*Plus y bloques de programa PL/SQL. Al elegir esta opción en el menú Herramientas se requerirá que se indique cuál va a ser la conexión del SQL Developer mediante la cual se solicita la ejecución de las instrucciones editadas en la hoja de trabajo. Hay que elegir una entre la que haya creadas o se podrá crear una nueva si es el caso. En la transparencia se muestran los tres modos de trabajo del SQL Developer: • Ventana Conexiones: modo de navegación de esquemas. • Ventana DBA: modo de administración del sistema. • Ventana Hoja de trabajo de SQL: ejecución de instrucciones. 29 Tecnología de Bases de Datos Práctica 2 Procesamiento de transacciones y mantenimiento de la integridad en Oracle Profesores: Laura Mota y Mª José Vicent Curso: 2020‐2021 Práctica 2. Objetivos: Conocer la sintaxis para la definición de transacciones en Oracle. Comprobar experimentalmente el funcionamiento de las instrucciones COMMIT y ROLLBACK. Comprobar experimentalmente los modos de comprobación de la integridad en Oracle. Tabajar con restricciones diferibles. 2 Práctica 2. Definición de transacciones en Oracle Operaciones de usuario: INICIO: inicio implícito. En Oracle una transacción se inicia implícitamente cuando se ejecuta la primera instrucción SQL (DML) desde que finalizó la última transacción o desde que se realizó la conexión al servidor. FIN (con confirmación): COMMIT [WORK] (o FIN implícito) (transacción confirmada parcialmente) En Oracle una transacción finaliza implícitamente (con confirmación parcial) cuando el usuario se desconecta del servidor. FIN (con anulación): ROLLBACK [WORK] (transacción anulada) Nota: la sintaxis para la definición de transacciones en Oracle coincide con la del SQL estándar excepto para la instrucción SQL de inicio de una transacción (START TRANSACTION) que no existe en Oracle. 3 Práctica 2. Definición de transacciones en Oracle Operaciones de usuario: En Oracle se pueden definir puntos de SAVEPOINT para anular parcialmente una transacción (SQL estándar): SAVEPOINT nombre_savepoint ROLLBACK TO nombre_savepoint 4 Práctica 2. Definición de transacciones en Oracle Operaciones de usuario: INICIO IMPLÍCITO … … SAVEPOINT marca1 … … SAVEPOINT marca2 … … IF … THEN ROLLBACK TO SAVEPOINT marca2 … … IF … THEN ROLLBACK TO SAVEPOINT marca1 … COMMIT 5 Práctica 2. Comprobación de R.I. en Oracle Modos de comprobación de la integridad (se define para cada restricción del esquema): Modo inmediato: la restricción se comprueba tras cada operación SQL que pueda violar la restricción. Modo diferido: la restricción se comprueba al final de cada transacción que contenga una instrucción que pueda violar la restricción. El modo de comprobación de una restricción puede ser fijo (restricción no diferible) o se puede cambiar dinámicamente durante la ejecución de una transacción (restricción diferible). 6 Práctica 2. Comprobación de R.I. en Oracle Acción del SGBD frente a la violación de una RI: Modo inmediato: el SGBD rechaza la instrucción SQL que provoca la violación y la transacción continúa. Modo diferido: el SGBD anula la transacción. 7 Práctica 2. Comprobación de R.I. en Oracle Propiedad del cambio: diferible/no diferible [[NOT] DEFERRABLE] [INITIALLY {IMMEDIATE|DEFERRED}] Inmediato Diferido Modo 8 Práctica 2. Comprobación de R.I. en Oracle La instrucción SQL que permite cambiar, localmente en una transacción, el modo de una restricción definida como diferible (DEFERRABLE), es: SET CONSTRAINT {RI1, RI2, ... | ALL} {IMMEDIATE | DEFERRED} 9 Tecnología de Bases de Datos Práctica 3 Recuperación de bases de datos en Oracle Profesores: Laura Mota y Mª José Vicent Curso: 2020‐2021 1 Práctica 3. Objetivos: Estudiar la estrategia de actualización de la base de datos que se sigue en Oracle. Estudiar los elementos que intervienen en la estrategia de recuperación de la base de datos en Oracle. Comprobar experimentalmente la estrategia de recuperación en Oracle. 2 2 Práctica 3. Estrategia de actualización en Oracle Entorno concurrente. Actualización en el lugar. Actualización inmediata. Actualización no forzar. Algoritmo DESHACER/REHACER 3 3 Práctica 3. Estrategia de recuperación en Oracle Elementos utilizados en el procesamiento de transacciones y en la estrategia de recuperación en el SGBD Oracle: Buffer de datos. Buffer de diario. Fichero de diario. [escribir, T, X, valor_antes, valor_después] Espacio de deshacer. 4 Como se ha presentado en el Tema 3, en un diario se registran todas las operaciones que realizan las transacciones, con fines de recuperación de la BD: deshacer una transacción anulada o interrumpida, o rehacer una transacción confirmada. Para poder deshacer o rehacer una actualización de una transacción es necesario guardar en el diario el valor anterior y el valor posterior a dicha actualización, como se indica en la entrada de tipo [escribir, T, X, valor_antes, valor_después] La particularidad de Oracle reside en que estas dos informaciones (valores de X) se almacenan en dos repositorios distintos: • En un fichero de datos del servidor (Espacio de Deshacer) y • En el fichero de diario del servidor. Como se presentará en la Práctica 5, Oracle utiliza para gestionar el espacio disponible en disco (los ficheros de datos) una organización particular. El espacio en disco destinado a datos se organiza en espacios de distinto tamaño (tablespaces en la terminología de Oracle), gestionados por el servidor. Uno de estos espacios se destina a almacenar las anotaciones con los valores anteriores de los datos actualizados, para poder deshacer transacciones durante la recuperación de la BD. Por este motivo se habla de Espacio de Deshacer (Undo Tablespace). En el fichero de diario se almacenan las anotaciones con el valor posterior de los datos actualizados para poder rehacer transacciones durante la recuperación de la BD. En la transparencia se indica el destino final de estos dos valores del dato actualizado (valor_antes y valor_después). En las transparencias siguientes se presentará con más detalle el uso de estos dos repositorios. 4 Práctica 3. Bloques de datos Estrategia de recuperación en Oracle Bloques de diario Bloques de deshacer Instancia Ficheros de control Área compartida Buffers datos Buffer diario Ficheros de datos DBWR LGWR CKPT SMON PMON Memoria Principal ARC Ficheros de diario Base de datos Oracle Memoria Secundaria 5 Como se ha visto en prácticas anteriores, en la SGA de la instancia, de un servidor Oracle, existen dos tipos de buffers: el buffer de diario y el buffer de datos. En el buffer de datos se trasfieren temporalmente los bloques de los ficheros de datos que son accedidos durante el uso del servidor. Estos bloques pueden ser de dos tipos: • Bloques de datos (bloques de objetos de datos), o • Bloques del espacio de deshacer. En el buffer de diario se trasfieren bloques del fichero de diario. Los bloques transferidos a memoria principal serán devueltos (grabados) al disco en instantes de tiempo determinados por la estrategia de actualización de la BD y los parámetros de configuración del servidor. 5 Práctica 3. 6 Estrategia de recuperación en Oracle Espacio de deshacer Fichero de datos Buffer de datos 2 [escribir, T, X, valor_antes, valor_después ] En la actualización de un elemento de datos (X): El valor_después se escribe en el objeto de datos El valor_antes se escribe en el espacio de deshacer Ambos modificaciones (escrituras) son registradas antes en el fichero de diario con fines de recuperación. Buffer de diario 4 Objeto de datos 3 1 Fichero de diario 6 Debido a la forma particular, en Oracle, de almacenar la información relativa a una operación de actualización, es importante entender el destino de cada información para la recuperación, teniendo en cuenta que las actualizaciones realizadas en el espacio de deshacer (valor_antes) reciben el mismo tratamiento, respecto a la política de recuperación, que las actualizaciones de los objetos de datos, es decir, que el hecho de escribir en el espacio de deshacer implica hacer una anotación en el fichero de diario. Así: • El valor del dato antes de la actualización (valor_antes) se escribe en el correspondiente bloque del espacio de deshacer residente temporalmente en el buffer de datos. Una anotación con la inserción realizada en el espacio de deshacer (valor_antes) es también registrada previamente en el buffer de diario. (En el espacio de deshacer sólo se hacen inserciones). • El valor del dato después de la actualización (valor_después) se escribe en el correspondiente bloque del objeto de datos residente temporalmente en el buffer de datos. Una anotación con el valor actualizado (valor_después) es registrada previamente en el buffer de diario. Los bloques de datos y de deshacer en los que se han hecho actualizaciones, en el buffer de datos, serán devueltos a su posición en el disco en algún momento posterior. El contenido del buffer de diario será grabado en el fichero de diario en disco siguiendo una política que asegura tener en disco toda la información necesaria para la recuperación de la base de datos en caso de fallo. (Algoritmo de gestión del fichero de diario). 6 7 Estrategia de recuperación en Oracle Fichero de diario Tabla (fichero de datos) actualización del elemento de datos X escribir [T, X, valor_antes] X Buffer de datos escribir[T, X, valor_antes] Espacio de deshacer (fichero de datos) escribir[T, X, valor_después] Práctica 3. Buffer de diario 4 2 1 3 escribir (X) 7 Esta transparencia visualiza más detalladamente lo que ya se ha descrito en la transparencia anterior. Es importante destacar: • Cualquier bloque (datos, deshacer, diario) debe ser transferido al buffer correspondiente para su actualización, y posteriormente debe ser salvado (grabado) en disco. • Cualquier actualización que se hace en el espacio de deshacer o en los objetos de datos debe ser anotada previamente en el fichero de diario. • En el espacio de deshacer se registran los valores anteriores de los datos con fines de recuperación (deshacer transacciones), pero estas inserciones en el espacio de deshacer son anotadas también en el fichero de diario. Si se perdiese el contenido del espacio de deshacer por algún fallo, éste podría ser reconstruido usando el diario. El uso de un espacio de deshacer (valor_antes) en Oracle responde únicamente a razones de rendimiento. Las mismas medidas de seguridad podrían tomarse usando exclusivamente un fichero de diario clásico. Con el uso del espacio de deshacer se pretende tener más accesible la información necesaria para deshacer transacciones, ya que esta tarea se realiza con mucha más frecuencia (usuario, SGBD) que la tarea de rehacer (fallo del sistema). 7 Práctica 3. Estrategia de recuperación en Oracle Buffers de datos (MP) transacciones t1 bloques de datos UPDATE profesor SET cod_dep=‘DISCA’ WHERE cod_pro=‘JCC’; <JCC … DSIC> 8 Buffer de diario (MP) bloques de deshacer [escribir, T1 , X, <JCC … DSIC>] bloques de diario [leer, T1, X] [escribir, T1 ,X, <JCC … DSIC>] <JCC … DISCA> [escribir, T1 , X, <JCC … DISCA>] t2 commit t4 confirmación del SGBD t5 UPDATE profesor SET cod_dep=‘DISCA’ WHERE cod_pro=‘MCG’; [commit, T1] [leer, T2, Y] <MCG … DSIC> Escritura anticipada en el diario t7 Bloques de deshacer Bloques de datos [escribir, T2 , Y, <MCG … DSIC>] [escribir, T2 , Y, <MCG … DISCA>] <MCG … DISCA> … fallo del t10 sistema [escribir, T2 , Y, <MCG … DSIC>] BD t6 Forzar escritura en t3 el diario diario Profesor Ficheros de diario Espacio para datos Ficheros de datos Espacio de deshacer 8 En la transparencia se ilustra con un ejemplo la situación en que puede quedar la base de datos (en disco) después de un fallo del sistema con pérdida de memoria principal, en el supuesto de la estrategia de actualización planteada. 8 Práctica 3. tiempo Estrategia de recuperación en Oracle t1 t4 t5 t10 T1 (confirmada) Rehacer Reconstruir (espacio de deshacer) T2 (interrumpida) punto de control Deshacer fallo del sistema Algoritmo DESHACER/REHACER 9 Éste es el proceso de recuperación de la base de datos del ejemplo anterior después del fallo. Deberán deshacerse las actualizaciones de las transacción T2 y rehacerse las actualizaciones de la transacción T1 que es la única confirmada después del último punto de control. Para deshacer T2, primero reconstruirá el espacio de deshacer usando el diario. 9 Práctica 3. Estrategia de recuperación en Oracle Fallo del sistema con pérdida de MP: Algoritmo Deshacer/Rehacer Forzar la escritura en el diario a) En el fichero de diario en disco se encuentran los cambios realizados por las transacciones confirmadas antes del fallo del sistema (las transacciones que hicieron estos cambios pueden no haber sido grabados en la BD en disco). b) En el fichero de diario en disco se encuentran todos los cambios realizados sobre bloques del espacio de deshacer correspondientes a cambios en bloques de datos que ya han sido transferidos a disco (las transacciones que hicieron estos cambios pueden haber sido interrumpidas). Escritura anticipada en el diario 10 a) Debido al algoritmo de gestión del fichero de diario (forzar la escritura en el diario) antes de confirmar una transacción, el SGBD transfiere a disco el contenido del buffer de diario, es decir salva en el fichero de diario los cambios realizados por la transacción (valor_despues), independientemente de que estos cambios hayan sido grabados o no en el disco. Esto permite rehacer la transacción confirmada en caso de fallo del sistema. b) Debido al algoritmo de gestión del fichero de diario (escritura anticipada en el diario), en el fichero de diario se encuentran los cambios realizados en el espacio de deshacer que son necesarios para deshacer las actualizaciones (valor_antes) de las transacciones interrumpidas que ya hayan sido grabadas en disco. 10 Práctica 3. Estrategia de recuperación en Oracle Fallo del sistema con pérdida de MP: Algoritmo Deshacer/Rehacer Estrategia de recuperación: a) Se aplican sobre la BD los cambios registrados en el fichero de diario en disco, desde el último punto de control: se rehacen las transacciones confirmadas y se reconstruye el espacio de deshacer en disco. (REHACER) b) Utilizando las entradas del espacio de deshacer en disco, se deshacen todos los cambios producidos por transacciones interrumpidas por el fallo del sistema.(DESHACER) 11 11 Práctica 3. Estrategia de recuperación en Oracle Espacio de deshacer Ficheros de diario BD BD que necesita recuperación BD REHACER BD con cambios de transacciones confirmadas e interrumpidas Sincronización de la BD y el espacio de deshacer en disco con el estado del buffer de datos en el momento del fallo. BD DESHACER BD con datos de transacciones confirmadas Anulación de cambios de transacciones interrumpidas. 12 Al aplicar el procedimiento REHACER: • Rehacemos, con la información del fichero de diario (valor_después) las transacciones confirmadas antes del fallo y posteriores al último punto de control. Algunos de los cambios de estas transacciones podrían haberse quedado en el buffer de datos en el momento del fallo. • Rehacemos el espacio de deshacer en disco con la información del fichero de diario. Esto asegura que en el espacio de deshacer en disco, después de la restauración, están registrados los cambios (valor_antes) de las transacciones activas en el momento del fallo, realizados sobre bloques de datos que ya han sido transferidos al disco. Otros cambios de estas transacciones interrumpidas no registrados todavía en disco no interesan. Al aplicar el procedimiento DESHACER: • Deshacemos los cambios de las transacciones interrumpidas. 12 Práctica 3. Estrategia de recuperación en Oracle Buffer de datos: Almacena los bloques de datos y del espacio de deshacer que han sido accedidos más recientemente. Sirve para minimizar los accesos a disco. El SGBD gestiona de la misma forma los bloques de datos y los bloques del espacio de deshacer. 13 Como ya estudia en la práctica 1, el buffer de datos almacena temporalmente bloques de datos y bloques del espacio de deshacer. 13 Práctica 3. Estrategia de recuperación en Oracle Instancia Área compartida Buffers datos DBWR: Hace falta espacio en el buffer de datos. Buffer diario Antes de ejecutar un punto de control. DBWR LGWR CKPT SMON PMON ARC Periódicamente. Ficheros de control Ficheros de datos Ficheros de diario Base de datos Oracle 14 Los criterios para que el proceso de fondo DBWR (Database Writer) actúe y transfiera bloques (datos, deshacer) del buffer de datos al disco, pueden ser varios: • El servidor necesita espacio en el buffer de datos para atender las peticiones de las transacciones: transferir nuevos bloques de datos y de deshacer al buffer de datos. • Antes de marcar un punto de control en el fichero de diario, el servidor transfiere a disco el contenido del buffer de diario y los bloques del buffer de datos (sucios). • En la configuración del servidor se puede establecer una periodicidad para transferir bloques (sucios) del buffer de datos a disco. 14 Práctica 3. Estrategia de recuperación en Oracle Buffer de diario: Almacena los cambios realizados por las transacciones sobre bloques de datos y bloques del espacio de deshacer con fines de recuperación. Se utiliza secuencialmente. Buffer circular (se reescribe) 15 Como ya se estudia en la práctica 1, el buffer de diario almacena temporalmente bloques del fichero de diario donde se anotan, entre otra información, las actualizaciones (valor_después) realizadas sobre bloques de datos y bloques de deshacer. 15 Práctica 3. Estrategia de recuperación en Oracle Instancia Área compartida Buffers datos LGWR: Confirmación de transacción. Buffer diario 1/3 del buffer de diario lleno. Antes de que escriba el DBWR. DBWR LGWR CKPT SMON PMON ARC Cada tres segundos. Ficheros de control Ficheros de datos Ficheros de diario Base de datos Oracle 16 Los criterios para que el proceso de fondo LGWR (Log Writer) actúe y transfiera el contenido del buffer de diario al disco, pueden ser varios: • Antes de que el servidor confirme una transacción: algoritmo de gestión del diario (forzar escritura en el diario). • Cuando una porción del buffer de diario previamente establecida está llena (configuración). • Antes de que el proceso DBWR transfiera bloques del buffer de datos a disco: algoritmo de gestión del diario (escritura anticipada en el diario). • Con cierta periodicidad previamente establecida (configuración). 16 Práctica 3. Organización del diario en Oracle Grupo 1 Grupo 2 Grupo 3 Miembro Miembro Miembro Disco 1 Miembro Miembro Miembro Disco 2 El servidor Oracle trabaja con varios grupos de ficheros de diario. Cada grupo de diario es un conjunto de ficheros de diario similares (miembros). 17 Por razones de seguridad el servidor Oracle trabaja con varios grupos de diario. Cada grupo de diario contiene un conjunto de ficheros de diario similares (miembros). Por seguridad los miembros de un grupo de diario se suelen almacenar en discos distintos. 17 Práctica 3. Organización del diario en Oracle Grupo 1 Actual Grupo 3 Miembro Miembro Miembro Disco 1 Miembro Miembro Miembro Disco 2 LGWR • • • Buffer diario Existe un grupo actual que es el que está siendo utilizado por el servidor. El servidor actualiza simultáneamente todos los miembros del grupo actual. Cuando los ficheros del grupo actual están llenos, el servidor pasa al grupo 18 siguiente. (Uso circular del conjunto de grupos de diario). El fichero de diario tendría todas sus entradas entre los miembros de los distintos grupo (uno por grupo). Un grupo puede estar en varios estados: • Actual: es sobre el que está escribiendo el LGWR. • Activo: es posible que sus entradas sean necesarias para realizar recuperación ante fallos. • Inactivo: sus entradas no son necesarias para recuperarse ante un fallo de sistema (por ejemplo porque se ha hecho un checkpoint). 18 Práctica 3. Organización del diario en Oracle Grupo 1 Grupo 2 Actual Miembro Miembro Miembro Disco 1 Miembro Miembro Miembro Disco 2 ARCH Ficheros de diario archivados Cuando un grupo de diario está completo puede ser archivado por razones de seguridad. (Parámetro de configuración del servidor). Los grupos se sobreescriben cuando están llenos. Antes de esto deberían estar en estado inactivo y archivarse. 19 19 Práctica 3. Organización del diario en Oracle En el servidor prueba existen 3 grupos de diario, cada uno de ellos con un fichero de diario. El grupo #1 es el grupo de diario actual en este momento Gestión de grupos de diario en SQL Developer 20 En la instalación del laboratorio los tres miembros de cada grupo del diario están en el mismo disco (incluso en el mismo directorio). Esto no debería ser así para que la instalación fuera robusta. 20 Tecnología de Bases de Datos Práctica 4 Control de la concurrencia en Oracle Profesores: Laura Mota y Mª José Vicent 1 Práctica 4. Objetivos: Conocer la estrategia seguida en Oracle para el control de la ejecución concurrente de transacciones. Conocer los niveles de aislamiento estándar que a nivel de transacción pueden especificarse en Oracle. Comprobar experimentalmente la aplicación de esta estrategia en distintas situaciones. 2 2 Práctica 4. Niveles de aislamiento en SQL estándar: SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED READ COMMITTED REPETEABLE READ SERIALIZABLE } READ UNCOMMITTED: lectura no confirmada. READ COMMITTED: lectura confirmada. REPETEABLE READ: lectura repetible SERIALIZABLE: lectura serializable. 3 En el Tema 4, se estudia la propuesta que el SQL estándar hace relativa al control de la concurrencia. El SQL propone que el protocolo, utilizado por el SGBD, permita trabajar con distintos niveles de control de la concurrencia: niveles de aislamiento. El nivel de aislamiento lo establece el usuario al inicio de la transacción, con la instrucción SQL: SET TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED READ COMMITTED REPETEABLE READ SERIALIZABLE } (el alcance es la transacción) O en la sesión de usuario, con la instrucción SQL: ALTER SESSION SET ISOLATION LEVEL {READ UNCOMMITTED READ COMMITTED REPETEABLE READ SERIALIZABLE } (el alcance es la sesión) La elección del nivel de aislamiento debe estar en función del tipo de actividad que se vaya a realizar. SQL propone cuatro niveles de aislamiento que significan distintos grados de exigencia en el control de la concurrencia. 3 Práctica 4. Niveles de aislamiento en Oracle: SET TRANSACTION ISOLATION LEVEL { READ COMMITTED SERIALIZABLE } READ COMMITTED: lectura de datos confirmados al inicio de la instrucción SQL. SERIALIZABLE: lectura de datos confirmados al inicio de la transacción. El valor por defecto cuando no se usa la instrucción es READ COMMITED. 4 Oracle simplifica la propuesta de SQL, y elimina dos niveles de aislamiento. El efecto es que en Oracle, el nivel mínimo de aislamiento en el que se puede trabajar es READ COMMITED, es decir las transacciones siempre leen versiones de los datos ya confirmados en el instante de la operación de lectura. Por otro lado, desaparece un nivel intermedio, REPETEABLE READ, que queda incluido en el siguiente nivel, SERIALIZABLE, en el que las transacciones leen versiones de los datos confirmados al inicio de la transacción. 4 Práctica 4. Control del procesamiento de transacciones en SQL estándar: Anomalía Nivel de aislamiento Lectura sucia Lectura no repetible Lectura de Pérdida de fantasmas actualizaciones READ UNCOMMITED SÍ SÍ SÍ SÍ READ COMMITED NO SÍ SÍ SÍ REPETIBLE READ NO NO SÍ SÍ SERIALIZABLE NO NO NO NO 5 5 Práctica 4. Control del procesamiento de transacciones en Oracle: Anomalía Lectura sucia Lectura no repetible READ COMMITED NO SÍ SÍ SÍ SERIALIZABLE NO NO NO NO Nivel de aislamiento Lectura de Pérdida de fantasmas actualizaciones 6 6 Práctica 4. Control de la concurrencia en Oracle: El control de la concurrencia en Oracle se basa en tres recursos: Un protocolo de bloqueo de elementos de datos. Las versiones antiguas de los elementos de datos (anteriores a una actualización), guardadas en el servidor con fines de recuperación. Las marcas de tiempo (número secuencial del sistema): SCN (System Change Number). 7 Estos tres recursos se explican a continuación. 7 Práctica 4. Recurso 1 para control concurrencia en Oracle: Protocolo de bloqueo de Oracle: El sistema Oracle utiliza un protocolo de bloqueo en el que un elemento de datos puede estar en dos estados: ‘bloqueado’, ‘desbloqueado’: Si bloqueo(X) = ‘bloqueado’, otras transacciones distintas a la que provocó el bloqueo pueden leer el elemento de datos X, pero ninguna otra transacción distinta a la que provocó el bloqueo puede escribir el elemento X. Bloqueo exclusivo en escritura. Si bloqueo(X) = ‘desbloqueado’, cualquier transacción puede leer o escribir el elemento de datos X. 8 En el Tema 4, se estudia la familia de protocolos de bloqueo de elementos de datos. Se presentaron dos protocolos de bloqueo, el protocolo de bloqueo binario (impide el acceso concurrente a un elemento de datos), y el protocolo de bloqueo B2F (permite un acceso concurrente en lectura y un acceso exclusivo en escritura). Los protocolos de bloqueo de elementos de datos se basan en la idea de restringir el acceso al mismo elemento de datos por varias transacciones. Bloqueo: estado de un elemento de datos con respecto a las operaciones que las transacciones pueden realizar sobre él. El protocolo de bloqueo propuesto por Oracle no coincide exactamente con ninguno de los vistos en teoría. 8 Práctica 4. Recurso 1 para control concurrencia en Oracle: Protocolo de bloqueo de Oracle: Los bloqueos son implícitos(1): El estado de bloqueo lo provoca una operación de escritura SQL. El desbloqueo de un elemento de datos se produce cuando finaliza la transacción que lo tenía bloqueado (con confirmación o con anulación). La granularidad (por defecto) del bloqueo es a nivel de fila(2). (1) El usuario puede definir bloqueos manuales (explícitos). (2) La granularidad puede ser también a nivel de tabla. 9 En Oracle, como en otros SGBD, el bloqueo y el desbloqueo son implícitos, es decir no existen operaciones específicas para bloquear y desbloquear elementos de datos. El estado de bloqueo de un elemento de datos lo provoca una operación de escritura sobre el elemento. El desbloqueo de los elementos de datos, bloqueados durante una transacción, se produce cuando la transacción termina. Existen bloqueos explícitos (SELECT … FOR UPDATE) que permiten bloquear conjuntos de filas, para realizar ciertas operaciones. Este tipo de bloqueos no serán estudiados en esta práctica. En Oracle, como en otros SGBD, el bloqueo es a nivel de fila. En algunas ocasiones el bloqueo se produce a nivel de tabla, esto sucede cuando concurren una operación de DML (actualización) y una operación de DDL (definición de datos (CREATE)). Este tipo de bloqueos tampoco serán estudiados en esta práctica. 9 Práctica 4. Recurso 1 para control concurrencia en Oracle: Protocolo de bloqueo de Oracle: Conclusiones: Una operación de lectura siempre se satisface. Los lectores nunca esperan (aunque esté bloqueado). Sólo una transacción activa puede actualizar un elemento de datos (bloqueo exclusivo en escritura). 10 De acuerdo con la definición del protocolo de bloqueo que se sigue en Oracle, se puede concluir que las operaciones de lectura de las transacciones siempre se satisfacen, y que sólo una transacción puede acceder a un elemento de datos para actualizarlo. Observad que este protocolo no coincide con el protocolo B2F estudiado en el Tema 4, el protocolo B2F es más estricto. Observad que no coincide tampoco con el Protocolo Multiversión (Tema 4), ya que, aunque siempre se permite la lectura de un elemento de datos, no se permite que varias transacciones actualicen un elemento de datos a la vez. 10 Práctica 4. Recurso 1 para control concurrencia en Oracle: Protocolo de bloqueo de Oracle: Bloqueo mortal en Oracle: el SGBD detecta la situación de bloqueo mortal y la resuelve rechazando una de las operaciones que provocan el problema, informando a la correspondiente transacción. No anula la transacción. 11 11 Práctica 4. Recurso 1 para control concurrencia en Oracle: 12 Para ver los bloqueos que hay en un momento determinado se puede utilizar la herramienta de informes del SQL Developer (Menú: Ver‐Informes) con el usuario sys o system. 12 Práctica 4. Recurso 2 para control concurrencia en Oracle: Versiones antiguas de los elementos de datos: Las versiones de un elemento de datos que mantiene el sistema son los valores (confirmados) anteriores a las actualizaciones de las transacciones, que se almacenan con fines de recuperación de la base de datos. En Oracle la información para la recuperación de la base de datos se almacena en dos repositorios distintos: El fichero de diario (Redo Log) y El espacio de deshacer (Undo Tablespace). 13 Anteriormente se ha dicho que Oracle utiliza tres recursos para el control de la concurrencia: bloqueo de elementos de datos, versiones de los elementos de datos y marcas de tiempo. Esto significa que ninguno de estos recursos por sí sólo es suficiente para asegurar los niveles de aislamiento que permite Oracle. Respecto a las versiones de los elementos de datos, Oracle mantiene versiones antiguas de los elementos de datos (valores confirmados anteriores a las actualizaciones de las transacciones) con fines de recuperación de la base de datos. Este uso se vio en la práctica 3, pero como se verá en las trasparencias siguientes, Oracle va a hacer también uso de las versiones de los elementos de datos para el control de la concurrencia. Usualmente (ver Tema 4), los SGBD almacenan los valores de los datos anterior (valor_antes) y posterior (valor_después) a una actualización en el fichero de diario del sistema. Oracle, por razones de rendimiento, almacena esta información en dos repositorios distintos, de la forma que se va a exponer a continuación. Básicamente la idea del uso de un diario, donde se registra todo lo que sucede en las transacciones, es la misma, pero la implementación que hace Oracle de esta idea es distinta. 13 Práctica 4. Recurso 2 para control concurrencia en Oracle: Versiones antiguas de los elementos de datos: Bloques de datos Bloques de diario Bloques de deshacer Instancia Ficheros de control Área compartida Buffers datos Buffer diario Ficheros de datos DBWR LGWR CKPT SMON PMON Memoria Principal ARC Ficheros de diario Base de datos Oracle Memoria Secundaria 14 Como se ha presenta en el Tema 4, en un fichero de diario se registran todas las operaciones que realizan las transacciones, con fines de recuperación de la BD: deshacer una transacción anulada o interrumpida, o rehacer una transacción confirmada. Para poder deshacer o rehacer una actualización de una transacción es necesario guardar en el diario el valor anterior y el valor posterior a dicha actualización, como se indica en la entrada de tipo [escribir, T, X, valor_antes, valor_después] La particularidad de Oracle reside en que estas dos informaciones (valores de X) se almacenan en dos repositorios distintos: en un fichero de datos del servidor y en el fichero de diario del servidor. Como se presentará en la práctica 6, Oracle utiliza para gestionar el espacio disponible en disco (los ficheros de datos) una organización particular. El espacio en disco destinado a datos se organiza en espacios de distinto tamaño (tablespaces en la terminología de Oracle), gestionados por el servidor. Uno de estos espacios se destina a almacenar las anotaciones con los valores anteriores de los datos actualizados, para poder deshacer transacciones durante la recuperación de la BD. Por este motivo se habla de Espacio de Deshacer (Undo Tablespace). En el fichero de diario se almacenan las anotaciones con el valor posterior de los datos actualizados para poder rehacer transacciones durante la recuperación de la BD. En la transparencia se indica el destino final de estos dos valores del dato actualizado (valor_antes y valor_después). En las transparencias siguientes se presentará con más detalle el uso de estos dos repositorios. 14 Práctica 4. Recurso 2 para control concurrencia en Oracle: Versiones antiguas de los elementos de datos: Espacio de deshacer Fichero de datos Buffer de datos 2 [escribir, T, X, valor_antes, valor_después ] En la actualización de un elemento de datos (X): El valor_después se escribe en el objeto de datos El valor_antes se escribe en el espacio de deshacer Ambos modificaciones (escrituras) son registradas antes en el fichero de diario con fines de recuperación. Buffer de diario 4 Objeto de datos 3 1 Fichero de diario 15 Debido a la forma particular, en Oracle, de almacenar la información relativa a una actualización, es importante entender el destino de cada información: • El valor del dato después de la actualización (valor_después) se escribe en el correspondiente bloque de datos (bloque del objeto de datos) residente temporalmente en el buffer de datos. Una anotación con ese valor actualizado (valor_después) es registrada previamente en el buffer de diario. • El valor del dato antes de la actualización (valor_antes) se escribe en el correspondiente bloque del espacio de deshacer residente temporalmente en el buffer de datos. Una anotación con la actualización realizada sobre el espacio de deshacer (valor_antes) es también registrada previamente en el buffer de diario. Los bloques de datos y de deshacer en los que se han hecho actualizaciones, en el buffer de datos, serán devueltos a su posición en el disco en algún momento posterior (Práctica 3). El contenido del buffer de diario será grabado en el fichero de diario en disco siguiendo una política que asegura tener en el diario en disco toda la información necesaria para la recuperación de la base de datos en caso de fallo. (Práctica 3) Es importante observar que las actualizaciones realizadas en el espacio de deshacer (valor_antes) reciben el mismo tratamiento, respecto a la política de recuperación, que las actualizaciones de los objetos de datos (valor_después), es decir son anotadas en el fichero de diario. 15 Práctica 4. Recurso 3 para control concurrencia en Oracle: Marcas de tiempo: System Change Number (SCN) SCN: número secuencial asignado por el sistema (representa un instante de tiempo y permite la ordenación temporal). Cada transacción lleva asociado un SCN de inicio y un SCN de terminación. Si una transacción T tiene un SCN de inicio menor que el SCN de inicio de otra transacción T’, entonces T es anterior a T’. Los bloques de datos tienen, en la cabecera del bloque, ranuras transaccionales donde el sistema registra, entre otra información, el SCN de las transacciones confirmadas que han actualizado filas del bloque. 16 16 Práctica 4. Recurso 3 para control concurrencia en Oracle: Marcas de tiempo: System Change Number (SCN) Cabecera Espacio Libre Bloque • • • Directorio de filas en el bloque. Directorio de tablas que usan el bloque. Slots de transacciones: SCN de confirmación de las transacciones que han modificado las filas del bloque. Datos 17 17 Práctica 4. Estudio de las anomalías en Oracle: Lectura sucia. Lectura no repetible. Lectura de fantasmas. Pérdida de actualizaciones. 18 Una vez presentados los tres recursos que utiliza Oracle para el control de la concurrencia, se va a hacer una revisión de las anomalías tipificadas (lectura sucia, lectura no repetible, y pérdida de actualizaciones) para analizar cómo Oracle las evita con su estrategia de control de la concurrencia. Dado que la lectura de fantasmas es un caso específico de lectura no repetible, no se estudia su caso. 18 Práctica 4. READ COMMITED Lectura sucia en Oracle: T1 T2 t1 t2 t3 inicio r(X) w(X) … bloqueo (exclusivo en escritura) ti … Buffers de datos bloques de datos X 10 X=10 inicio r(X) bloques de deshacer 20 T1 t3 X 10 X=10 lectura permitida El sistema muestra el último valor confirmado del elemento de datos que existe en el momento en que se inicia la instrucción SQL. 19 El sistema necesita mantener información sobre las transacciones confirmadas, y el instante de inicio y de finalización de las transacciones. En los slots transaccionales de la cabecera de los bloques, el sistema guarda el SCN de las transacciones que han actualizado filas del bloque. Procedimiento: a) Si la última transacción* que ha actualizado X (cabecera de bloque) es una transacción confirmada**, entonces, el valor de X en el bloque de datos es un valor confirmado. b) Si la última transacción que ha actualizado X (cabecera de bloque) no es transacción confirmada, entonces, el sistema deberá buscar en el espacio de deshacer la primera actualización de X de esa transacción, y usar el valor_antes. En Oracle NO hay lectura sucia. * La última transacción que ha actualizado X será la de mayor SCN (slots transaccionales) ** No se entra en cómo el servidor mantiene información sobre las transacciones: inicio, fin, confirmación. 19 Práctica 4. Lectura sucia en Oracle: Para cada elemento de datos actualizado por una transacción, el sistema mantiene la siguiente información en el espacio de deshacer: el identificador de la transacción, una marca de tiempo y el valor antes de la actualización. Con esta información el SGBD puede proporcionar a cada transacción que requiere la lectura de un elemento de datos el último valor confirmado del mismo antes del inicio de la instrucción. Se asegura el nivel de aislamiento READ COMMITED: las operaciones de lectura de las transacciones leen datos ya confirmados en el momento de la lectura (o bien las actualizaciones realizadas por la propia transacción). Se evita la anomalía de la lectura sucia. 20 Para asegura el nivel de aislamiento READ COMMITED (valor por defecto) en el que no se produce la anomalía de la lectura sucia, Oracle utiliza las versiones anteriores de los elementos de datos y proporciona a las transacciones, en sus operaciones de lectura, el último valor confirmado del dato, existente al inicio de la operación. En Oracle NO hay lectura sucia. 20 Práctica 4. Estudio de las anomalías en Oracle: Lectura sucia. Lectura no repetible. Lectura de fantasmas. Pérdida de actualizaciones. 21 21 Práctica 4. Lectura no repetible en Oracle: El valor mínimo y por defecto de aislamiento de Oracle es read commited por lo que en este nivel se leerán siempre datos confirmados antes de la operación de lectura. Si entre dos lecturas del mismo dato en una transacción otra transacción modifica el dato y confirma la modificación, cada lectura devolverá un valor. 22 22 Práctica 4. READ COMMITED Lectura no repetible en Oracle: T1 t1 t2 t3 t4 … ti … inicio r(X) T2 bloques de datos X=10 inicio bloqueo w(X) c liberación r(X) Buffers de datos bloques de deshacer X 10 50 T2 t4 X 10 X=50 lectura permitida Sí se da la anomalía El sistema muestra el último valor confirmado del elemento de datos que existe en el momento en que se inicia la instrucción SQL. 23 Como se puede observar, el uso del protocolo de bloqueo de Oracle y la lectura del último valor confirmado del dato (al inicio de la operación), no son suficientes para evitar la anomalía. 23 Práctica 4. SERIALIZABLE Lectura no repetible en Oracle: T1 t1 t2 t3 t4 … ti inicio r(X) T2 bloques de datos X=10 inicio bloqueo w(X) c liberación r(X) Buffers de datos bloques de deshacer X 10 50 T2 t4 X 10 X=10 … lectura permitida No se da la anomalía El sistema muestra el último valor confirmado del elemento de datos que existe en el momento en que se inicia la transacción 24 24 Práctica 4. SERIALIZABLE Lectura no repetible en Oracle: T1 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 inicio r(X) … … T2 X=10 inicio r(X) w(X) c No se da la anomalía bloques de deshacer T0 ti X 4 10 X=10 inicio r(X) w(X) c r(X) bloques de datos X T3 X=50 50 T2 t4 X 10 80 T3 t9 X 50 X=10 El sistema muestra el último valor confirmado del elemento de datos que existe en el momento en que se inicia la transacción 25 En la transparencia se muestra un ejemplo con 3 transacciones. SERIALIZABLE: Se busca en el espacio de deshacer las entradas de la última transacción, que ha actualizado X, y que ha sido confirmada, antes del inicio de la transacción que ahora quiere leer. Procedimiento: a) Si la última transacción que ha actualizado X (cabecera de bloque) es una transacción confirmada, antes del inicio de la transacción que ahora quiere leer, entonces se lee el valor de X en el bloque de datos. b) Si la última transacción que ha actualizado X (cabecera de bloque) es una transacción confirmada, después del inicio de la transacción que ahora quiere leer, o no es una transacción confirmada, entonces, el sistema deberá buscar dos transacciones consecutivas, Ti, Ti+1 (que han actualizado X), tales que Ti sea la última transacción confirmada antes del inicio de la transacción que ahora quiere leer, y en el espacio de deshacer se debe leer el valor_antes de la primera actualización de Ti+1. 25 Práctica 4. Lectura no repetible en Oracle: Para cada elemento de datos actualizado por una transacción, el sistema mantiene la siguiente información en el espacio de deshacer: el identificador de la transacción, una marca de tiempo y el valor antes de la actualización. Con esta información el SGBD puede proporcionar a cada transacción que requiere la lectura de un elemento de datos el último valor confirmado del mismo antes del inicio de la transacción. Se asegura el nivel de aislamiento SERIALIZABLE: las operaciones de lectura de las transacciones leen datos confirmados antes del inicio de la transacción (o bien las actualizaciones realizadas por la propia transacción). Se evita la anomalía de la lectura no repetible. 26 Para asegura el nivel de aislamiento SERIALIZABLE en el que no se produce la anomalía de la lectura no repetible, Oracle usa las versiones anteriores del elemento de datos, y proporciona a las transacciones, en sus operaciones de lectura, el último valor confirmado del dato, existente al inicio de la transacción. 26 Práctica 4. Estudio de las anomalías en Oracle: Lectura sucia. Lectura no repetible. Lectura de fantasmas. Pérdida de actualizaciones. 27 27 Práctica 4. READ COMMITED Pérdida de actualizaciones en Oracle: Buffers de datos T1 t1 t2 t3 t4 t5 t4 t6 t7 t8 t9 inicio r(X) T2 bloques de datos X 10 X=10 inicio r(X) X=10 XX2 bloqueo w(X) c liberación XX3 w(X) bloqueo c liberación 8 7 Sí se da la anomalía 28 Como se puede observar, el uso del protocolo de bloqueo de Oracle y la lectura del último valor confirmado del dato (al inicio de la transacción), no son suficientes para evitar la anomalía. Por lo tanto va a ser necesario utilizar otros recursos. 28 Práctica 4. SERIALIZABLE Pérdida de actualizaciones en Oracle: Buffers de datos T1 t1 t2 t3 t4 t5 t4 t6 t7 t8 t9 inicio r(X) T2 bloques de datos X 10 X=10 inicio r(X) XX2 bloqueo w(X) c liberación XX3 w(X) No se da la anomalía X=10 8 ORA 08177, “Cannot serialize access for this transaction” Cause: Encountered data changed by an operation that occurred after the start of this serializable transaction. 29 29 Práctica 4. Pérdida de actualizaciones en Oracle: Oracle utiliza la información de las marcas de tiempo (SCN) en los slots transaccionales de la cabecera de los bloques para saber qué transacciones han actualizado alguna fila del bloque. En el nivel de aislamiento SERIALIZABLE, una transacción T puede actualizar una fila sólo si el sistema puede garantizar que la última actualización de la fila fue hecha por una transacción que fue confirmada antes del inicio de T. Error generado cuando una transacción T (ejecutada en el nivel SERIALIZABLE) intenta actualizar una fila residente en un bloque que ha sido actualizada por otra transacción que fue confirmada después de que la transacción T se iniciase: ORA 08177, “Cannot serialize access for this transaction”. Anula la instrucción de escritura 30 Oracle utiliza para el control de la anomalía de la pérdida de actualizaciones, el recurso de las marcas de tiempo en los slots transaccionales de las cabeceras de bloque. 30 Tecnología de Bases de Datos Práctica 5 (Parte 1) Implementación de bases de datos en Oracle Estudiar la estructura de almacenamiento de Oracle. Profesores: Laura Mota y Mª José Vicent Curso: 2019‐2020 1 Práctica 5. Parte 1. Reserva en memoria principal (temporal) Almacenamiento en Oracle: Instancia Servidor Oracle BD Oracle Almacenamiento en disco (permanente) 2 El espacio en disco de un servidor Oracle se compone de un conjunto de ficheros del SO. Estos ficheros están especializados para distintos usos: ficheros de control, ficheros de diario, y ficheros de datos. Los ficheros de datos constituyen el espacio en disco destinado al almacenamiento de datos de los usuarios y del servidor. 2 Práctica 5. Parte 1. Jerarquía de almacenamiento: Base de Datos Oracle Tablespace Lógico Ficheros del SO Físico Segmento Extensión Bloque Oracle Gestión del espacio en disco (Oracle) Bloque SO Gestión del espacio en disco (SO) 3 Oracle gestiona el espacio en disco destinado a datos, los ficheros de datos, de una forma propia, superponiendo una organización lógica sobre la organización física del SO. El espacio en disco para datos se organiza en tablespaces. • Un tablespace se define sobre uno o varios de los ficheros de datos del servidor, es decir es el espacio en disco (no necesariamente contiguo) constituido por estos ficheros. • Un segmento es el espacio en disco ocupado por un objeto de BD (del usuario o del servidor). Un segmento va ocupando espacio en disco dinámicamente en unidades de tamaño variable denominadas extensiones. • Una extensión es espacio en disco contiguo formado por uno o varios bloques Oracle. • Un bloque Oracle está formados por uno o varios bloques de SO contiguos. 3 Práctica 5. Parte 1. Estructura del almacenamiento: Índice1 Tabla2 Índice2 Índice3 Índice6 Índice4 Índice7 Índice5 Tabla3 Disco2 Tabla1 Fichero2 Fichero1 Disco1 Tablespace: espacio en disco definido por uno o más ficheros de SO Tablespace Ficheros del SO (estructuras físicas (SO) asociadas a un tablespace) Objetos de BD (tablas, índices) (almacenados en un tablespace se pueden distribuir por varios ficheros en disco) 4 Oracle gestiona el espacio en disco destinado a datos en forma de tablespaces. Un tablespace se define sobre uno o varios de los ficheros de datos del servidor, es decir es el espacio en disco (no necesariamente contiguo) constituido por estos ficheros. El uso de tablespaces hace más flexible la gestión del espacio en disco en el servidor Cuando se crea un nuevo usuario se le asigna un tablespace para datos en el cual se almacenarán (por defecto) los objetos creados por el usuario mientras éste no especifique en la creación del objeto otro tablespace en el que esté autorizado. 4 Práctica 5. Parte 1. Estructura del almacenamiento: Segmento: espacio en disco ocupado por un objeto de BD Disco2 100M Disco1 F1 32K Segmento de tabla t1 64K 96K Segmento de tabla t2 32K 100M Extensiones F2 Tablespace T Un objeto de base de datos (tabla, índice) se almacena en un único tablespace. 5 Un segmento es el espacio en disco ocupado por un objeto de BD (del usuario o del servidor). Un segmento se almacena en un único tablespace. Un segmento va ocupando espacio en disco (en el tablespace) dinámicamente a medida que el correspondiente objeto crece. Las asignaciones de memoria que recibe se denominan extensiones, y pueden ser de tamaño variable. Una extensión es espacio en disco contiguo formado por uno o varios bloques Oracle. Una extensión no puede ocupar bloques de ficheros distintos. Las extensiones de un segmento aparecen distribuidas en el tablespace (incluso en ficheros distintos), es decir, no son necesariamente contiguas en disco. El tamaño de las extensiones se especifica en la definición del tablespace. 5 Práctica 5. Parte 1. Estructura del almacenamiento: Segmento asociado a la tabla t1 creada en el tablespace T Segmento t1 128k Extensión 32k 4k 4k Extensión 4k 96k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k 4k Bloques Oracle (4K) Las extensiones que se van asignando dinámicamente a un segmento pueden ser de tamaño variable. 6 6 Práctica 5. Parte 1. Estructura del almacenamiento: Tipos de tablespace Permanente Temporal Deshacer Tamaño de las extensiones Gestión del espacio en un tablespace (gestión de extensiones) Local Gestión del espacio en un segmento Automático Automático Uniforme Diccionario (en desuso) Manual 7 En Oracle existen tres tipos de tablespaces: • Permanente: para almacenar segmentos de objetos de BD (tablas, índices, …) • Temporal: para almacenar segmentos temporales, creados por el servidor para tareas de ordenación de datos. • Deshacer: para almacenar segmentos de deshacer, con información para las tareas de recuperación. La gestión de las extensiones en un tablespace es local: el espacio (bloques ocupados y libres) en el tablespace se gestiona en un mapa de bits en la cabecera del tablespace. En versiones anteriores había una gestión por diccionario de datos que ya está en desuso. En la gestión local el tamaño de las extensiones puede ser establecido automáticamente por el servidor (asignación automática) que es el valor por defecto, o puede definirse un tamaño uniforme. La gestión del espacio en un segmento, es decir el espacio (bloques) ocupado y libre en sus extensiones, se puede gestionar por medio de listas de bloques libres (manual), es el valor por defecto, o por medio de un mapa de bits en la cabecera del segmento (automático). 7 Práctica 5. Parte 1. Estructura del almacenamiento: tablespaces 8 Los tablespaces pueden ser gestionados por usuarios con privilegios de administración (sys o system). 8 Práctica 5. Parte 1. Estructura del almacenamiento: tablespaces 9 9 Práctica 5. Parte 1. Estructura del almacenamiento: tablespaces 10 10 Práctica 5. Parte 1. Estructura del almacenamiento: ficheros de datos 11 11 Práctica 5. Parte 1. Estructura del almacenamiento: tablespaces 12 12 Práctica 5. Parte 1. Estructura del almacenamiento: tablespaces 13 13 Práctica 5. Parte 1. Estructura del almacenamiento: tablespaces 14 14 Práctica 5. Parte 1. Tipos de segmentos: Datos de usuario Tabla Partición de tabla Índice Agrupación Tabla organizada como índice Partición de índice 15 En Oracle existen distintos tipos de segmentos correspondientes a distintos tipos de objetos de base de datos: Segmento de tabla: es el tipo de segmento más frecuente, es el espacio en disco ocupado por una estructura tabla implementada como un fichero desordenado. Las filas de la tabla se almacenan en las extensiones (bloques) del segmento sin ningún orden. En un principio las filas se almacenan secuencialmente, según el orden de inserción, y posteriormente, cuando la tabla evoluciona debido a actualizaciones y borrados, se reutiliza el espacio libre existente en los bloques. Segmento de partición de tabla: Oracle contempla la partición de una tabla (implementada como un fichero desordenado) en subconjuntos de filas definidos por algún criterio: valor del campo(s) de partición. Cada partición es un segmento distinto que se almacena en un tablespace distinto. Oracle gestiona los diferentes segmentos de la partición de forma trasparente para el usuario. La partición de una tabla (de un tamaño grande) mejora el rendimiento en el uso concurrente de la tabla. Segmento de agrupación (cluster): la agrupación es una estructura de datos (fichero mixto) en la que se almacenan filas de dos tablas distintas relacionadas por algún campo (generalmente una clave ajena). Esta forma de implementar las tablas favorece la recuperación conjunta de las filas relacionadas de ambas tablas. El espacio ocupado por esta estructura es un segmento de agrupación. Las tablas incluidas en la agrupación no tienen segmento propio. Segmento de tabla organizada como índice: en casos especiales una estructura tabla puede implementarse como una estructura de índice, de forma que los campos no‐clave de las filas se almacenan junto a la clave de indexación, en los nodos del índice. El espacio ocupado por una tabla implementada de esta forma es un segmento de tabla‐índice. Segmento de índice: un índice es una estructura de datos que permite el acceso directo y ordenado a las filas de una tabla por el valor de un campo de indexación. El espacio ocupado por un índice es un segmento de índice. Segmento de partición de índice: de la misma forma y por las mismas razones que en el caso de una tabla, las entradas de un índice pueden ser divididas en subgrupos por algún criterio, y almacenadas en segmentos distintos: segmentos de partición de índice. 15 Práctica 5. Parte 1. Tipos de segmentos: Datos del servidor Segmento de deshacer Segmento temporal 16 Segmento de deshacer: es un tipo de segmento para uso del servidor, en el que se almacenan entradas con información (valor_antes) relativa a las actualizaciones realizadas en tablas e índices por las operaciones de usuario. Esta información permite deshacer transacciones durante el proceso de recuperación de la base de datos. Segmento temporal: es un tipo de segmento para uso del servidor. Los segmentos temporales son creados dinámicamente por el servidor, en los tablespaces temporales, y sirven para realizar tareas de ordenación de datos cuando esto sea necesario. Operaciones: CREATE INDEX, SELECT DISTINCT, SELECT … GROUP BY, SELECT … ORDER BY. 16 Práctica 5. Parte 1. Asignación y liberación de extensiones: Asignación de extensiones a un segmento: Se insertan datos por primera vez en el segmento. El segmento crece (inserciones, modificaciones). Se extiende manualmente el segmento. Liberación de extensiones de un segmento: Se elimina el segmento. Se trunca el segmento. Se reorganiza el segmento. La asignación y liberación de extensiones (de tamaño variable) a los segmentos produce la fragmentación del espacio en disco del tablespace (ficheros). El servidor Oracle en ciertas situaciones, o a petición del administrador, puede fundir huecos libres y contiguos de distinto tamaño para disponer de espacios libres de mayor tamaño. 17 El servidor asigna dinámicamente extensiones a un segmento a medida que éste crece. Las extensiones ocupadas por un segmento se liberan cuando el segmento se borra o se trunca. El servidor gestiona los espacios (huecos) libres en los tablespaces con el fin de volver a utilizarlos. Cuando las extensiones liberadas son de distinto tamaño, el espacio en el tablespace (ficheros) puede quedar muy fragmentado. El servidor Oracle puede fundir porciones de espacio libre contiguo en los ficheros del tablespace para disponer de áreas de espacio libre de mayor tamaño, y crear en ellas nuevas extensiones. 17 Práctica 5. Parte 1. Bloque de datos Oracle: Unidad mínima de E/S Consiste en uno o más bloques de SO Se establece en la creación del servidor (BD Oracle) Cabecera Espacio Libre (para las actualizaciones de filas del bloque) Datos (filas) Tamaño del bloque: parámetro de inicialización DB_BLOK_SIZE 18 Oracle usa un tamaño de bloque propio. Este tamaño se define en la creación del servidor Oracle (parámetro: DB_BLOK_SIZE). Un bloque Oracle consiste en uno o varios bloques de SO contiguos. Esto significa que la unidad de transferencia de datos entre memoria secundaria y memoria principal (buffers del servidor) puede ser mayor. En un servidor Oracle, el espacio del bloque se divide en tres secciones: cabecera del bloque, espacio para datos (filas de tabla o entradas de índice), y espacio libre para las posibles actualizaciones (cambio de longitud) de las filas almacenadas en el bloque. Es importante destacar que en Oracle, las filas son registros de longitud variable, debido al uso de tipos de datos de longitud variable (varchar) y a la existencia de valores nulos. El tamaño de las secciones del bloque se puede establecer en la definición del objeto de datos (segmento). Si no se hace, Oracle asume unos valores por defecto. 18 Práctica 5. Parte 1. Bloque de datos Oracle: Cabecera: directorio de filas en el bloque. slots de transacciones: transacciones que han modificado las filas del bloque Espacio Libre (para las actualizaciones de filas del bloque) Datos (filas) 19 En la cabecera del bloque se almacena la siguiente información: un directorio de las filas almacenadas en el bloque, y los slots o ranuras transaccionales. Los slots transaccionales guardan información sobre las transacciones que han actualizado filas del bloque. Son utilizados para el control de la concurrencia en el nivel de aislamiento SERIALIZABLE. 19 Práctica 5. Parte 1. Bloque de datos Oracle: Parámetros de uso del bloque (en un segmento): INITRANS MAXTRANS: fijo a 255 PCTFREE PCTUSED 20 Los parámetros de uso del bloque se pueden especifican en la creación del objeto (segmento). Los parámetros INITRANS y MAXTRANS están relacionados con el control de la concurrencia, y fijan el número mínimo y máximo de slots transaccionales en la cabecera del bloque. Por ejemplo si INITRANS tiene el valor 3, se asegura que al menos tres transacciones pueden estar actualizando filas del bloque. Si se necesitan nuevos slots adicionales, se crean hasta el valor MAXTRANS. El espacio libre en el bloque puede ser utilizado también para aumentar el tamaño de la cabecera del bloque. 20 Práctica 5. Parte 1. PCTFREE=20 PCTUSED=40 Bloque de datos Oracle: Inserciones 80% 1 Inserciones 2 80% Inserciones Inserciones 40% 3 4 21 Los parámetros PCTFREE y PCTUSED están relacionados con el uso del espacio para datos en el bloque y las operaciones de usuario que están permitidas. PCTFREE establece el porcentaje de espacio libre en el bloque (valor por defecto: 10%). PCTUSED establece el porcentaje de espacio usado que el servidor intenta mantener en el bloque. Cuando un bloque tiene un porcentaje de ocupación por debajo de PCTUSED, el bloque pasa a formar parte de la lista de bloques del segmento disponibles para nuevas inserciones de filas (valor por defecto: 40%). En el ejemplo: Estado 1: se insertan filas en el bloque hasta una ocupación del 80%. Estado 2: el bloque no admite nuevas inserciones (PCTFREE=20%). Estado 3: se borran filas o se actualizan filas lo que implica una reducción del espacio ocupado en el bloque. Mientras el espacio ocupado esté por encima del 40%, el bloque no estará disponible para nuevas inserciones. Estado 4: cuando debido a sucesivos borrados y actualizaciones el espacio ocupado cae por debajo del 40%, el bloque vuelve a admitir nuevas inserciones de filas. 21 Práctica 5. Parte 1. Estructura de una fila (de una tabla): Cabecera de fila Longitud de columna Valor de columna Bloque Oracle 22 En Oracle las filas son registros de longitud variable. Los campos (columnas) se almacenan en la fila en el orden en que aparecen en la definición de la tabla. Las columnas del final de la fila con valor nulo no se almacenan. Para poder direccionar las columnas dentro de la fila, ésta tiene la siguiente estructura: Cabecera de la fila: almacena el número de columnas en la fila, la información de enlace cuando una fila, debido a su longitud, tiene que ser almacenada en varios bloques, y el estado de bloqueo de la fila para el control de la concurrencia. Datos: para cada columna, el servidor almacena la longitud de la columna (1 byte o 3 bytes según el tipo de datos de la columna) y su valor, en ese orden. Por ejemplo, sea una tabla con 10 atributos (todos ellos de tipo entero), y la siguiente fila de esa tabla: {(a1, 1), (a2, null), (a3, 7), (a4, null), (a5, 5), (a6, 4) (a7, 1), (a8, null), (a9, null) (a10, null)}: • En la cabecera de la fila se almacenará que sólo tiene 7 valores (los 3 últimos atributos son nulos). • Para cada uno de los 7 primeros atributos se almacenará dos informaciones: longitud (0 si es nulo) y valor. No existen caracteres separadores entre filas. 22 Práctica 5. Parte 1. Migración y encadenamiento de filas: Antes de actualizar Después de actualizar 23 En la trasparencia se muestra el caso de una fila que, después de una actualización, no cabe en el bloque que ocupaba inicialmente. En estos casos Oracle traslada la fila actualizada a otro bloque y mantiene, en el bloque inicial, un puntero a la nueva posición de la fila: MIGRACIÓN. El fenómeno del ENCADENAMIENTO sucede cuando una fila tiene una longitud demasiado larga para caber en un bloque. En estos casos Oracle, trocea la fila en fragmentos más pequeños que son almacenados en bloques distintos, y mantiene punteros entre los fragmentos para poder reconstruir la fila completa. 23 Práctica 5. Parte 1. Consulta diccionario del sistema: Tabla Descripción dba_tables dba_objects dba_tab_columns dba_constraints Información relativa a los objetos de los usuarios: tablas, restricciones, columnas, … dba_tablespaces dba_free_space dba_segments dba_extents Información sobre los tablespaces y el almacenamiento físico de los objetos (segmentos) del usuario Para conocer el esquema de una tabla del diccionario se debe usar la instrucción describe nombre_de_tabla. Cualquier tabla puede consultarse con la instrucción select. 24 Por ejemplo, para saber qué tablas ha creado Cosmos se podría consultar la tabla daba_tables del sistema (con un usuario como sys o system). Para saber qué información almacena esa tabla usaríamos la instrucción describe (donde veríamos que uno de sus atributos es owner): describe dba_tables; select * from dba_tables where owner = ‘COSMOS’; 24 Tecnología de Bases de Datos Práctica 5 (Parte 2) Implementación de bases de datos en Oracle Estudiar los distintos tipos de índices que ofrece Oracle. Profesores: Laura Mota y Mª José Vicent Curso: 2019‐2020 1 Práctica 5. Parte 2. Identificador interno de fila de una tabla: ROWID • Identificador único de una fila • Se usa para localizar una fila Formato ROWID OOOOOO FFF BBBBBB RRR Número objeto Número fichero Número bloque Número fila 2 El ROWID es una columna virtual (no se almacena) de todas las tablas. El ROWID es el identificador único de las filas en la base de datos. El ROWID no coincide con la dirección física de la fila, pero sirve para localizarla en la base de datos, y para hacer referencia a ella desde cualquier sitio. Los ROWID de las filas se almacenan en los índices de las tablas para direccionar las filas. Un ROWID tiene una longitud de 10 bytes y es visualizado como 18 caracteres con el siguiente significado: • Número de objeto: es el número de objeto (único en la BD) al que pertenece la fila (permite conocer el tablespace en el que está almacenado). • Número de fichero relativo: es el número de fichero relativo (dentro del tablespace del segmento) en el que se almacena la fila. • Número de bloque relativo: es el número de bloque relativo (dentro del fichero) en el que se almacena la fila. • Número de fila relativo: es la entrada (número de orden) en el directorio de filas de la cabecera del bloque, correspondiente a la fila. El uso del nro. de entrada en la cabecera de bloque para direccionar la fila permite mover la fila en el bloque (compactación) sin que cambie su rowid. 2 Práctica 5. Parte 2. Clasificación de índices: Lógica: Campo de indexación simple o múltiple. Con restricción de unicidad o no (único o no único). Física: Particionado o no particionado. Árbol B+ o mapa de bits. • Normal o invertido (sólo en árbol B+). 3 Los índices son estructuras de datos que permiten el acceso directo y ordenado a las filas de una tabla por el valor de un campo de indexación (llamado también clave de indexación aunque no tenga restricción de unicidad). En Oracle, las entradas de un índice son pares de la forma <valor‐clave, ROWID> El campo de indexación puede ser simple, formado por una única columna de la tabla, o múltiple, formado por la concatenación de varias columnas de la tabla. En el caso de campo de indexación múltiple, el orden de las columnas en el campo de indexación, no tiene que coincidir con el orden de las columnas en la definición de la tabla. El campo de indexación puede tener restricción de unicidad (único) o no tenerla (no único). En el primer caso cada entrada del índice apunta a una única fila de la tabla indexada, en el segundo caso cada entrada del índice apunta a un conjunto de filas de la tabla. Por su estructura, los índices se clasifican en índices con estructura en árbol B+, e índices de mapas de bits (estructura de array). Por último, un índice, al igual que una tabla, puede particionarse en varios segmentos para mejorar su rendimiento. 3 Práctica 5. Parte 2. Índice en árbol B+: Entrada del índice (nodo‐hoja) Nodo‐raíz Nodo‐interno Cabecera Nodo‐hoja Longitud columna clave Valor columna clave ROWID 4 Un índice en árbol B+, es un índice donde las entradas se organizan en una estructura de árbol B+, En un árbol B+ se diferencian dos tipos de nodos: los nodos internos y los nodos hoja. Los nodos internos sirven para organizar (distribuir) los valores de la clave en el árbol. Las entradas en un nodo‐interno contienen: un valor del campo clave y un puntero a un nodo (bloque) del nivel inmediatamente inferior. Los nodos‐hoja contienen entradas que direccionan filas de la tabla indexada. Las entradas en un nodo‐hoja contienen: una cabecera con el número de columnas de la clave (en la entrada) e información sobre el estado de bloqueo de la entrada; un valor de la clave (simple o compuesta); y la dirección (ROWID) de la fila de la tabla con dicho valor de clave. Los nodos‐hoja (bloques) están doblemente encadenados entre sí para permitir el acceso secuencial ordenado (ascendente y descendente) a las filas de la tabla por el valor del campo clave. Si el índice no es único, entonces puede contener entradas con valor de clave repetido, que apuntarán a distintas filas de la tabla. (Índice denso). La inserción de una nueva fila en la tabla implica la inserción de una nueva entrada en el índice en el nodo‐hoja apropiado, y la reestructuración del árbol si es necesario. El borrado de una fila implica el borrado lógico (marcado) de una entrada en un nodo‐hoja (no se reutiliza el espacio de los borrados hasta que el nodo (bloque) está vacío). Una modificación del campo clave significa el borrado y la inserción de una nueva entrada en el índice. 4 Práctica 5. Parte 2. Índice mapa de bits: Fichero 3 Bloque 10 Tabla Bloque 11 Bloque 12 Índice (árbol B+) clave Start End ROWID ROWID bitmap <azul, 10.0.3, 12.6.3, 1000100100010010100> <verde, 10.3.3, 12.3.3, 0001010000100100000> <rojo, 10.1.3, 12.8.3, 0100000011000001001> <amarillo, 10.2.3, 12.7.3, 0010001000001000010> 5 Los índice de mapa de bits son útiles cuando la tabla indexada tiene una cardinalidad elevada, y el campo de indexación tiene un número reducido de valores. Son recomendables también cuando no son muy frecuentes las operaciones de actualización en la tabla, es decir es una tabla principalmente de lectura. Un índice de mapa de bits se organiza también como un árbol B+. La diferencia con el índice en árbol B+ reside en que las entradas en los nodos‐hoja contienen un vector (array) de bits asociado al valor del campo de indexación. Cada bit en el array se corresponde con una fila de la tabla indexada. Las entradas en los nodos‐hoja contienen también los valores StartROWID y EndROWID: StartROWID es la dirección (relativa) de la primera fila en la tabla que contiene el valor de la clave, y EndROWID es la dirección (relativa) de la última fila en la tabla que contiene dicho valor en la clave. Los bits, en el vector asociado a un valor del campo de indexación, representan todas las filas en la tabla. Si un bit de este array tiene un valor 1 significa que la correspondiente fila en la tabla tiene dicho valor en el campo de indexación. Ejemplo de entrada en un nodo‐hoja del índice: <azul, 10.0.3, 12.6.3, 1000100100010010100> La primera fila en la tabla que tiene el valor AZUL en el campo clave es la fila de ROWID 10.0.3 (fichero 3, bloque 10, fila 0), y la última que tiene dicho valor es la fila de ROWID 12.6.3 (fichero 3, bloque 12, fila 6). El array de bits indica qué filas de la tabla tienen o no dicho valor en la clave. StartROWID y EndROWID simplifican el acceso a bloques para recuperar las filas El ROWID viene dado <bloque_id, fila_id, fichero_id> 5 Práctica 5. Parte 2. Índice con clave invertida: Índice sobre EMP (EMPNO) KEY ROWID EMPNO ----1257 2877 4567 6657 8967 9637 9947 ... ... (BLOCK# ROW# FILE#) ------------------0000000F.0002.0001 0000000F.0006.0001 0000000F.0004.0001 0000000F.0003.0001 0000000F.0005.0001 0000000F.0001.0001 0000000F.0000.0001 ... ... Tabla EMP EMPNO ----7499 7369 7521 7566 7654 7698 7782 ... ... ENAME JOB ----- -------ALLEN SALESMAN SMITH CLERK WARD SALESMAN JONES MANAGER MARTIN SALESMAN BLAKE MANAGER CLARK MANAGER ... ... ... ... ... ... ... ... 6 En un índice de clave invertida, los valores (bytes) de las columnas que componen la clave se invierten. La inversión de la clave tiene como objetivo dispersar en el índice entradas correspondientes a inserciones consecutivas con valores de clave secuenciales o muy próximos, y evitar de esta forma problemas de bloqueo. 6 Práctica 5. Parte 2. Comparación de índices: Árbol B+ Bitmap Adecuado para claves de cardinalidad elevada. Adecuado para claves de cardinalidad baja. Modificaciones sobre la clave son relativamente eficientes. Modificaciones sobre la clave son muy ineficientes. Ineficiente para consultas que usen la conectiva lógica OR. Eficiente para consultas que usen la conectiva lógica OR. Útiles para OLTP. Útiles para DSS*. * DSS: Decision Support Systems. OLTP: On Line Transaction Processing 7 7 Práctica 5. Parte 2. Creación de índices: CREATE INDEX nombre_alumno ON alumno(nombre) REVERSE PCTFREE 30 TABLESPACE indx01; CREATE BITMAP INDEX alumno_gén ON alumno(sexo) PCTFREE 30 TABLESPACE indx01; 8 8 Práctica 5. Parte 2. Reconstrucción de índices: ALTER INDEX alumno_nombre REBUILD TABLESPACE indx02; Usar esta instrucción para: Mover un índice a otro tablespace. Mejorar el aprovechamiento del espacio al eliminar las entradas borradas. Cambiar un índice en árbol B+ normal a invertido y viceversa. 9 9 Práctica 5. Parte 2. Eliminación de índices: DROP INDEX alumno_nombre; Usar esta instrucción para: Borrar los índices antes de cargas masivas y recrearlos posteriormente. Borrar los índices que no se usan frecuentemente y crearlos cuando sean necesarios. Borrar y recrear índices que no son válidos. 10 En las cargas masivas de la base de datos, es conveniente borrar los índices y volverlos a crear después de finalizada la carga. Esto evita la actualización continua del índice durante la carga, lo que consume tiempo y puede degradar el índice. Cuando un índice se corrompe por algún motivo, el servidor no lo utiliza para la optimización de consultas. Es responsabilidad del administrador vigilar estos índices y volverlos a crear. 10 Práctica 5. Parte 2. Índices en el SQL Developer: 11 11 Práctica 5. Parte 2. Índices en el SQL Developer: 12 12 Tecnología de Bases de Datos Práctica 5 (Parte 3) Implementación de bases de datos en Oracle Estudiar la implementación de tablas en Oracle. Profesores: Laura Mota y Mª José Vicent Curso: 2019‐2020 1 Práctica 5. Parte 3. Creación de tablas: CREATE TABLE empleado( empno NUMBER(4) PRIMARY KEY, nombre VARCHAR2(30), depto NUMBER(2) REFERENCES departamento) PCTFREE 20 PCTUSED 50 TABLESPACE data01; 2 En la transparencia aparece un ejemplo de definición de tabla, en el que se observa la definición de los parámetros de uso de los bloques. TABLESPACE: tablespace de almacenamiento del segmento de tabla. PCTFREE, PCTUSED: parámetros de uso del espacio en el bloque. 2 Práctica 5. Parte 3. Copia de tablas: CREATE TABLE nuevo_empleado TABLESPACE data01 AS SELECT * FROM empleado; 3 La instrucción CREATE TABLE permite crear una tabla a partir de una subconsulta. La nueva tabla tiene el mismo esquema y contenido que la tabla definida por la subconsulta. En la copia no se trasfieren las restricciones de integridad definidas sobre la tabla origen, salvo las restricciones de valor no nulo. 3 Práctica 5. Parte 3. Marca de agua superior: Después de inserciones Extensión ID 0 1 2 3 Después de borrados Extensión ID Bloque usado 0 1 4 Marca de agua superior 2 Bloque sin usar 3 4 Bloque libre después de borrar 4 La marca de agua de un segmento apunta al bloque con número (relativo) mayor, en el que ha habido inserciones. (En el ejemplo el bloque 1 de la extensión 4) A medida que se insertan filas en la tabla, la marca de agua va desplazándose. Cuando la tabla experimenta borrados la marca de agua no se actualiza, lo que significa que en las extensiones del segmento pueden existir bloques libres. 4 Práctica 5. Parte 3. Asignación manual de extensiones a un segmento: ALTER TABLE empleado ALLOCATE EXTENT(SIZE 500K DATAFILE ‘/DISK3/DATA01.DBF’); 5 La instrucción ALTER TABLE permite asignar manualmente extensiones a un segmento de tabla. 5 Práctica 5. Parte 3. Liberación de espacio: Antes de liberar ALTER TABLE empleado DEALLOCATE UNUSED; Marca de agua superior Después de liberar Bloque usado Bloque sin usar Bloque libre después de borrar 6 La instrucción ALTER TABLE permite liberar el espacio no utilizado (bloques y extensiones) por encima de la marca de agua. 6 Práctica 5. Parte 3. Truncamiento de una tabla: TRUNCATE TABLE empleado; Extensión ID Marca de agua superior 0 1 Bloque sin usar 7 La instrucción TRUNCATE TABLE borra todas las filas de una tabla y libera las extensiones ocupadas por el segmento. En el ejemplo se asume que MINEXTENTS es 2, por eso después de truncar la tabla se mantienen dos extensiones, y la marca de agua se sitúa en el primer bloque de la primera extensión. 7 Práctica 5. Parte 3. Borrado de una tabla: DROP TABLE departamento CASCADE CONSTRAINTS; 8 La instrucción DROP TABLE borra una tabla y libera las extensiones que ocupaba. La opción CASCADE CONSTRAINTS borra las restricciones de clave ajena que hacen referencia a la tabla borrada. 8 Práctica 5. Parte 3. Implementación de una tabla: Tabla Agrupación Tabla organizada como índice (TOI) Ordenación de Filas Desordenadas Agrupadas Ordenadas 9 Las tres implementaciones posibles de la estructura tabla implican una distribución distinta de las filas en las extensiones (bloques) del segmento de tabla. En la implementación normal de una tabla como un fichero desordenado, inicialmente las filas se almacenan secuencialmente en las extensiones (bloques) del segmento. Cuando la tabla evoluciona, debido a actualizaciones y borrados, el orden de almacenamiento de las nuevas filas deja de ser secuencial, y es imposible influir en la distribución de las filas. En la implementación por agrupación (cluster), las filas de dos tablas relacionadas entre sí por algún campo (generalmente una clave ajena) se almacenan en una misma estructura. En este caso el servidor intenta almacenar todas las filas que tienen el mismo valor en el campo de agrupación en el mismo bloque. En la implementación como índice, las filas de la tabla se mantienen ordenadas según el campo de indexación. La estructura del índice (árbol B+) mantiene esta ordenación. 9 Práctica 5. Parte 3. Agrupación: Matrícula DNI ----101 102 102 102 101 101 ... Asig -----A41 A20 G78 N95 A56 W08 Alumno-Matrícula Nota ... -----10 9 8 6 9 10 Alumno DNI -----101 102 ... Fecha Nombre Sexo ----------- ---05-ENE-17 Rosa M 07-ENE-17 Ana M Ficheros Alumno y Matrícula Clave de agrupamiento (DNI) 101 Fecha Nombre 05-ENE-17 Rosa Asig Nota A41 10 A56 9 W08 10 102 Fecha Nombre 07-ENE-17 Ana Asig Nota A20 9 G78 8 N95 6 ... Sexo M Sexo M Fichero Mixto 10 La agrupación es una forma de implementación de tablas, en la que las filas de dos tablas relacionadas entre sí por algún campo (campo de agrupación), se almacenan en una misma estructura de datos (segmento). En el ejemplo aparecen a la izquierda las tablas Alumno y Matrícula, y a la derecha la implementación de ambas tablas como una agrupación. Se puede observar cómo las filas de ambas tablas que están relacionadas por el valor del campo de agrupación (dni) se almacenan juntas (se intentan almacenar en el mismo bloque). La gestión de las dos tablas implementadas como una agrupación se realiza de forma trasparente a su implementación. 10 Práctica 5. Parte 3. Tipos de agrupación: Campo de agrupación Agrupación indexada Agrupación con dispersión Función direccionamiento 11 En Oracle existen dos tipos de agrupación. la agrupación indexada, y la agrupación con direccionamiento calculado. La diferencia entre ambos tipos de agrupación reside en el mecanismo de acceso directo a las filas de la agrupación por el valor del campo de agrupación. En la agrupación indexada se utiliza un índice, definido sobre el campo de agrupación, para acceder a las filas. Una entrada del índice de agrupación contienen un valor del campo de agrupación y un puntero al bloque del segmento donde se almacenan las filas de ambas tablas que tienen dicho valor en el campo. En la agrupación con direccionamiento calculado, una función de direccionamiento calcula la dirección del bloque a partir del valor del campo de agrupación. Las filas de las tablas implementadas como una agrupación se almacenan en el mismo segmento. 11 Práctica 5. Parte 3. Creación agrupación indexada: 1. Crear la agrupación. CREATE CLUSTER alumno_clu (dni CHAR(10)) SIZE 200 TABLESPACE DATA01; 2. Crear el índice de agrupación. CREATE INDEX alumno_clu_idx ON CLUSTER alumno_clu TABLESPACE INDX01; 12 En la creación de la agrupación (cluster) el parámetro SIZE especifica el espacio necesario para almacenar todas las filas con un mismo valor en el campo de agrupación, y en consecuencia el número de valores distintos del campo de agrupación que podrán almacenarse en un bloque. Si no se especifica este parámetro, entonces Oracle asume por defecto un espacio de un bloque. 12 Práctica 5. Parte 3. Creación de agrupación con direccionamiento calculado: 1. Crear la agrupación. CREATE CLUSTER alumno_clu (dni CHAR(10)) SIZE 200 HASHKEYS 40000 TABLESPACE DATA01; 13 En la creación de una agrupación con direccionamiento calculado, el parámetro HASHKEYS indica el número de valores distintos del campo de agrupación. El parámetro SIZE tiene el mismo significado que en el caso de la agrupación indexada. Ambos parámetros permiten al servidor determinar el número de extensiones que se deben asignar en la creación de la agrupación. La función de dispersión se puede definir con la función HASH IS, pero las funciones proporcionadas por el Oracle por defecto funcionan muy bien. 13 Práctica 5. Parte 3. Creación de las tablas en la agrupación: 3. Crear las tablas en la agrupación. CREATE TABLE alumno (dni CHAR(10) CONSTRAINT alumno_pk PRIMARY KEY, fecha DATE, nombre VARCHAR2(40),sexo CHAR(1)) CLUSTER alumno_clu(dni); CREATE TABLE matrícula (dni CHAR(10) REFERENCES alumno, asig VARCHAR2(5) REFERENCES asignatura, nota NUMBER(3), CONSTRAINT matricula_pk PRIMARY KEY(dni,asig)) CLUSTER alumno_clu(dni); 14 14 Práctica 5. Parte 3. Implementación de una tabla como un fichero disperso: La agrupación se puede utilizar para implementar una tabla como un fichero disperso, con direccionamiento calculado. En este caso basta definir la agrupación e incluir en él sólo la tabla que se desee dispersar. La función de direccionamiento aplicada a un valor de la clave de direccionamiento devuelve el bloque donde se almacena la fila con ese valor de clave. 15 15 Práctica 5. Parte 3. Tablas implementadas como índices (TOI): Acceso indexado a una tabla Acceso a una tabla organizada como índice ROWID Columnas no clave Columna clave Cabecera de fila 16 Los índices son estructuras de datos que permiten el acceso directo y ordenado a las filas de la tabla por un campo de indexación. En una tabla implementada como un índice (árbol B) las filas de la tabla se almacenan en los nodos‐hoja del índice, junto al campo de indexación (clave primaria de la tabla). Los nodos internos sirven para organizar y distribuir los valores de la clave en el índice. 16 Práctica 5. Parte 3. Tablas implementadas como índices (TOI): CREATE TABLE empleado( empno NUMBER(4) PRIMARY KEY, nombreVARCHAR2(30) depto NUMBER(2) REFERENCES departamento) ORGANIZATION INDEX TABLESPACE data01 PCTTHRESHOLD 20 OVERFLOW TABLESPACE data02; Las filas de la tabla se almacenan como un fichero ordenado. 17 El parámetro PCTTHRESHOLD indica el porcentaje de espacio reservado en un bloque de nodo‐ hoja para almacenar una fila de la tabla. Si una fila excede el tamaño determinado por PCTTHERESHOLD, entonces la fila es partida en dos fragmentos, el primer fragmento se almacena en un bloque de un nodo‐hoja, y el segundo fragmento en un bloque de desborde, ambos fragmentos están ligados por un puntero. 17 Práctica 5. Parte 3. Desbordamiento de filas en una TOI: Tablespace de TOI Tablespace de desbordamiento Bloque Filas más grandes que PCTTHRESHOLD Filas de tamaño menor o igual que PCTTHRESHOLD 18 18 Práctica 5. Parte 3. Definición de tablas en el SQL Developer: 19 19 Práctica 5. Parte 3. Resumen: Formato de registro (distribución de los campos en el registro) Aspectos físicos (de los segmentos) Formato de bloque (distribución de los registros en el bloque) ‒ registros de longitud variable ‒ cabecera de registro: nro. de campos almacenados ‒ longitud de cada campo almacenada ‒ directorio (posición relativa) de los registros en la cabecera del bloque ‒ compactación periódica del espacio ocupado en el bloque ‒ organización extendida (Oracle) Directorio de bloques (distribución de los bloques del segmento en el tablespace) ‒ diccionario del sistema: dirección (relativa) y tamaño (bloques) de las extensiones en el tablespace 20 20 Práctica 5. Parte 3. Resumen: Fichero desordenado (segmento de tabla) (secuencia determinada por el orden de inserción) Fichero disperso: clúster de una única tabla Aspectos lógicos (tipos de segmentos) (segmento de agrupación) (secuencia determinada por una función de direccionamiento) Fichero mixto: clúster de varias tablas (segmento de agrupación) (Diseñador de la BD) (secuencia determinada por la relación entre campos de dos tablas) Fichero ordenado: tabla implementada como índice (segmento de índice) (secuencia determinada por el campo de indexación) 21 21 Tecnología de Bases de Datos Práctica 6 Optimización de consultas en Oracle Profesores: Laura Mota y Mª José Vicent Curso: 2019‐2020 1 Práctica 6. Objetivos: Conocer la estrategia de optimización de Oracle: basada en reglas y en costes. Conocer las operaciones básicas que intervienen en la ejecución de una consulta. Conocer las estructuras físicas que intervienen en las decisiones del optimizador. Conocer la forma de intervenir en las decisiones del optimizador (HINT). Saber cómo hacer un buen uso de la optimización. 2 2 Práctica 6. Introducción al optimizador en Oracle: A partir de la versión 12c, el optimizador de Oracle es adaptativo: el plan de ejecución diseñado ante una consulta puede cambiarse durante la ejecución de la misma usando estadísticas más afinadas de los datos que se detectan en tiempo de ejecución. El optimizador usa este método si el parámetro OPTIMIZER_ADAPTIVE_FEATURES es TRUE. Cambio del valor del parámetro: Conectado como sys ejecutar: ALTER SYSTEM SET optimizer_adaptive_features=FALSE scope=BOTH; Desde el el SQL Plus Apagar el servidor (shutdown) y levantarlo de nuevo (startup). 3 Las prácticas de optimización se van a hacer sin tener activada la opción de adaptación de planes. Esta opción, muy útil por otra parte, complica mucho la comprensión de los conceptos básicos del optimizador que es el objetivo de la práctica. 3 Práctica 6. Introducción al optimizador en Oracle: El plan de ejecución indica: Las tablas a las que se accede y la forma de acceso (camino de acceso). El orden de las operaciones. El método de concatenación. 4 4 Práctica 6. Introducción al optimizador en Oracle: Cómo se visualiza el plan de ejecución: Con la herramienta SQL Developer: • En una Hoja de Trabajo SQL se escribe la consulta. • Con el botón superior "Explicación del Plan". • El plan aparece en la ventana de salida "Explicación del Plan". • En Herramientas>Preferencias‐‐Bases de Datos > Rastreo Automático/Explicación del Plan se configura la información que se muestra. 5 El plan propuesto por Oracle también puede visualizarse en una Hoja de Trabajo SQL se escribe la consulta precedida de EXPLAIN PLAN FOR. Una vez ejecutada la consulta, el plan puede visualizarse haciendo uso de la función DISPLAY del paquete administrativo DBMS_XPLAN. 5 Práctica 6. Introducción al optimizador en Oracle: Configuración de la pantalla de Explicación del Plan 6 La segunda alternativa para visualizar el plan se muestra en la figura de abajo: 6 Práctica 6. Introducción al optimizador en Oracle: En el plan de ejecución se obtiene la siguiente información: Operación: acceso a tabla, acceso a índice,… Objeto al que se le aplica la operación. Opción elegida. Coste estimado: que permite comparar varias opciones (no es ni tiempo ni bloques). Cardinalidad esperada del resultado. 7 7 Práctica 6. Caminos de acceso a tablas y concatenación de tablas: Existen diferentes formas de resolver una consulta Distintos caminos de acceso a las tablas. Distintas alternativas para ejecutar las concatenaciones de tablas. 8 Las consultas en SQL se pueden resolver internamente de muchas formas posibles. De todas las operaciones que pueden aparecer en una consulta analizaremos dos tipos: • Operaciones que se resuelven accediendo a una única tabla: selección, ordenación, agrupación, etc. Para resolver estas operaciones existen distintas alternativas, dependiendo de los caminos de acceso a la tabla disponibles. • Operaciones que se resuelven accediendo a más de una tabla: estas operaciones requieren la concatenación de dos o más tablas. Existen diversas alternativas para realizar la concatenación de tablas. 8 Práctica 6. Caminos de acceso a una tabla: Distintas formas de acceder a las filas de una tabla FULL: barrido completo de tabla (acceso a todas las filas de la tabla en secuencia). Acceso por ROWID proporcionado por un índice definido sobre la tabla: • BY ROWID: por cada entrada del índice se accede a la fila de la tabla. • BY INDEX ROWID BATCHED: se recuperan unos cuantos ROWID del índice, se ordenan y luego se accede a las filas con esto se pueden reducer los accesos a los bloques de las filas de la tabla. 9 En Oracle pueden existen varios caminos de acceso a las filas de una tabla. Algunos de ellos dependen de la existencia o no de índices definidos sobre la tabla que sean utilizables para la ejecución de la consulta. 9 Práctica 6. Barrido completo de una tabla: Se usa cuando: Por la forma de la consulta la tabla debe ser revisada completamente (SELECT * FROM tabla). La tabla es pequeña (centenares de bloques). No hay índices útiles para la consulta. Hay índices útiles para la consulta, pero el número esperado de filas a recuperar es tan alto que el coste de usar los índices es superior al coste de hacer un barrido completo de la tabla. 10 El Barrido Completo se usa en distintas circunstancias como se comenta en la transparencia. Es conveniente aclarar el último caso. Esto significa que, en el índice, muchas entradas cumplirán la condición de la búsqueda y para cada una de ellas habrá que recuperar la fila asociada. Es decir, para cada entrada habrá que recuperar, en principio, un bloque diferente de la tabla donde esta la correspondiente fila. Esto implica que el número total de bloques accedidos será mayor que si se realizara un barrido completo de la tabla, siendo, por lo tanto, más caro el uso del índice. 10 Práctica 6. Barrido completo de una tabla: • Like '%...' no puede usar índices • La tabla Empleados tiene 107 filas. • El optimizador estima que van a ser devueltas 2 filas. 11 Existen algunas condiciones en las que no se puede hacer uso de los índices: • Operador LIKE. • Condiciones en las que en uno de los operandos aparece una función sobre una columna. • Cuando el factor de agrupación es alto y tiende a ser igual que el número de filas de la tabla • Cuando es un índice de baja selectividad. 11 Práctica 6. Recorrido de un índice: Hay distintas maneras de buscar las entradas deseadas en un índice: UNIQUE SCAN: acceso a una entrada en un índice único. RANGE SCAN: barrido de rango en un índice recuperando todas las entradas que cumplen la condición. SKIP SCAN: recorrido no completo de un índice multicolumna (compuesto) sin conocer algunos de los valores de las primeras columnas. FULL SCAN: recorrido completo de todas las entradas del índice. 12 12 Práctica 6. UNIQUE SCAN: índice único sobre employee_id 13 • • Con el índice sobre employee_id se encuentra el ROWID de la fila (como mucho una) con ese valor en ese atributo. Se encuentra la fila de Empleado usando ese ROWID. 13 Práctica 6. RANGE SCAN: índice no único sobre job_id 14 • Con el barrido del índice se encuentra las entradas que cumplen la condición, de igualdad que, como el índice no es único, pueden ser varias. • A partir de esas entradas, y con el ROWID de las filas, se realiza una búsqueda por ROWID en la tabla. 14 Práctica 6. FULL SCAN: índice no único sobre last_name+first_name 15 En este caso, no hace falta realizar la búsqueda por ROWID en la tabla, ya que las columnas de la selección están todas en los registros del índice. En el ejemplo, la clave del índice “NOMBRE_ISDX" está compuesta por "last_name“ y "first_name” por tanto para resolver la consulta basta realizar un barrido completo sobre este índice. Existe otra opción de recorrido completo del índice : • FAST FULL SCAN: es más rápido que el FULL SCAN por cómo realiza la I/O de los bloques. 15 Práctica 6. SKIP SCAN: índice no único sobre manager_id+department_id 16 • No se proporciona valor para la primera columna del índice compuesto (manager_id,department_id) , pero aún así se resuelve la consulta sin recorrer todo el índice. • Esta opción es mejor que el FULL SCAN ya en principio no recorre todo el índice sino que ejecuta la consulta para los distintos valores de la primera columna (manager_id) y luego hace la unión de las resultados obtenidos. 16 Práctica 6. Concatenación: Para realizar la concatenación el optimizador decide: Orden de concatenación: a qué tabla se accede primero y a qué tabla se accede en segundo lugar Método de concatenación: • Bucles anidados (NESTED LOOPS) • Por fusión (MERGE JOIN) • Por direccionamiento calculado (HASH JOIN) 17 La concatenación se realiza en diversos tipos de consultas: • FROM con varias tablas y condición en el WHERE con una comparación que permite realizar la concatenación. • JOIN en el FROM. • Subconsultas que se resuelven con una concatenación entre una de las tablas de la consulta externa y una de la subconsulta. Hay que observar que en Oracle no existe el método de bucle único comentado en Tema 9. 17 Práctica 6. NESTED LOOPS: bucles anidados Para cada fila en la tabla del bucle externo: Buscar todas las filas de la tabla del bucle interno que coinciden. A veces en vez de una tabla se puede usar un índice para realizar el recorrido. 18 18 Práctica 6. NESTED LOOPS: bucles anidados • En el bucle externo se recorre Clientes. • En el bucle interno, para cada cliente se recorre Ventas. 19 En este ejemplo se ha usado una pista (HINT) para forzar el uso de de bucles anidados. Estas pistas se verán más adelante. 19 Práctica 6. MERGE JOIN: fusión Ordenar cada tablas sobre las columnas de la concatenación. Recorrer las tablas ordenadas y de una pasada realizar la concatenación Si una de las dos tablas tiene un índice sobre la columna de concatenación se evita una ordenación y es más probable que se elija este método. 20 20 Práctica 6. MERGE JOIN: fusión • Se ordenan (SORT) las tablas Clientes y Ventas. • Se funden las tablas ordendas (MERGE JOIN) 21 En este ejemplo se ha usado una pista (HINT) para forzar la concatenación por fusión. Estas pistas se verán más adelante. 21 Práctica 6. HASH JOIN: concatenación por direccionamiento calculado Con la tabla más pequeña se crea en memoria una tabla hash basada en la clave de concatenación. La tabla más grande se recorre en una barrido completo y para cada una de sus filas se busca en la tabla hash las filas que coinciden. 22 22 Práctica 6. HASH JOIN: concatenación por direccionamiento calculado • Se crea una tabla hash para Clientes (para ello hace un recorrido completo de la tabla). • Se recorre Ventas con un barrido completo. 23 En este ejemplo no se ha usado ninguna pista (HINT) porque es el método elegido por Oracle ya que es el método que menor coste supone. 23 Práctica 6. Funcionamiento y configuración del optimizador en Oracle: A partir de Oracle 12c, es un AQO (Adaptive Query Opimizer). Con el parámetro OPTIMIZER_ADAPTIVE_FEATURES a falso e un CBO (Cost Based Optimizer) pero también con aspectos heurísticos. Su comportamiento depende de: Parámetro inicialización OPTIMIZER_MODE. Estadísticas en el diccionario de datos. Pistas (HINTS). 24 24 Práctica 6. Parámetro OPTIMIZER_MODE: Los valores más relevantes son: ALL_ROWS: valor por defecto • El optimizador funcionará basado en costes para todas las instrucciones que se ejecuten. • Orientado a obtener todas las filas con el menor gasto de recursos • Adecuado para sistemas no afinados y con procesos en lotes que manejan grandes volúmenes FIRST_ROWS: • El optimizador usa una mezcla de costes y heurístico para encontrar el mejor plan para una respuesta rápida de la primeras filas. • Adecuado para sistemas que procesan muchas transacciones pequeñas. 25 Otros valores: • FIRST_ROWS_1, FIRST_ROWS_10, FIRST_ROWS_100, FIRST_ROWS_1000: El optimizador funcionará basado en costes y optimiza con el objetivo de el mejor tiempo de respuesta para obtener las filas indicadas. 25 Práctica 6. Estadísticas: El optimizador intenta estimar el coste real de ejecutar las instrucciones (cpu, memoria, operaciones, i/o, etc.). Usa estadísticas almacenadas para los distintos objetos que intervienen en la ejecución de las operaciones para estimar el coste. Tipos de estadísticas: De tabla. De columna. De índice. Histogramas de columna. 26 Las estadísticas de Histograma de columna no se van a ver. 26 Práctica 6. Estadísticas de tabla: Estadísticas de tabla incluyen: Número de filas. Número de bloques. Número de bloques libres. Longitud promedio de la fila. Número de filas encadenadas. … Se pueden consultar en la vista USER_TAB_STATISTICS 27 27 Práctica 6. Estadísticas de columna: Estadísticas de columna incluyen: Valor mínimo. Valor máximo. Número de valores distintos. Densidad: tiene que ver con la selectividad, se usa en las concatenaciones. Número de nulos. Número de cubos. … Se pueden consultar en la vista USER_TAB_COL_STATISTICS 28 28 Práctica 6. Estadísticas de índice: Estadísticas de índice incluyen: Nivel del B‐árbol. Número de bloques hojas. Número de claves distintas. Promedio de bloques hoja por valor de clave. Promedio de bloques de datos por valor de clave. Número de entradas. … Se pueden consultar en la vista USER_IND_STATISTICS 29 29 Práctica 6. Recopilación de estadísticas: 30 La recopilación de estadísticas también puede hacerse manual mediante la instrucción ANALYZE TABLE… 30 Práctica 6. HINTS: pistas Las instrucciones pueden incluir pistas para dirigir al optimizador. Se incluyen en las instrucciones de acceso: SELECT, UPDATE, INSERT, DELETE. Las pistas empiezan con /*+ y terminan con */ Pueden incluirse en subconsultas y en vistas. El optimizador ignora las pistas si: No tienen sentido en la instrucción. Entran en conflicto entre ellas. No tienen una sintaxis correcta. 31 31 Práctica 6. HINTS: pistas Pistas sobre el camino de acceso: FULL: barrido completo de tabla. ROWID: acceso a tabla por el ROWID de una fila. HASH: barrido por direccionamiento calculado (sólo para tablas agrupadas). INDEX: acceso a tabla usando un índice. … Pistas sobre la concatenación: ORDERED: fuerza a concatenar las tablas en el orden que aparecen en la cláusula FROM. USE_MERGE, USE_NL, USE_HASH: indica la forma de realizar la concatenación. 32 Otras pistas: • Pistas sobre el modo global del optimizador: ALL_ROWS, FIRST_ROWS, FIRST_ROWS_10, …: el efecto es el mismo que se vio para el parámetro de inicialización OPTIMIZER_MODE, pero para la instrucción donde se incluir la pista. • Pistas de transformación de consultas: • USE_CONCAT: reescribe una consulta OR en una UNION ALL • MERGE: fusiona una vista en una consulta • NO_MERGE: deshabilita barrido de agrupación (sólo para tablas agrupadas) 32 Práctica 6. Reglas básicas para la optimización: 1. Comprueba el plan de ejecución de la instrucción: Actualizar las estadísticas. Crear índices. Proporcionar pistas al optimizador: sólo si se tiene claro. 2. Comprueba la salida AUTOTRACE. 3. Instrucciones de con un uso intensivo. 4. Resolviendo problemas típicos. 33 33 Práctica 6. AUTOTRACE: SQL Developer Conectado como sys 34 34 Práctica 6. AUTOTRACE: información obtenida recursive calls: número de instrucciones adicionales SQL fueron ejecutadas. db block gets: número de bloques que fueron procesados (lectura) en memoria en acceso actual (current). physical reads: número de bloques leídos del disco. redo size: cantidad de información de deshacer generada. bytes enviados y recibidos vía SQL*NET. sorts: ordenaciones en memoria y en disco. rows processed: número de filas procesadas para la instrucción. 35 En la transparencia se muestran algunas de las informaciones obtenidas, no todas. 35 Práctica 6. Reglas básicas de optimización: Instrucción SELECT de computación larga: Gran número de llamadas recursivas (subconsultas complejas). Gran número de recuperaciones consistentes. Gran número de lecturas físicas: mucho uso del disco. Gran número de datos recibidos por la red: mucho uso de la red. Muchas ordenaciones. Solución: Gran número de lecturas físicas: • La cache BD es muy pequeña: ampliarla. • Muchos rastreos completos en las consultas: crear índices. Gran cantidad de datos recibidos por la red: • Los resultados de las consultas los procesa el cliente: revisar la configuración de la conexión entre cliente y servidor. Muchas ordenaciones: • Existen ORDER BY, GROUP BY, DISTINCT en una consulta sobre una tabla sin índices: crear índices sobre los atributos relevantes. 36 36 Práctica 6. Reglas básicas de optimización: Instrucción UPDATE o DELETE de computación larga: Gran número de recuperaciones de bloques. Gran número de lecturas físicas: mucho uso del disco. Generación de mucha información de deshacer. Solución: Dividir la instrucción en varias transacciones. Ejecutar la instrucción como una instrucción por lotes cuando haya poca carga. Considerar la reconstrucción de la aplicación que ejecuta dicha instrucción. Comprobar si la condición del WHERE es compleja y de ejecución larga. 37 37 Tecnología de Bases de Datos Práctica 7 Seguridad en Oracle Profesores: Laura Mota y Mª José Vicent Curso: 2019‐2020 1 Práctica 7. Objetivos: Estudiar los recursos para la definición de la seguridad en Oracle: usuarios, privilegios, roles y perfiles. Estudiar la creación de usuarios. Estudiar la concesión de privilegios: tipos de privilegios y concesión con el uso de roles. Estudiar la utilidad de los perfiles: control de recursos del sistema y de palabras de paso. 2 Los contenidos necesarios para la realización de esta práctica se desarrollan en el Tema 5 del programa de teoría. 2 Práctica 7. Seguridad en Oracle: Privilegios directos Tablespace por defecto Privilegios por roles Tablespace temporal USUARIOS Bloqueo de cuentas Palabras de paso Cuotas en tablepaces Límites de recursos 3 La gestión de la seguridad en un servidor Oracle comprende todos los aspectos relacionados con la creación de usuarios: • Gestión de contraseñas (tiempo de expiración, intentos fallidos en el uso de la contraseña, complejidad de la contraseña, reutilización de contraseñas, …) • Restricciones en el uso de recursos del sistema por parte del usuario (CPU, sesiones abiertas, tiempo de conexión, operaciones de lectura, …) • Concesión de privilegios (permisos) a los usuarios para realizar acciones en el servidor: privilegios genéricos, o privilegios sobre objetos de usuario. • Asignación de espacio en disco a los usuarios. 3 Práctica 7. Usuario: esquema de base de datos En Oracle no existe el concepto de esquema de base de datos relacional. Todos los objetos creados por un usuario constituyen su esquema de base de datos. usuario esquema Nominación de los objetos de un esquema (usuario): usuario.objeto 4 Como ya se ha comentado en otras ocasiones, en Oracle no existe el concepto de esquema de base de datos relacional. Se entiende por esquema de base de datos (de un usuario), el conjunto de todos los objetos de los que un usuario es propietario. 4 Práctica 7. Usuario: tipos de objetos en su esquema Tablas: Disparadores. Restricciones. Índices. Vistas. Secuencias. Unidades de programación almacenadas (PL/SQL). Tipos de datos definidos por el usuario. … 5 Oracle es un SGBD relacional, y por lo tanto los tipos de objetos de base de datos que puede crear un usuario son los comunes en bases de datos relacionales: tablas, vistas, disparadores, … 5 Práctica 7. Usuario: elementos asociados Palabra de paso. Tablespace por defecto: tablespace donde se almacenarán los objetos del usuario cuando éste no especifica explícitamente otro tablespace en la creación. Tablespace temporal: tablepace utilizado por los procesos servidores de las sesiones del usuario para realizar tareas de ordenación de datos. Cuotas en los tablespace de tablas: limitan el espacio que el usuario puede utilizar en los tablespace que tiene asignados. Privilegios: directos y por roles. Perfil: límites en el uso de recursos del sistema. 6 Un usuario puede ser creado por un usuario que tenga el correspondiente privilegio de sistema (CREATE USER) o por un usuario administrador (con el rol DBA que incluye todos los privilegios de sistema). Instrucción SQL: CREATE USER usuario IDENTIFIED BY contraseña [DEFAULT TABLESPACE tablespace] [TEMPORARY TABLESPACE tablespace] [QUOTA {entero|UNLIMITED} ON tablespace]… [PASSWORD EXPIRE] [ACCOUNT {LOCK |UNLOCK}] [PROFILE {perfil|DEFAULT}] 6 Práctica 7. Usuario: creación en SQL Developer 7 En el asistente de creación (Crear Nueva) de un usuario en SQL Developer, en la pestaña de información general (Usuario), se puede especificar: • Nombre del usuario. • Contraseña (inicial). • Vencimiento (opcional) de la contraseña para que el usuario la cambie al conectarse por primera vez. • Bloqueo (opcional) de la cuenta de usuario, el administrador deberá desbloquearla para que el usuario la pueda utilizar. • Tablespace por defecto. • Tablespace temporal. Una vez creado un usuario, estos parámetros se pueden cambiar con la opción Editar, el usuario se puede borrar con la opción Borrar Usuario. Algunos de los parámetros se pueden cambiar discrecionalmente. 7 Práctica 7. Perfil: Conjunto de restricciones (límites) de uso de los recursos del sistema y de la palabra de paso del usuario. Se asigna al usuario en su creación o en su modificación. Puede ser un perfil por defecto (perfil DEFAULT). Privilegios Tablespace directos por defecto Privilegios de roles Usuarios Tablespace temporal Cuotas en tablespaces Bloqueo de cuentas Palabras de paso Límites recursos Perfil 8 La definición de un perfil permite agrupar (y nominar) un conjunto de restricciones (límites) en el uso de los recursos del sistema por parte del usuario, y unas limitaciones en el uso de la palabra de paso del usuario. En la transparencia siguiente se muestran algunos ejemplos de este tipo de restricciones. Un usuario puede tener asignado un único perfil. Existe el perfil por defecto (DEFAULT). El perfil se asigna en la creación (o modificación) del usuario. 8 Práctica 7. Perfil: ejemplos de restricciones Recursos del sistema Palabra de paso (sesión de usuario) (usuario) Tiempo de conexión Tiempo de vida Tiempo de CPU Nro. de intentos Tiempo de inactividad Función de verificación de contraseñas Nro. de bloques de datos leídos Bloqueo de cuentas … … 9 9 Práctica 7. Perfil: SQL Developer 10 10 Práctica 7. Perfil: asociación a un usuario En SQL Developer no se puede asignar un perfil a un usuario a través de sus herramientas, hay que utilizar la instrucción ALTER USER nom_perfil PROFILE nom_usuario desde una hoja de trabajo de un usuario administrativo. Al borrar un perfil, todos los usuarios que lo tuvieran asignado pasarían a tener el perfil DEFAULT. 11 11 Práctica 7. Privilegios: Un privilegio es un permiso concedido al usuario para realizar un tipo de acción en el servidor. Tipos de privilegios: • Privilegios de sistema: permiten a los usuarios realizar acciones (genéricas) en el servidor. • Privilegios de objeto: permiten a los usuarios realizar operaciones sobre objetos de datos de usuarios. 12 Un privilegio es un permiso concedido a un usuario para realizar un tipo de acción (operación) en el servidor. Las acciones pueden ser relativas a la sesión de trabajo, o a objetos de base de datos. Los privilegios pueden ser genéricos (de sistema), es decir independientes de cualquier objeto (Ej. El privilegio de crear tablas: CREATE TABLE), o específicos (de objeto) para un objeto concreto (Ej. El privilegio de hacer inserciones en tabla1 del usuario usuario1: INSERT ON usuario1.tabla1). Los privilegios se pueden conceder y revocar a los usuarios dinámicamente. En SQL las instrucciones para otorgar y revocar privilegios son: • Instrucción GRANT: permite otorgar un privilegio a un usuario o a un grupo de usuarios: GRANT privilegio,… TO usuario, … • Instrucción REVOKE: permite revocar un privilegio otorgado a un usuario o a un grupo de usuarios: REVOKE privilegio, … FROM usuario, … 12 Práctica 7. Privilegios de sistema: Los privilegios de sistema son genéricos, es decir independientes del objeto. Existen unos 80 privilegios de sistema: • Acciones relativas a la sesión del usuario (Ej. CREATE SESSION). • Acciones relativas a objetos de base de datos (Ej. CREATE VIEW). ANY: esta opción permite realizar la acción en cualquier esquema de usuario. (Ej. CREATE ANY TABLE). 13 Un usuario puede recibir privilegios de sistema de un usuario administrador (o con privilegio para la creación de usuarios) durante la creación o la modificación del usuario. Para que un usuario (no autorizado para crear usuarios) pueda conceder un privilegio de sistema a otro usuario, debe haber recibido ese mismo privilegio con opción de trasferencia : WITH ADMIN OPTION en SQL (opción Admin en SQL Developer). GRANT privilegio, … TO usuario, … WITH ADMIN OPTION La revocación de un privilegio de sistema, concedido con opción de trasferencia, no tiene efecto en cascada, es decir no implica la revocación de dicho privilegio a los usuarios que lo han recibido transitivamente. 13 Práctica 7. Privilegios de sistema: Ejemplos Categoría Ejemplos de privilegio Index CREATE ANY INDEX ALTER ANY INDEX DROP ANY INDEX Table CREATE TABLE CREATE ANY TABLE ALTER ANY TABLE DROP ANY TABLE SELECT ANY TABLE UPDATE ANY TABLE DELETE ANY TABLE Session CREATE SESSION ALTER SESSION RESTRICTED SESSION Tablespace CREATE TABLESPACE ALTER TABLESPACE DROP TABLESPACE UNLIMITED TABLESPACE … … 14 14 Práctica 7. Privilegios de sistema: SQL Developer 15 En el asistente para la creación (o modificación) de un usuario, en la pestaña Privilegios de Sistema se pueden asignar al usuario los privilegios que se desee con (opcional) opción de trasferencia (Admin). 15 Práctica 7. Privilegios de sistema: SQL Developer 16 En el asistente para la creación (o modificación) de un usuario, en la pestaña Privilegios de Sistema se pueden asignar al usuario los privilegios que se desee con (opcional) opción de trasferencia (Admin). 16 Práctica 7. Privilegios de sistema: SQL Developer 17 En el asistente para la creación (o modificación) de un usuario, en la pestaña Privilegios de Sistema se pueden asignar al usuario los privilegios que se desee con (opcional) opción de trasferencia (Admin). 17 Práctica 7. Privilegios de objeto: Ejemplos Privilegio Tabla ALTER DELETE Vista Secuencia Procedimiento EXECUTE INDEX INSERT REFERENCES SELECT UPDATE Los privilegios de objeto permiten a los usuarios realizar operaciones sobre objetos de base de datos de los usuarios. 18 Los privilegios de objeto permiten realizar operaciones sobre objetos de base de datos de usuarios. El propietario del objeto puede otorgar y revocar estos permisos. Para que un usuario (no propietario del objeto) pueda conceder un privilegio sobre un objeto a otro usuario, debe haber recibido ese mismo privilegio con opción de trasferencia: WITH GRANT OPTION en SQL (opción Otorgar en SQL Developer). GRANT operación, … TO usuario, … WITH GRANT OPTION La revocación de un privilegio de objeto, concedido con opción de trasferencia, tiene un efecto en cascada, es decir implica la revocación del mismo privilegio a todos los usuarios que lo han recibido transitivamente. 18 Práctica 7. Privilegios de objeto: SQL Developer 19 En SQL Developer el propietario de un objeto, en la ventana de navegación de esquemas, puede otorgar (Otorgar) o revocar (Revocar) privilegios (Privilegios) sobre el objeto, a otros usuarios. Para que un usuario (no propietario del objeto) pueda conceder un privilegio sobre un objeto a otro usuario, debe haber recibido ese mismo privilegio con opción de trasferencia: WITH GRANT OPTION en SQL (opción Otorgar en SQL Developer). GRANT operación, … TO usuario, … WITH GRANT OPTION La revocación de un privilegio de objeto, concedido con opción de trasferencia, tiene un efecto en cascada, es decir implica la revocación del mismo privilegio a todos los usuarios que lo han recibido transitivamente. 19 Práctica 7. Privilegios de objeto: SQL Developer 20 20 Práctica 7. Privilegios de objeto: SQL Developer 21 21 Práctica 7. Rol: Un rol es un conjunto nominado de privilegios (de sistema o de objeto), y/o roles. La definición de un rol simplifica la tarea de concesión y gestión de privilegios de los usuarios. Un rol puede ser creado por un usuario con el correspondiente privilegio de sistema (CREATE ROLE) o un administrador (rol DBA). 22 En SQL las instrucciones para otorgar y revocar roles a los usuarios son: Instrucción GRANT: permite otorgar un rol a un usuario o a un grupo de usuarios Instrucción REVOKE: permite revocar un rol otorgado a un usuario o a un grupo de usuarios. GRANT rol,… TO usuario, … REVOKE rol, … FROM usuario, … Un rol se puede conceder a un usuario con opción de trasferencia, WITH ADMIN OPTION en SQL, con el mismo significado que en la concesión de privilegios de sistema. GRANT rol, … TO usuario, … WITH ADMIN OPTION Un rol puede ser borrado por su creador o por cualquier usuario que lo haya recibido con opción ADMIN. Instrucción SQL: DROP ROL 22 Práctica 7. Rol: ejemplos Usuarios A Rol_Dirección Roles Privilegios SELECT ON EMP CREATE TABLE C B Rol_Empleado INSERT ON EMP CREATE SESSION Rol: conjunto de privilegios (de sistema o de objeto) UPDATE ON EMP 23 23 Práctica 7. Rol: beneficios Simplifican la asignación discrecional de privilegios a los usuarios. Permiten una gestión de privilegios dinámica. Ofrecen una disponibilidad de privilegios selectiva. Revocación no en cascada. 24 La definición de roles en el servidor tiene las siguientes ventajas: • Simplifican la concesión discrecional de privilegios: usuarios con las mismas características de uso del servidor, pueden recibir el mismo conjunto de privilegios a través de un rol. • Gestión de privilegios dinámica: si para un colectivo de usuarios se desea modificar el conjunto de privilegios concedidos, el uso de un rol permite hacer este cambio de una forma centralizada. • Disponibilidad de privilegios selectiva: los privilegios concedidos a un usuario, por medio de un rol, se pueden revocar temporalmente deshabilitando el rol y volviéndolo a habilitar más tarde. • Revocación no en cascada: la revocación de un rol no provoca la revocación en cascada de los privilegios de objeto incluidos en el rol. 24 Práctica 7. Rol: SQL Developer 25 En la creación del rol (Crear Nueva) se especifican los privilegios de sistema y (otros) roles que componen el rol. En la creación de un rol se puede especificar (opcional) una contraseña para identificarse en la habilitación y deshabilitación del rol. 25 Práctica 7. Roles predefinidos en Oracle: Nombre del rol Descripación CONNECT Permite la conexión al servidor. RESOURCE Permite la creación de objetos (tablas, índices,…). DBA Reúne todos los privilegios de sistema. Estos privilegios los puede transmitir (tiene WITH ADMIN OPTION). … … 26 Los tres roles predefinidos que aparecen en la trasparencia son los más utilizados en Oracle. Los roles CONNECT y RESOURCE son los roles básicos que debe poseer un usuario para realizar tareas básicas de base de datos. Un usuario con el rol DBA tiene todos los privilegios de sistema con opción de trasferencia, es un usuario administrador. 26 Práctica 7. Rol: roles por defecto del usuario 27 Los roles asignados a un usuario (en la creación o modificación) con la opción Valor por defecto (DEFAULT) son habilitados automáticamente cuando el usuario se conecta al servidor. En la creación del usuario (Crear Nuevo) todos los roles asignados al usuario serán con valor por defecto. En la modificación del usuario (Editar) esta propiedad se puede cambiar. 27 Práctica 7. Rol: habililtar y deshabilitar roles Habilitar y deshabilitar roles en la sesión de usuario. Deshabilitar un rol para revocar temporalmente privilegios. Habilitar un rol para obtener temporalmente privilegios. Instrucción SQL: SET ROLE Los roles por defecto se habilitan en la conexión. Si el rol tiene palabra de paso se solicitará en el momento de su habilitación manual (SET ROLE). 28 Durante la sesión de trabajo, el usuario puede habilitar y deshabilitar los roles que tiene concedidos, con el efecto de disponer o perder temporalmente algunos privilegios. Instrucción SQL: SET ROLE rol [IDENTIFIED BY contraseña] 28