Unidad 3
Configuración y administración del espacio en disco
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
Extensiones: 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 datos (tablas e índices fundamentalmente) 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 (es decir, más espacio en disco) 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:
- 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.
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, sobre los ficheros físicos de datos
(datafiles) se definen los tablespaces. Por lo tanto, una base de datos Oracle
se compone lógicamente de tablespaces, y físicamente de datafiles. Su creación
es sencilla, con la sentencia GREAT'', TABLESPACE: CREATE TABLESPACE usuarios
DATAFILE `datal.ora' SIZE 50M
También es sencillo ampliar el espacio
destinado a un tablespace utilizando el comando ALTER TABLESPACE:
ALTER TABLESPACE usuarios ADD DATAFILE
'data2.ora' SIZE 25M
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.
3.1.1 Definición de
Almacenamiento de Bases de Datos
Las 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:
- · En general, las bases de datos son demasiado grandes para entrar en la memoria primaria.
- · La memoria secundaria suele ser más barata que la memoria primaria (aunque esta última tiene mayor velocidad).
- · La memoria secundaria es más útil para el almacenamiento de datos permanente, puesto que la memoria primaria es volátil.
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:
v
Archivos de
Montículos (o no Ordenados): esta técnica coloca los registros en
el disco sin un orden específico, añadiendo nuevos registros al final del
archivo.
v
Archivos Ordenados (o
Secuenciales):
mantiene el orden de los registros con respecto a algún valor de algún campo
(clave de ordenación).
v
Archivos de
Direccionamiento Calculado:
utilizan una función de direccionamiento calculado aplicada a un campo
específico para determinar la colocación de los registros en disco.
v
Árboles B: se vale de la estructura de árbol
para las colocaciones de registros.
v
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.
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 (por
ejemplo, 4MB) para una base de datos que se va a almacenar en una ubicación
predeterminada, se utiliza: on default = size de esta forma:
create database newpubs on default = 4
3.1.3.- Bitácoras
Son estructuras ampliamente utilizadas
para grabar las modificaciones de la base de datos.
Cada registro de la bitácora escribe
una única escritura de base de datos y tiene lo siguiente:
ü
Nombre de la
Transacción: Nombre
de la transacción que realizó la operación de escritura.
ü
Nombre del Dato: El
nombre único del dato escrito.
ü
Valor Antiguo: El valor del dato antes de la
escritura.
ü
Valor Nuevo: El valor que tendrá el dato después
de la escritura.
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.
La instrucción en MySQL para crear una
bitácora en .txt se crea antes de acceder a la base de datos con la
instrucción:
"xampp>mysql>bin>mysql
-hlocalhost -uroot --tee=C:bitacora.txt"
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.
3.1.4.- Particiones
Cuando alguna de las tablas de una
base de datos llega a crecer tanto que el rendimiento empieza a ser un
problema, es hora de empezar a conocer algo sobre optimización. Una característica
de MySQL son las particiones.
Particionar tablas en MySQL nos
permite rotar la información de nuestras tablas en diferentes particiones,
consiguiendo así realizar consultas más rápidas y recuperar espacio en disco al
borrar los registros. El uso más común de particionado es según la fecha.
Para ver si nuestra base de datos
soporta particionado simplemente ejecutamos:
SHOW VARIABLES LIKE '%partition%';
Se puede particionar una tabla de 5
maneras diferentes:
1.
Por Rango: para construir las particiones se
especifican rangos de valores.
ALTER TABLE contratos
PARTITION BY RANGE (YEAR
(fechaInicio)) (
PARTITION partDecada80 VALUES LESS
THAN (1990),
PARTITION partDecada90 VALUES LESS
THAN (2000),
PARTITION partDecada00 VALUES LESS
THAN (2010),
PARTITION partDefault VALUES LESS THAN
MAXVALUE
);
La última partición (partDefault)
tendrá todos los registros que no entren en las particiones anteriores. De esta
manera nos aseguramos que la información nunca dejará de insertarse en la
tabla.
2.
Por Listas: para construir nuestras particiones
especificamos listas de valores concretos.
ALTER TABLE contratos
PARTITION BY LIST (YEAR (fechaInicio))
(
PARTITION partDecada80 VALUES IN
(1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989),
PARTITION partDecada90 VALUES IN
(1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999),
PARTITION partDecada00 VALUES IN
(2000, 2001, 2002, 2003, 2004, 2005, 2006,
2007, 2008, 2009),
PARTITION partDecada10 VALUES IN
(2010, 2011, 2012, 2013, 2014, 2015, 2016,
2017, 2018, 2019)
);
3.
Por Hash: MySQL se encarga de distribuir las
tuplas automáticamente usando una operación de módulo. Sólo hay que pasarle una
columna o expresión que resulte en un entero (el hash) y el número de
particiones que queramos crear.
ALTER TABLE contratos
PARTITION BY HASH (YEAR (fechaInicio))
PARTITIONS 7;
4.
Por Clave: similar a la partición por hash, pero
en este caso no necesitamos pasarle un entero; MySQL utilizará su propia
función de hash para generarlo. Si no se indica ninguna columna a partir de la
que generar el hash, se utiliza la clave primaria por defecto.
ALTER TABLE contratos
PARTITION BY KEY ()
PARTITIONS 7;
5.
Compuesta: podemos combinar los distintos
métodos de particionado y crear particiones de particiones
Borrar
Particiones
Lo bueno de trabajar con particiones
es que podemos borrar rápidamente registros sin tener que recorrer toda la tabla
e inmediatamente recuperar el espacio en disco utilizado por la tabla.
Por ejemplo si queremos borrar la
partición más antigua simplemente ejecutamos:
ALTER TABLE reports DROP PARTITION
p201111;
Añadir
particiones
En el ejemplo anterior las 2 últimas
particiones creadas han sido:
PARTITION p201205 VALUES LESS THAN (TO_DAYS
("2012-06-01")),
PARTITION pDefault VALUES LESS THAN
MAXVALUE
El problema es que todos los INSERT que se
hagan después de mayo de 2012 se insertarán en pDefault. La solución sería
añadir particiones nuevas para cubrir los próximos meses:
ALTER TABLE reports REORGANIZE
PARTITION pDefault INTO (
PARTITION p201206 VALUES LESS THAN
(TO_DAYS ("2012-07-01")),
PARTITION pDefault VALUES LESS THAN
MAXVALUE);
En el caso que no tuviéramos una
partición del tipo pDefault simplemente ejecutamos:
ALTER TABLE reports ADD PARTITION
(PARTITION p201206 VALUES LESS THAN (TO_DAYS ("2012-07-01")));
Consultar
Particiones
Para consultar información de
particiones creadas en una tabla así como también los registros que contiene
cada una ejecutamos:
SELECT PARTITION_NAME, TABLE_ROWS FROM
information_schema.PARTITIONS WHERE TABLE_NAME='reports';
3.1.5.- Espacios
Privados
Un “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 se recibe una base de datos, se
averiguar cómo están estructurados los datos, revisar de manera general el
panel de control. 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.
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.
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 son 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.
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
índices de datos
·
Aislar
los logros en otro disco
3.2 Segmentos
Los datos en la BD son almacenados
físicamente en bloques Oracle: la mínima unidad de espacio físico, y es un
múltiplo del bloque del SO (2 Kb usualmente). El tamaño del bloque Oracle se
fija por el parámetro DB_BLOCK_SIZE del fichero init.ora. Un tamaño grande de
bloque mejora la eficiencia del cache de E/S, pero el tamaño de la SGA
aumentará para contener los mismos DB_BLOCK_BUFFERS, lo que significa un
problema de memoria.
Una serie de bloques contiguos es una
extensión, que es una unidad lógica de almacenamiento. Una serie de extensiones
es un segmento. Cuando un objeto es creado, se reserva una extensión en su
segmento. Cuando el objeto crezca, necesitará más espacio y se reservarán más
extensiones.
Cada segmento tiene un conjunto de
parámetros de almacenamiento que controla su crecimiento:
initial: tamaño
de la extensión inicial (10k).
next: tamaño
de la siguiente extensión a asignar (10k).
minextents: número
de extensiones asignadas en el momento de la creación del segmento (1).
maxextents: número
máximo de extensiones (99).
pctincrease: Porcentaje
en el que crecerá la siguiente extensión antes de que se asigne, en relación
con la última extensión utilizada (50).
pctfree: porcentaje
de espacio libre para actualizaciones de filas que se reserva dentro de cada
bloque asignado al segmento (10).
pctused: porcentaje
de utilización del bloque por debajo del cual Oracle considera que un bloque
puede ser utilizado para insertar filas nuevas en él.
tablespace: nombre
del espacio de tablas donde se creará el segmento.
Cuando se diseña una BD se ha de tener
mucho cuidado a la hora de dimensionar la BD y prever el crecimiento de las
tablas. A continuación se hacen algunas consideraciones sobre la gestión del
espacio para los diferentes segmentos.
Segmentos
de Datos
El espacio del diccionario de datos se
suele mantener más o menos constante, aunque es crítico que tenga suficiente
espacio para crecer en el espacio de tablas SYSTEM. Así, hay que tener cuidado
de colocar las tablas de usuario, los índices, segmentos temporales y los
segmentos de rollback en otros espacios de tablas.
Además, es recomendable que el espacio
de tablas SYSTEM esté al 50% o 75% de su espacio disponible. Finalmente,
asegurarse que los usuarios no tienen privilegios de escritura en el espacio de
tablas SYSTEM.
Las tablas crecen proporcionalmente
con el número de filas, ya que se puede suponer que la longitud de las filas es
constante.
Segmentos
de Índice
Los índices crecen en tamaño en mayor
proporción que las tablas asociadas si los datos en la tabla son modificados
frecuentemente. La gestión del espacio es mejor si se mantienen los índices de
tablas grandes en espacios de tablas separados.
Segmentos
de Rollback
Los segmentos de rollback almacenan la
imagen anterior a una modificación de un bloque. La información en el segmento
de rollback se utiliza para asegurar la consistencia en lectura, el rollback
(el valor en el segmento de rollback se copia en el bloque de datos) y la
recuperación.
Es importante comprender cuál es el
contenido de un segmento de rollback. No almacenan el bloque de datos
modificado entero, sólo la imagen previa de la fila o filas modificadas. La
información del segmento de roolback consiste en varias entradas llamadas undo.
Por ejemplo, si se inserta una fila en una tabla, el undo necesitará sólo el
rowid de la fila insertada, ya que para volver atrás la insercion sólo hay que
realizar un delete. En las operación de actualización, se almacenará el valor
antiguo de las columnas modificadas. El segmento de rollback asegura que la
información undo se guardan durante la vida de la transacción.
Un segmento de rollback como cualquier
otro segmento consiste en una serie de extensiones. Sin embargo, la mayor
diferencia entre un segmento de datos y otro rollback es que en este último las
extensiones se utilizan de manera circular. Así, habrá que tener cuidado a la
hora de fijar el tamaño del segmento de rollback para que la cabeza no pille a
la cola.
Segmentos
Temporales
Los segmentos temporales se crean
cuando se efectuan las siguientes operaciones:
Create Index
Select con distinct, order by, union,
intersect y minus.
uniones no indexadas.
Ciertas subconsultas correlacionadas.
Si las tablas a ordenar son pequeñas
la ordenación se realiza en memoria principal, pero si la tabla es grande se
realiza en disco. El parámetro SORT_AREA_SIZE determina el lugar donde se hace
la ordenación. Incrementándole se reduce la creación de segmentos temporales.
3.3 Definición de
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 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.
3.4 Definición de
Múltiples Instancias de un DBMS
Crear Instancias
MySQL
Tener dos instancias o más tiene entre
otras las siguientes justificaciones. Una se dedicará a desarrollo, para hacer
las modificaciones y pruebas necesarias y otra al de producción.
Proceso
Copiar la carpeta data que se
encuentra en nuestro caso en c:\MySQL, como data2
Copiar y pegar la configuración de
MySQL. Es decir, del archivo my.ini (en linux my.cnf) generamos una copia que
podría llamarse my2.ini.
Ahora con cuidado editamos my2.ini,
procure no tocar my,ini a menos que este seguro de lo que hace.
Iniciamos configurando el puerto por
donde escuchara MySQL la segunda instancia y la ruta de datos el archivo de
datos.
Iniciar Instancia
desde Consola
Desde la consola de ms-dos en modo
administrador. [Tecla Win] + [X] y damos clic en Símbolo de Sistema
(Administrador). Ahora introduzca desde la línea de comandos:
cd /MySQL/MySQL Server 5.6/bin
mysqld --defaults-file=my2.ini
--explicit_defaults_for_timestamp = TRUE
mysql -u root -port 3307 –p
Establecer la
Instancia como Servicio
Procederemos a instalar la nueva
instancia como servicio. Desde la consola de ms-dos en modo administrador. En
windows 8 pulse la [Tecla Win] + [X] y damos clic en Símbolo de Sistema
(Administrador):
No hay comentarios.:
Publicar un comentario