unidad 3 abd

24
3. Configuración y administración del espacio en disco Una partición de disco, en mantenimiento, es el nombre genérico que recibe cada división presente en una sola unidad física de almacenamiento de datos. Toda partición tiene su propio sistema de archivos (formato); generalmente, casi cualquier sistema operativo interpreta, utiliza y manipula cada partición como un disco físico independiente, a pesar de que dichas particiones estén en un solo disco físico. Una partición de un disco duro es una división lógica en una unidad de almacenamiento, en la cual se alojan y organizan los archivos mediante un sistema de archivos. Existen distintos esquemas de particiones para la distribución de particiones en un disco. Para la gestión del almacenamiento de una base de datos existen 4 conceptos bien definidos que deben ser conocidos para poder comprender la forma en la que se almacenan los datos. Vamos a ver la diferencia entre bloque, extensión, segmento y espacio de tablas. 3.1 Estructuras lógicas de almacenamiento Para la gestión del almacenamiento de una base de datos existen 4 conceptos bien definidos que deben ser conocidos para poder comprender la forma en la que se almacenan los datos. Vamos a ver la diferencia entre bloque, extensión, segmento y espacio de tablas. Bloques: Se tratan de la unidad más pequeña. Generalmente debe múltiple del tamaño de bloque del sistema operativo, ya que es la unidad mínima que va a pedir Oracle al sistema operativo. Si no fuera múltiple del bloque del sistema se añadiría un trabajo extra ya que el sistema debería obtener más datos de los estrictamente necesarios. Se especifica mediante DB_BLOCK_SIZE

Upload: dafne-navarrete

Post on 02-Jan-2016

48 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Unidad 3 Abd

3. Configuración y administración del espacio en disco

Una partición de disco, en mantenimiento, es el nombre genérico que recibe cada división presente en una sola unidad física de almacenamiento de datos. Toda partición tiene su propio sistema de archivos (formato); generalmente, casi cualquier sistema operativo interpreta, utiliza y manipula cada partición como un disco físico independiente, a pesar de que dichas particiones estén en un solo disco físico.

Una partición de un disco duro es una división lógica en una unidad de almacenamiento, en la cual se alojan y organizan los archivos mediante un sistema de archivos. Existen distintos esquemas de particiones para la distribución de particiones en un disco.

Para la gestión del almacenamiento de una base de datos existen 4 conceptos bien definidos que deben ser conocidos para poder comprender la forma en la que se almacenan los datos. Vamos a ver la diferencia entre bloque, extensión, segmento y espacio de tablas.

3.1 Estructuras lógicas de almacenamiento

Para la gestión del almacenamiento de una base de datos existen 4 conceptos bien definidos que deben ser conocidos para poder comprender la forma en la que se almacenan los datos. Vamos a ver la diferencia entre bloque, extensión, segmento y espacio de tablas.

Bloques: Se tratan de la unidad más pequeña. Generalmente debe múltiple del tamaño de bloque del sistema operativo, ya que es la unidad mínima que va a pedir Oracle al sistema operativo. Si no fuera múltiple del bloque del sistema se añadiría un trabajo extra ya que el sistema debería obtener más datos de los estrictamente necesarios. Se especifica mediante DB_BLOCK_SIZEExtensiones: Se forma con uno o más bloques. Cuando se aumenta tamaño de un objeto se usa una extensión para incrementar el espacio.Segmentos: Grupo de extensiones que forman un objeto de la base de datos, como por ejemplo una tabla o un índice.Espacio de tablas: Formado por uno o más datafiles, cada datafile solo puede pertenecer a un determinado tablespace

En general, el almacenamiento de los objetos de la base de no se realiza sobre el archivo o archivos físicos de la base de datos, sino que se hace a través de estructuras lógicas de almacenamiento que tienen por debajo a esos archivos físicos, y que independizan por tanto las sentencias de creación de objetos de las estructuras físicas de almacenamiento. Esto es útil porque permite que a esos "espacios de objetos " les sean asociados nuevos dispositivos físicos de forma dinámica cuando la base de datos crece de tamaño más de lo previsto. Posibilita además otra serie de operaciones como las siguientes:

Page 2: Unidad 3 Abd

Asignar cuotas específicas de espacio a usuarios de la base de datos. Controlar la disponibilidad de los datos de la base de datos, poniendo fuera de uso

alguno de esos espacios de tablas individualmente. Realizar copias de seguridad o recuperaciones parciales de la base de datos. Reservar espacio para almacenamiento de datos de forma cooperativa entre

distintos dispositivos.

File Manager: proporciona la gerencia de archivos generales y de archivos protegidos grandes.

Buffer Manager: proporciona la gerencia de almacenadores intermediarios compartidos.

Page Manager: algoritmo DE LRU de las aplicaciones para manejar las páginas. Lock Manager: proporciona cerradurasde tipo ”lectura” y ”escritura” para alcanzar

consistencia. IPC: realiza la sincronización del escondrijo. Disk Manager: proporciona el interfaz para storage/disk físico.

El administrador de la base de datos puede crear o borrar nuevos espacios lógicos de objetos, añadir o eliminar ficheros físicos de soporte, utilizados como espacio temporal de trabajo, definir parámetros de almacenamiento para objetos destinados a ese espacio de datos, todos los gestores relacionales que venimos introduciendo como ejemplos siguen esta filosofía. En el caso de Oracle Postgres, sobre los ficheros físicos de datos (datafiles) se definen los tablespaces. Por lo tanto, una base de datos Oracle Postgres se compone lógicamente de tablcspaccs, y físicamente de datafilcs. Su creación es sencilla, con la sentencia GREAT'', TABLESPACE: CREATE TABLESPACE usuarios DATAFILE `datal.ora' SIZE 50MTambién es sencillo ampliar el espacio destinado a un tablespace utilizando el comando ALTER TABLESPACE:ALTER TABLESPACE usuarios ADD DATAFILE 'data2.ora' SIZE 25M

Page 3: Unidad 3 Abd

Para hacer más grande una base de datos, las opciones disponibles son tres:

Cada base de datos contiene un tablespace llamado SYSTEM que es creado automáticamente al crear la base de datos. Contiene las tablas del diccionario de datos para la base de datos en cuestión. Es recomendable no cargar datos de usuario en SYSTEM, para dejarlos como espacio de objetos del sistema. Si además los datos de usuario están en tablespaces sitos en otros dispositivos, el rendimiento mejorará porque las tablas del diccionario de datos se acceden frecuentemente y por lo tanto son un cuello de botella potencial desde el punto de vista del acceso a disco. A la hora de estimar el espacio necesario para cl tablespace sys-nsm hay que tener en cuenta que las unidades de programación PL-SQL (entorno de programación SQL proporcionado por Oracle) almacenadas en la base de datos (procedimientos, paquetes, disparos y funciones) almacenan sus datos en SYSTEM.De acuerdo con lo comentado anteriormente, tablas e índices se ubicarán en el tablespaee indicado en el momento de su creación con la correspondiente sentencia CREATE. Si no se dice nada, se situarán en el tablespace por defecto asociado al usuario creador

3.1.1. Definición de espacio de almacenamientoLas bases de datos suelen ser creadas para almacenar grandes cantidades de datos de forma permanente. Por lo general, los datos almacenados en éstas suelen ser consultados y actualizados constantemente.La mayoría de las bases de datos se almacenan en las llamadas memorias secundarias, especialmente discos duros, aunque, en principio, pueden emplearse también discos ópticos, memorias flash, etc.Las razones por las cuales las bases de datos se almacenan en memorias secundarias son:

Page 4: Unidad 3 Abd

En cuanto al respaldo de las bases de datos (ver backup), suelen emplearse tanto discos duros, como cintas magnéticas, discos ópticos o similares.Las técnicas empleadas para almacenar bases de datos son sumamente importantes para la velocidad de acceso y recuperación de datos. Las técnicas dependen del tipo de almacenamiento, el uso que se le da o se le dará a la base de datos, la estructura de la misma, el SGBD empleado, etc.Esta dependencia no significa necesariamente que haya que cambiar la estructura de la base de datos si se cambian las técnicas empleadas. Las técnicas de almacenamiento son independientes de la base de datos, pero, de todas maneras, las mejores técnicas muchas veces pueden determinarse viendo la estructura de la base de datos, entre otras características.Los encargados de elegir estas técnicas son los diseñadores y administradores de bases de datos, y dependen también de las capacidades del SGBD. En general, el SGBD ofrece diferentes opciones y técnicas para organizar los datos.La idea es que los encargados de la base de datos encuentren las técnicas idóneas, o sea, aquellas que permitan la mayor velocidad posible de acceso a los datos. Una mala decisión en esta área puede resultar en una menor velocidad de acceso a la base de datos, o en un uso excesivo del espacio de almacenamiento, o incluso, puede aumentar la velocidad de consulta de una base de datos, pero disminuir la velocidad de actualización de la misma.

3.1.2. Definición y creación del espacio asignado para cada base de datos

Las bases de datos se almacenan en ficheros o archivos. Existen diferentes formas de organizaciones primarias de archivos que determinan la forma en que los registros de un archivo se colocan físicamente en el disco y, por lo tanto, cómo se accede a éstos.

Las distintas formas de organizaciones primarias de archivos son:

Existe una segunda forma de acceder a los datos llamada organización secundaria o estructura de acceso auxiliar. Estas permiten que los accesos a los registros de un archivo basado en campos alternativos, sean más eficientes que los que han sido utilizados para la organización primaria de archivos.

El DBMS asigna espacio de almacenamiento a las bases de datos cuando los usuarios introducen create database o alter database. El primero de los comandos puede especificar uno o más dispositivos de base de datos, junto con la cantidad de espacio en cada uno de ellos que será asignado a la nueva base de datos.

Page 5: Unidad 3 Abd

Si se utiliza la palabra clave default o se omite completamente la cláusula on , el DBMS pone la base de datos en uno o más de los dispositivos predeterminados de base de datos especificados en master..sysdevices

Para especificar un tamaño (en este ejemplo, 4MB) para una base de datos que se va a almacenar en una ubicación predeterminada, utilice on default = size de esta forma:

create database newpubs on default = 4

Para situar la base de datos en dispositivos específicos, dé el nombre del dispositivo o dispositivos en que desea almacenarla. Como la sintaxis indica, puede solicitar que se almacene en más de un dispositivo de base de datos, con una cantidad de espacio diferente en cada uno. Todos los dispositivos mencionados en create database deben estar enumerados en sysdevices . En otras palabras, deben haberse inicializado con disk init .

La instrucción siguiente crea la base de datos newdb y asigna 3MB en mydata y 2MB en newdata . Como en el ejemplo anterior, la base de datos y el diario de transacciones no se separan:

create database newdb on mydata = 3, newdata = 2

Warning! A menos que cree una base de datos pequeña o que no sea crucial, sitúe siempre el diario en un dispositivo de base de datos aparte.

Si la cantidad de espacio solicitada a un dispositivo específico de base de datos no está disponible, el DBMS crea la base de datos con tanto espacio como sea posible en cada dispositivo y muestra un mensaje informando el espacio asignado en cada uno. (Esto no se considera un error.) Si hay menos espacio del mínimo necesario para una base de datos en el dispositivo especificado (o en el predeterminado, si no se especifica un nombre), el comando create database falla.

3.1.3. BitácorasLa estructura más ampliamente usada para grabar las modificaciones de la base de datos es la Bitácora. Cada registro de la bitácora escribe una única escritura de base de datos y tiene lo siguiente:

1. Nombre de la transacción: Nombre de la transacción que realizó la operación de escritura.

2. Nombre del dato: El nombre único del dato escrito.

3. Valor antiguo: El valor del dato antes de la escritura.

4. Valor nuevo: El valor que tendrá el dato después de la escritura.

Page 6: Unidad 3 Abd

Existen otros registros de bitácora especiales para grabar sucesos importantes durante el proceso de transacción, tales como:

< T1, inicio >

< T1, x, v1, v2 >

< T1, commit >

Es fundamental que siempre se cree un registro en la bitácora cuando se realice una escritura antes de que se modifique la base de datos.

También tenemos la posibilidad de deshacer una modificación que ya se ha escrito en la base de datos, esto se realizará usando el campo del valor antiguo de los registros de la bitácora.

Los registros de la bitácora deben residir en memoria estable como resultado el volumen de datos en la bitácora puede ser exageradamente grande.

Ejemplo de una bitácora de instrucciones

CREATE TABLE [dbo].[Bitacora] (

[BitacoraID] [int] IDENTITY (1, 1) NOT NULL ,

[EventType] [char] (14) NOT NULL ,

[Status] [int] NOT NULL ,

[EventInfo] [varchar] (1000) NOT NULL ,

[Usuario] [varchar] (20) NOT NULL ,

[Fecha] [smalldatetime] NOT NULL

) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Bitacora] WITH NOCHECK ADD

CONSTRAINT [DF_Bitacora_Usuario] DEFAULT (suser_sname()) FOR [Usuario],

CONSTRAINT [DF_Bitacora_Fecha] DEFAULT (getdate()) FOR [Fecha]

Y, por otro lado, el trigger en la tabla lo definiría de la siguiente manera:

/* Trigger de Monitoreo */

Page 7: Unidad 3 Abd

CREATE TRIGGER trig_tablabitacora

ON TABLA

FOR DELETE, INSERT, UPDATE

AS

BEGIN

DECLARE @NUMERO INT

INSERT INTO Bitacora (EventType,Status,EventInfo)

exec sp_executesql N’DBCC INPUTBUFFER( @i )’, N’@i int’,

@i=@@spid

END

Enseguida plantearé un ejemplo de una bitácora desarrollada para la siguiente base de datos de MySQL, llamada proyecto, que tiene las tablas carrera, departamento y maestros.

CREATE DATABASE proyecto;

USE proyecto

CREATE TABLE IF NOT EXISTS `carrera` (`clave_carrera` int(11) NOT NULL, `nom_carrera` varchar(20) NOT NULL, `num_depto` int(11) NOT NULL, PRIMARY KEY (`clave_carrera`), KEY `num_depto` (`num_depto`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `departamento` ( `num_departamento` int(11) NOT NULL,`nombre_dept` varchar(20) NOT NULL, `jefe_num_tarjet` int(11) NOT NULL, PRIMARY KEY (`num_departamento`), KEY `jefe_num_tarjet` (`jefe_num_tarjet`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `maestros` (`num_tarjeta` int(11) NOT NULL DEFAULT ’0′,`nombre` varchar(50) DEFAULT NULL, PRIMARY KEY (`num_tarjeta`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;

La estructura de la tabla bitácora sería la siguiente:

CREATE TABLE IF NOT EXISTS `bitacora` (`id` int(11) NOT NULL AUTO_INCREMENT, `operacion` varchar(10) DEFAULT NULL, `usuario` varchar(40) DEFAULT NULL, `host` varchar(30) NOT NULL, `modificado` datetime DEFAULT NULL, `tabla` varchar(40) NOT

Page 8: Unidad 3 Abd

NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

La bitácora debe registrar todos los movimientos (insertar, eliminar y modificar) que se realicen en las tablas de la base de datos. Para lograr lo anterior es necesario crear un trigger para que se ejecute después de la operación de insertar, otro para después de eliminar y el último para después de modificar para cada una de las 3 tablas de la base de datos. Los nueve triggers necesarios para que funcione la bitácora son los siguientes:

DROP TRIGGER IF EXISTS `bit_carr_ins`;

DELIMITER //

CREATE TRIGGER `bitacora` AFTER INSERT ON `carrera`

FOR EACH ROW INSERT INTO bitacora(host, usuario, operacion, modificado, tabla) VALUES (SUBSTRING(USER(), (INSTR(USER(),’@')+1)), SUBSTRING(USER(),1,(instr(user(),’@')-1)), “INSERTAR”, NOW(), “CARRERA”)

//

DROP TRIGGER IF EXISTS `bit_carr_upd`;

CREATE TRIGGER `bit_carr_upd` AFTER UPDATE ON `carrera`

FOR EACH ROW INSERT INTO bitacora(host, usuario, operacion, modificado, tabla) VALUES (SUBSTRING(USER(), (INSTR(USER(),’@')+1)), SUBSTRING(USER(),1,(instr(user(),’@')-1)), “ACTUALIZAR”, NOW(), “CARRERA”)

//

DROP TRIGGER IF EXISTS `bit_carr_del`;

CREATE TRIGGER `bit_carr_del` AFTER DELETE ON `carrera`

FOR EACH ROW INSERT INTO bitacora(host, usuario, operacion, modificado, tabla) VALUES (SUBSTRING(USER(), (INSTR(USER(),’@')+1)), SUBSTRING(USER(),1,(instr(user(),’@')-1)), “ELIMINAR”, NOW(), “CARRERA”)

//

DROP TRIGGER IF EXISTS `bit_depto_ins`;

CREATE TRIGGER `bit_depto_ins` AFTER INSERT ON `departamento`

FOR EACH ROW INSERT INTO bitacora(host, usuario, operacion, modificado, tabla) VALUES (SUBSTRING(USER(), (INSTR(USER(),’@')+1)), SUBSTRING(USER(),1,(instr(user(),’@')-1)), “INSERTAR”, NOW(), “DEPARTAMENTO”)

//

Page 9: Unidad 3 Abd

DROP TRIGGER IF EXISTS `bit_depto_upd`;

CREATE TRIGGER `bit_depto_upd` AFTER UPDATE ON `departamento`

FOR EACH ROW INSERT INTO bitacora(host, usuario, operacion, modificado, tabla) VALUES (SUBSTRING(USER(), (INSTR(USER(),’@')+1)), SUBSTRING(USER(),1,(instr(user(),’@')-1)), “ACTUALIZAR”, NOW(), “DEPARTAMENTO”)

//

DROP TRIGGER IF EXISTS `bit_depto_del`;

CREATE TRIGGER `bit_depto_del` AFTER DELETE ON `departamento`

FOR EACH ROW INSERT INTO bitacora(host, usuario, operacion, modificado, tabla) VALUES (SUBSTRING(USER(), (INSTR(USER(),’@')+1)), SUBSTRING(USER(),1,(instr(user(),’@')-1)), “ELIMINAR”, NOW(), “DEPARTAMENTO”)

//

DROP TRIGGER IF EXISTS `bit_mae_ins`;

CREATE TRIGGER `bit_mae_ins` AFTER INSERT ON `maestros`

FOR EACH ROW INSERT INTO bitacora(host, usuario, operacion, modificado, tabla) VALUES (SUBSTRING(USER(), (INSTR(USER(),’@')+1)), SUBSTRING(USER(),1,(instr(user(),’@')-1)), “INSERTAR”, NOW(), “MAESTROS”)

//

DROP TRIGGER IF EXISTS `bit_mae_upd`;

CREATE TRIGGER `bit_mae_upd` AFTER UPDATE ON `maestros`

FOR EACH ROW INSERT INTO bitacora(host, usuario, operacion, modificado, tabla) VALUES (SUBSTRING(USER(), (INSTR(USER(),’@')+1)), SUBSTRING(USER(),1,(instr(user(),’@')-1)), “ACTUALIZAR”, NOW(), “MAESTROS”)

//

DROP TRIGGER IF EXISTS `bit_mae_del`;

CREATE TRIGGER `bit_mae_del` AFTER DELETE ON `maestros`

FOR EACH ROW INSERT INTO bitacora(host, usuario, operacion, modificado, tabla) VALUES (SUBSTRING(USER(), (INSTR(USER(),’@')+1)), SUBSTRING(USER(),1,(instr(user(),’@')-1)), “ELIMINAR”, NOW(), “MAESTROS”)

Page 10: Unidad 3 Abd

3.1.4 Particiones

El particionado de tablas es una técnica que se usa para reducir la cantidad de lecturas físicas a la base de datos cuando ejecutamos consultas, existen dos principales modalidades de particionado: horizontal y vertical. ¡Vamos a los detalles!

Horizontal: Esta modalidad consiste en tener varias tablas con las mismas columnas en cada una de ellas y distribuir la cantidad de registros en estas tablas (generalmente se particiona separando la data por años, meses, etc). Ejemplo: tenemos tres tablas registro2001, registro2002, registro2003 y en cada tabla guardamos los registros de los años correspondientes, esto nos garantiza una mejora en el rendimiento considerable cuando realicemos consultas sobre las tablas ya que la data estará distribuida en tres partes y ya sabríamos dependiendo del año en cual tabla buscar.

Vertical: Esta modalidad generalmente la aplicamos en nuestros diseños de base de datos sin darnos cuenta, por ejemplo cuando tenemos una columna de tipo BLOB con una fotografía o un texto muy largo que no leemos frecuentemente y decidimos ponerla en otra tabla referenciandola con la clave foránea.

Ahora bien, el particionado horizontal es el que vamos a comentar, ya que el problema radica en cómo hacer para que nuestras aplicaciones sepan en que tabla guardar el registro dependiendo del año (porque obviamente no le vamos a agregar esas condiciones a nuestra aplicación); esto se logra agregando una serie de sentencias y condiciones en la definición de las tablas.

Para configurar una tabla con particiones, haga lo siguiente:

1. Crear el "maestro" de mesa, de la que todas las particiones heredarán.Esta tabla contendrá ningún dato. No defina las restricciones de verificación en este cuadro, a menos que vaya a aplicarse por igual a todas las particiones. No hay ningún punto en la definición de los índices o restricciones únicas en él, tampoco.

2. Crear varios "niños" tablas que cada heredan de la tabla principal. Normalmente, estas tablas no añade columnas para el conjunto heredado de la maestra.Nos referimos a las tablas secundarias como particiones, aunque son en todos los sentidos normales PostgreSQL tablas.

3. Añadir restricciones de tabla para las tablas de partición para definir los valores de clave permitidas en cada partición.

VER (outletID ENTRE 100 Y 200)VER (outletID ENTRE 200 Y 300)

Page 11: Unidad 3 Abd

Tenga en cuenta que no hay diferencia en la sintaxis entre el rango y la lista de particiones, esos términos son descriptivos solamente.

4. Para cada partición, crear un índice en la columna de clave (s), así como cualquier otro índice que podría querer. (El índice de clave no es estrictamente necesario, pero en la mayoría de los casos es de gran ayuda. Si usted tiene la intención de los valores clave para ser único, entonces siempre se debe crear una restricción de unicidad o de clave primaria para cada partición.)

5. Opcionalmente, definir un disparador o una regla para redireccionar los datos insertados en la tabla principal de la partición correspondiente.

6. Asegúrese de que el constraint_exclusion parámetro de configuración no esté inhabilitada en postgresql.conf . Si es así, las consultas no serán optimizados como deseado.

CREAR tabla de la medida (

city_id int NOT NULL,

fecha no nula logdate,

peaktemp int,

unitsales int

);

Sabemos que la mayoría de las consultas se acceden sólo los datos de la última semana,

el mes o el trimestre de la, ya que el uso principal de esta mesa será la de preparar los

informes en línea para la gestión. Para reducir la cantidad de datos antiguos que necesita

ser almacenado, decidimos sólo mantener los más recientes 3 años valor de los datos. Al

principio de cada mes, vamos a eliminar los datos del mes más antiguo.

En esta situación podemos utilizar particiones para ayudarnos a cumplir todos nuestros

requisitos diferentes para la tabla de mediciones. Siguiendo los pasos descritos

anteriormente, la partición se puede configurar de la siguiente manera:

1. La tabla principal es la medición de la tabla, tal y como declaró anteriormente.

2. A continuación, creamos una partición para cada mes activo:

Page 12: Unidad 3 Abd

CREATE TABLE INHERITS measurement_y2006m02 () (medición);

CREATE TABLE INHERITS measurement_y2006m03 () (medición);

...

CREATE TABLE INHERITS measurement_y2007m11 () (medición);

CREATE TABLE measurement_y2007m12 () INHERITS (medición);

CREATE TABLE measurement_y2008m01 () INHERITS (medición);

Cada una de las particiones son tablas completas en sí mismas, sino que heredan sus

definiciones de la medición de la tabla.

Esto resuelve uno de los problemas: borrar datos viejos. Cada mes, todos tendremos que hacer

es realizar una DROP TABLE sobre la mesa más antiguo niño y crear una nueva tabla

secundaria de los datos del nuevo mes.

3. Debemos proporcionar no superpuestos restricciones de tabla. En lugar de crear las

tablas de partición en el caso anterior, el script de creación de la tabla en realidad

debería ser:

CREATE TABLE measurement_y2006m02 (

VER (logdate> = FECHA '2006-02-01 'AND logdate <FECHA '2006-03-01')

INHERITS) (medición);

CREATE TABLE measurement_y2006m03 (

VER (logdate> = FECHA '2006-03-01 'AND logdate <FECHA '2006-04-01')

INHERITS) (medición);

...

CREATE TABLE measurement_y2007m11 (

VER (logdate> = FECHA '2007-11-01 'AND logdate <FECHA '2007-12-01')

INHERITS) (medición);

Page 13: Unidad 3 Abd

CREATE TABLE measurement_y2007m12 (

VER (logdate> = FECHA '2007-12-01 'AND logdate <FECHA '2008-01-01')

INHERITS) (medición);

CREATE TABLE measurement_y2008m01 (

VER (logdate> = FECHA '2008-01-01 'AND logdate <FECHA '2008-02-01')

INHERITS) (medición);

3.1.5 Espacios privadosUn «espacio privado» permite que los administradores y redactores gestionen el conjunto de datos del sitio. Algunas bases de datos tienen estos espacios privados llamados comúnmente paneles de control, que son formularios que aparecen al abrir la base de datos.Los paneles de control sirven de "puerta principal" o "recibidor" de una base de datos en el sentido de que dirigen a las personas hacia determinadas tareas, como introducir o buscar datos. Sirven también para mantener alejados a los usuarios de las tablas que contienen los datos en tiempo real.Cuando reciba una base de datos, debe adentrarse más allá del panel de control para averiguar cómo están estructurados los datos, pero merece la pena echar un vistazo inicial al panel de control. Le puede ofrecer algún indicio sobre las tareas que el diseñador de la base de datos consideró que realizarían los usuarios habitualmente con los datos.Puede hacer clic en los vínculos del panel de control para ver qué objetos, como formularios e informes, abren.

3.1.6 Espacios para objetos

Los DBMS se basan en archivos para almacenar datos, y estos archivos, o conjuntos de datos, residen en medios de almacenamiento, o dispositivos. Una buena parte del trabajo del DBA implicará la planificación para el almacenamiento real de la base de datos.

Algunas tecnologías de almacenamiento son más adecuadas que otras. Sin embargo, la naturaleza mecánica de la unidad de disco los hace más vulnerables al fracaso de los componentes de otro equipo. Además, las formas en que las unidades de disco son utilizados por las bases de datos pueden hacer que la gestión del almacenamiento impredecibles, como la barra lateral "Modern DBMS de uso de disco“ Puede usarse RAID para mejorar la seguridad de los datos.

Page 14: Unidad 3 Abd

Para aplicaciones de misión crítica la integridad de los datos puede ser más importante que la disponibilidad de datos. Si el soporte es poco fiable y un fallo de las causas de corrupción de datos, los datos perdidos puede ser más de un problema que el tiempo de inactividad. Es imperativo, por tanto, que las soluciones de almacenamiento de base de datos para protegerlos a toda costa. La recuperación de datos desde medios de almacenamiento lleva mucho más tiempo en completarse que la recuperación de datos desde la memoria caché o la memoria.

El rendimiento de la base de datos depende de la entrada y salida a disco. La cantidad de datos almacenados es mayor que nunca antes, y los datos se almacenados por más tiempo.

Algunos DBMS permiten al tamaño de los archivos temporales de expandirse y contraerse de forma automática. Dependiendo del tipo y la naturaleza de las operaciones de base de datos en proceso, esta fluctuación puede provocar picos de uso del disco

El crecimiento de la capacidad de almacenamiento aumenta aún más la complejidad de la gestión de datos y bases de datos. Muchas organizaciones están implementando nuevas tecnologías de almacenamiento, tales como almacenamiento en red (NAS) y redes de área de almacenamiento (SAN), para ayudar a controlar la cantidad cada vez mayor de almacenamiento necesario para los usos modernos. La gestión del almacenamiento en el entorno dinámico de hoy es una tarea difícil DBA.

Hay muchos problemas de almacenamiento que deben ser resueltos antes de que un DBA pueda crear una base de datos. Uno de los temas más importantes es la cantidad de espacio para permitir la base de datos.

El cálculo espacial debe tener en cuenta no sólo tablas, índices, sino también, y dependiendo del DBMS, el registro de transacciones. Cada una de estas entidades probablemente requerirá un archivo separado o conjunto de datos, para el almacenamiento persistente.

El DBA debe separar en diferentes discos a los archivos para:

Mejorar el rendimiento. Separar índice de datos. Aislar los logos en otro disco.

3.2. SegmentosUn segmento contiene un tipo específico de objetos de la base de datos, como por ejemplo una tabla. Un segmento está compuesto de extensiones que definen el tamaño disponible para el segmento. A medida que se llenan las extensiones se van añadiendo nuevas extensiones, es aquel espacio reservado por la base de datos, dentro de un datafile, para ser utilizado por un solo objeto. Así una tabla (o cualquier otro objeto) está dentro de su segmento, y nunca podrá salir de él, ya que si la tabla crece, el segmento también crece con ella.

Page 15: Unidad 3 Abd

Físicamente todo objeto en base de datos no es más que un segmento dentro de un datafile. Se puede decir que, un segmento es a un objeto de base de datos, lo que un datafile a un tablespace; el segmento es la representación física del objeto en base de datos (el objeto es solo una definición lógica).

Los segmentos son los equivalentes físicos de los objetos que almacenan datos. El uso efectivo de los segmentos requiere que el DBA conozca los objetos, que utiliza una aplicación, cómo los datos son introducidos en esos objetos y el modo en que serán recuperados.

Un segmento está constituido por secciones llamadas extensiones, que son conjuntos contiguos de bloques. Una vez que una extensión existente en un segmento no puede almacenar más datos, el segmento obtendrá del espacio de tabla otra extensión. Este proceso de extensión continuará hasta que no quede más espacio disponible en los ficheros del espacio de tablas, o hasta que se alcance un número máximo de extensiones por segmento.

Existen 5 tipos de segmento:

De datos. De índices. De rollback. Temporales. De bootstrap.

En postgres los segmentos se pueden ver en:

pg_xlog (WAL):

• Diarios de escritura adelantada. Utilizada para recuperaciones.

• Conjunto de segmentos de un tamaño de 16 MB y divididos en páginas de 8KB.

• Se van creando de acuerdo a las necesidades.

3.3. Memoria Compartida.La memoria compartida contiene todos los datos intervenidos, como:

Grupo de memorias intermedias Tabla de bloqueos Memoria intermedia del registro, que contiene las entradas del registro que

esperan a ser volcadas en el almacenamiento estable

Planes de consulta en caché, que se pueden reutilizar si se envía de nuevo la misma consulta

La exclusión mutua se puede implementar por medio de funciones del sistema operativo llamadas semáforos. Implementaciones alternativas, con menos sobrecargas, utilizan

Page 16: Unidad 3 Abd

instrucciones atómicas especiales soportadas por el hardware de la computadora; un tipo de instrucción atómica comprueba una posición de la memoria y la establece a uno automáticamente. Los mecanismos de exclusión mutua también se utilizan para implementar pestillos.

Memoria compartida

SHMMAX: Tamaño máximo de un segmento de memoria compartida (bytes) SHMMIN: Tamaño mínimo de un segmento de memoria compartida (bytes) SHMALL: Cantidad máxima de memoria compartida disponible (bytes ó páfinas) SHMSEG: Número máximo de segmentos de memoria compartida por proceso SHMMNI: Número máximo de segmentos de memoria compartida en todo el

sistema

SHMMAX: Varios MB. El valor por defecto del núcleo es 32MB, un valor muy bajo en muchos casos. Existen varios parametros en postgresql.conf que determinan cuanta memoria compartida necesitaremos, el más importante de ellos y el principal causante de que necesitemos aumentar SHMMAX es shared_buffers.

El valor de SHMMAX (bytes) no puede ser menor que el valor definido en shared_buffers. PostgreSQL se negará a arrancar si el valor de SHMMAX es muy pequeño.

SHMMIN: Como mínimo 1. SHMALL: Como mínimo SHMMAX/PAGE_SIZE. En donde el valor

de PAGE_SIZE lo podeis obtener ejecutando el comando getconf PAGESIZE. El valor por defecto del núcleo es 2097152 pages (8192MB)

Si teneis varios clusters de PostgreSQL ejecutandose en la máquina ó otros programas que usen memoria compartida, tendreis que definir un valor de SHMALL lo suficientemente grande para poder ejecutar todos estos programas a la vez.

SHMSEG: Solamente se necesita 1. El valor por defecto es mucho más grande. SHMMNI: Como mínimo SHMSEG + lo necesario por otras aplicaciones. El valor

por defecto del núcleo es 4096.

Pocas veces hay que modificar este valor.

Page 17: Unidad 3 Abd

3.4. Instancias múltiples

Se llama instancia múltiple al hecho de poder ejecutar un programa más de una vez al mismo tiempo. Hay programas que no admiten más que una sola instancia, es decir que si ya se está ejecutando, por más que lo cliquees de nuevo en el icono o en el menú no aparecerá un nuevo ejemplar del programa. Con las bases de datos se complica un poco porque si un usuario modifica un registro que otro usuario tiene también abierto, la modificación que se haga en una instancia debe reflejarse de inmediato (actualizarse) en cualquier otra instancia abierta de la misma base de datos.

Sin embargo, en las bases de datos se puede seleccionar la opción en el diseño de la BD, y se reflejarán de inmediato las modificaciones en todas las instancias abiertas

En programación, una instancia se produce con la creación de un objeto perteneciente a una clase (se dice que se instancia la clase). El objeto que se crea tiene los atributos, propiedades y métodos de la clase a la que pertenece. Los objetos y sus características se usan en la construcción de programas, ya sea como contenedores de datos o como partes funcionales del programa. Los objetos también puede ser ocurrencia de las clases.

La idea es poder tener multiples instancias (clusters) de PostgreSQL en un mismo

servidor, escuchando en diferentes puertos. De esta forma podremos tener

configuraciones de seguridad diferentes para cada una de ellas, levantarlas o

pararlas de forma independiente, etc.

Como ejemplo tendremos dos instancias, una principal en el puerto 5432 y otra

adicional para desarrollo en el 5433.

Como en RHEL5

En primer lugar creamos un enlace simbólico al script de inicio de postresql, para la

instancia de desarrollo.

# ln -s /etc/init.d/postgresql /etc/init.d/postgresql-desa

Creamos un fichero de configuración de la nueva instancia, en este

caso /etc/sysconfig/pgsql/postgresql-desa.

GDATA=/var/lib/pgsql/data-desaPGPORT=5433PGLOG=/var/lib/pgsql/pgstartup-desa.log

Page 18: Unidad 3 Abd

Inicializar la nueva instancia de BDD:

# service postgresql-desa initdb# service postgresql-desa start

Podemos comprobar como ha creado el nuevo directorio data, así como el log de

arranque:

# ls /var/lib/pgsqlbackups data data-desa pgstartup.log pgstartup-desa.log

Para configurar el arranque automático, la instancia se configura como un servicio mas:

# chkconfig --level 235 postgresql-desa on

Como en Debian

En Debián la gestión de instancias es mucho mas sencilla, ya que se incluyen

herramientas para gestionarlas. Incluso contemplan tener instacias de versiones

diferentes de postgresql.

Creamos una segunda instancia para desarrollo:

# pg_createcluster -p 5433 8.3 desaCreating new cluster (configuration: /etc/postgresql/8.3/desa, data: /var/lib/postgresql/8.3/desa)...Moving configuration file /var/lib/postgresql/8.3/desa/postgresql.conf to /etc/postgresql/8.3/desa...Moving configuration file /var/lib/postgresql/8.3/desa/pg_hba.conf to /etc/postgresql/8.3/desa...Moving configuration file /var/lib/postgresql/8.3/desa/pg_ident.conf to /etc/postgresql/8.3/desa...

Listar las instancias (clusters):

# pg_lsclustersVersion Cluster Port Status Owner Data directory Log file8.3 desa 5433 down postgres /var/lib/postgresql/8.3/desa /var/log/postgresql/postgresql-8.3-desa.log8.3 main 5432 online postgres /var/lib/postgresql/8.3/main /var/log/postgresql/postgresql-8.3-main.log

Page 19: Unidad 3 Abd

La nueva instancia se inicia/para/reinicia automáticamente por el script de inicio de

postgresql:

# /etc/init.d/postgresql-8.3 restartRestarting PostgreSQL 8.3 database server: desa main.

Trabajar con las instancias:

Cuando trabajemos con las herramientas de consola de postgresql, podemos indicar la

instancia en la que operar con la opción --cluster, unos ejemplos:

- Listar BBDD:

<a href="mailto:postgres@idescac">postgres@idescac</a>:~$ psql --cluster 8.3/desa -l Listado de base de datos Nombre | Dueño | Codificación -----------+----------+-------------- postgres | postgres | UTF8 template0 | postgres | UTF8 template1 | postgres | UTF8(3 filas)

- Crear un usuario:

$ createuser -P -s -e user_desa --cluster 8.3/desa

- Crear una BDD:

$ createdb bdd_desa --o user_desa --cluster 8.3/desa