Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Nochistln
NDICE
INTRODUCCIN __________________________________________________________ 2
MOTORES DE ALMACENAMIENTO DE MYSQL Y TIPOS DE TABLAS __________________ 2
USAR UN ESPACIO DE TABLAS PARA CADA TABLA _______________________________ 3
BITCORAS EN MYSQL _____________________________________________________ 5
PARTICIONES EN MYSQL ___________________________________________________ 8
GESTIN DE FICHEROS ____________________________________________________ 11
CONEXIONES DE MYSQL CLSTER QUE COMPARTEN MEMORIA __________________ 12
EJECUTAR MS DE UN SERVIDOR MYSQL EN LA MISMA MQUINA ________________ 13
CONCLUSIONES _________________________________________________________ 15
BIBLIOGRAFA___________________________________________________________ 15
INTRODUCCIN
En esta investigacin se muestra como se almacena la informacin en MySQL, as como se
llevan las bitcoras y se asignan las particiones en disco. Tambin los espacios pblicos,
privados y para objetos. Adems de la memoria compartida e instancias mltiples.
Esto es similar a lo que hace el motor de almacenamiento MyISAM, pero MyISAM divide la
tabla en un fichero de datos tbl_name.MYD y el fichero de ndice tbl_name.MYI. Para
InnoDB, los datos y los ndices se almacenan juntos en el fichero .ibd. El fichero
tbl_name.frm se sigue creando como es usual.
Si se quita la lnea innodb_file_per_table de my.cnf y se reinicia el servidor, InnoDB crear
nuevamente las tablas dentro de los ficheros del espacio de tablas compartido.
innodb_file_per_table afecta solamente la creacin de tablas. Si se inicia el servidor con
esta opcin, las tablas nuevas se crearn empleando ficheros .ibd, pero an se puede
acceder a las tablas existentes en el espacio de tablas compartido. Si se remueve la opcin,
las nuevas tablas se crearn en el espacio compartido, pero an se podr acceder a las
tablas creadas en espacios de tablas mltiples.
InnoDB siempre necesita del espacio de tablas compartido. Los ficheros .ibd no son
suficientes para que funcione InnoDB. El espacio de tablas compartido consiste de los ya
conocidos ficheros ibdata, donde InnoDB coloca su diccionario de datos interno y los
registros para deshacer cambios (undo logs).
No se puede mover libremente ficheros .ibd entre directorios de bases de datos en la
misma forma en que se hace con ficheros de tablas MyISAM. Esto se debe a que la definicin
de las tablas se almacena en el espacio de tablas compartido de InnoDB, y tambin porque
InnoDB debe preservar la consistencia de los identificadores de transacciones y los nmeros
de secuencia de registros (log).
Dentro de una determinada instalacin MySQL, se puede mover un fichero .ibd y las tablas
asociadas de una base de datos a otra con la conocida sentencia RENAME TABLE:
RENAME TABLE nombre_bd_anterior.nombre_tabla TO nombre_bd_nuevo.nombre_tabla;
Si se tiene un respaldo limpio de un fichero .ibd, se lo puede restaurar dentro de la
instalacin MySQL de donde proviene del siguiente modo:
1. Utilizando esta sentencia ALTER TABLE:
2. ALTER TABLE nombre_tabla DISCARD TABLESPACE;
Precaucin: Esto eliminar el actual fichero .ibd.
3. Colocando el fichero .ibd nuevamente en el directorio de la base de datos adecuada.
4. Utilizando esta sentencia ALTER TABLE:
5. ALTER TABLE nombre_tabla IMPORT TABLESPACE;
En este contexto, un respaldo limpio de un fichero .ibd significa:
Se puede realizar un respaldo limpio del fichero .ibd con el siguiente mtodo:
1. Detener toda actividad del servidor mysqld y confirmar todas las transacciones.
2. Esperar hasta que SHOW INNODB STATUS indique que no hay transacciones activas
en la base de datos, y el estado del subproceso (trhead) principal de InnoDB sea
Waiting for server activity (Esperando por actividad del servidor). Entonces, se
puede hacer una copia del fichero .ibd.
Otro mtodo para hacer una copia limpia de un fichero .ibd es utilizar la herramienta
comercial InnoDB Hot Backup:
1. Utilizar InnoDB Hot Backup para respaldar la instalacin InnoDB.
2. Iniciar un segundo servidor mysqld sobre el respaldo y permitirle limpiar los ficheros
.ibd del mismo.
Figura en la lista de pendientes (TODO) para permitir mover ficheros .ibd limpios a otra
instalacin MySQL. Esto necesita que se inicialicen los IDs (identificadores) de transacciones
y los nmeros de secuencia de registros (log) en el fichero .ibd.
BITCORAS EN MYSQL
Con el crecimiento de Internet, y el desarrollo de sistemas de informacin bajo la
arquitectura Cliente/Servidor, los sistemas de cmputo ,en general, estn expuestos a
mltiples amenazas, vulnerabilidades y ataques cada vez ms complejos. Por lo tanto, es
importante que las organizaciones implementen bitcoras (o archivos logs) para almacenar
los sucesos que ocurren en el sistema. La informacin contenida en una bitcora es muy
importante y til cuando ocurre un incidente de seguridad o cuando se realiza una auditora
de sistemas.
Una bitcora puede registrar mucha informacin acerca de eventos relacionados con el
sistema que la genera los cuales pueden ser:
Fecha y hora.
Host origen.
5
Usuario.
Actividad realizada.
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)
//
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)),
7
PARTICIONES EN MYSQL
Cuando alguna de las tablas de tu base de datos llega a crecer tanto que el rendimiento
empieza a ser un problema, es hora de empezar a leer algo sobre optimizacin. ndices, el
comando EXPLAIN, el registro de consultas lentas, estas son herramientas bsicas que
todo el mundo debera conocer. Una caracterstica algo menos conocida, aunque se
introdujo en la versin 5.1 de MySQL, son las particiones.
En el hospital en que trabajo la mayor tabla con la que tenemos que lidiar es la que
almacena todos y cada uno de los contratos de todos los trabajadores que alguna pasaron
por el hospital desde que se fund en los aos 50. Esto supone slo un par de cientos de
miles de tuplas, lo cual no debera dar muchos dolores de cabeza con una base de datos
bien optimizada, consultas razonables, y un hardware decente. Sin embargo, hay personas
que tienen que tratar con cantidades de datos realmente obscenas, que multiplican estos
nmeros por 10 veces 10.
Una solucin que nos puede venir a la cabeza, sobre todo si la mayor parte de la informacin
se almacena a modo de histrico y no se accede a ella frecuentemente, es dividir la tabla
en varias porciones. Podramos mantener una tabla para el ao en curso y otra para el resto
de aos, por ejemplo; o una para cada uno de los aos; una por lustro; por dcada
dependiendo de cmo se trabaje con los datos.
El particionado es un concepto parecido, aunque automatizado, que puede ahorrarnos
muchos quebraderos de cabeza. Consiste en dividir los datos en particiones ms pequeas
8
(hasta 1024) procurando, porque de otra forma sera absurdo, que slo haya que acceder a
una particin a la hora de buscar una tupla.
Se puede particionar una tabla de 5 maneras diferentes:
Por rango: para construir nuestras particiones especificamos rangos de valores. Por
ejemplo, podramos segmentar los datos en 12 particiones: una para los contratos
de 1950 a 1960, otra para los aos 60, los 70, 80, 90, la dcada del 2000 y la dcada
actual
Por hash: MySQL se encarga de distribuir las tuplas automticamente usando una
operacin de mdulo. Slo hay que pasarle una columna o expresin que resulte en
un entero (el hash) y el nmero de particiones que queramos crear.
1. ALTER TABLE contratos
2. PARTITION BY HASH(YEAR(fechaInicio))
3. PARTITIONS 7;
Por clave: similar a la particin por hash, pero en este caso no necesitamos pasarle
un entero; MySQL utilizar su propia funcin 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.
1. ALTER TABLE contratos
2. PARTITION BY KEY()
3. PARTITIONS 7;
Compuesta: podemos combinar los distintos mtodos de particionado y crear
particiones de particiones
Por ltimo, un pequeo ejemplo de cmo afectara el particionado a una consulta
sencilla como obtener el nmero total de tuplas que cumplen una condicin. Estas
son las estadsticas de la consulta sin particionado (ni ndices)
1. EXPLAIN SELECT COUNT(*)
2. FROM contratos
3. WHERE fechaInicio BETWEEN '1950-01-01' AND '1955-12-31'
select_type table
type key rows Extra
SIMPLE
contratos ALL
239796 Using where
Y este el resultado de aadir las particiones (ntese la palabra clave PARTITIONS
para que nos muestre tambin la informacin relativa a las particiones)
1. EXPLAIN PARTITIONS SELECT COUNT(*)
2. FROM contratos
3. WHERE fechaInicio BETWEEN '1950-01-01' AND '1955-12-31'
select_type table
partitions
type key rows Extra
SIMPLE
contratos partDecada50 ALL
8640 Using where
Como vez, el nmero de tuplas que MySQL tiene que comprobar se ve disminuido
en 2 rdenes de magnitud.
10
GESTIN DE FICHEROS
Los ficheros de datos definidos en el fichero de configuracin forman el espacio de tablas
de InnoDB. Los ficheros simplemente son concatenados para formar el espacio de tablas.
No se utiliza striping (grabacin de datos a travs de varios discos en simultneo).
Actualmente no se puede definir en qu parte del espacio de tablas se ubicarn las tablas.
Sin embargo, en un espacio de tablas nuevo, InnoDB asigna el espacio comenzando por el
primer fichero de datos.
El espacio de tablas consiste en pginas de base de datos con un tamao por defecto de
16KB. Las pginas se agrupan en reas de 64 pginas consecutivas. Los ficheros dentro
de un espacio de tablas se llaman segmentos en InnoDB. El trmino segmento de
cancelacin (rollback segment) es un tanto confuso porque en realidad contiene varios
segmentos del espacio de tablas.
Por cada ndice de InnoDB se asignan dos segmentos. Uno es para los nodos que no son
hojas del B-tree, el otro es para los nodos hoja. La idea es mejorar la secuencialidad de los
nodos hoja, los cuales contienen los datos.
Cuando un segmento crece dentro del espacio de tablas, InnoDB ubica las primeras 32
pginas individualmente. Luego de ello, comienza a ubicar reas enteras en el segmento.
InnoDB puede adicionar a un segmento grande hasta 4 reas de pginas cada vez, para
asegurar una adecuada secuencialidad de los datos.
Algunas pginas en el espacio de tablas contienen bitmaps de otras pginas, por lo tanto
unas pocas reas en un espacio de tablas InnoDB no puede asignarse a segmentos como un
todo, sino solamente como pginas individuales.
Cuando se consulta el espacio libre disponible en el espacio de tablas mediante una
sentencia SHOW TABLE STATUS, InnoDB informa las reas que estn totalmente libres en
el espacio de tablas. InnoDB siempre reserva algunas reas para depuracin y otros
propsitos internos; estas reas reservadas no se cuentan en el espacio libre.
Cuando se eliminan datos de una tabla, InnoDB reduce los correspondientes ndices B-tree.
Depende del patrn seguido por las eliminaciones, si se liberan pginas individuales o reas
del espacio de tablas, de forma que el espacio desocupado quede disponible para otros
usuarios. Eliminar una tabla, o todas las filas que contiene, seguramente servir para liberar
el espacio, pero no hay que olvidar que las filas eliminadas solamente desaparecen
fsicamente cuando dejan de ser necesarias para cancelar transacciones o de integrar
lecturas consistentes.
11
[SHM]NodeId1, [SHM]NodeId2
Para identificar una conexin entre dos nodos es necesario proporcionar
identificadores para cada uno de ellos como NodeId1 y NodeId2.
[SHM]ShmKey
Cuando se inicializan segmentos de memoria compartido, un ID de nodo se
identifica para identificar unvocamente el segmento de memoria compartida para
usar para la comunicacin. Se expresa como un entero que no tiene valor por
defecto.
[SHM]ShmSize
Cada conexin SHM tiene un segmento de memoria compartida dnde los nodos
entre mensajes se guardan por parte del que enva y donde lo lee el receptor. El
tamao de este segmento lo define ShmSize. El valor por defecto es 1MB.
[SHM]SendSignalId
Para obtener la traza de la ruta de un mensaje distribudo, es necesario proporcionar
un identificador nico a cada mensaje. Poner este parmetro a Y hace que los IDs
de mensajes se transporten sobre la red tambin. Esta caracterstica est
desactivada por defecto.
[SHM]Checksum
Este parmetro es Y/N, y est desactivado por defecto. Cuando se activa, se calculan
los checksums para todos los mensajes y se guardan en el buffer de envo.
12
--port=port_num
--port controla el nmero de puerto de las conexiones TCP/IP.
--socket=path
--socket controla la ruta del archivo socket de Unix y el nombre de la named pipe en
Windows. En Windows, es necesario especificar diferentes nombres de pipe solo
para los servidores que soporten conexiones mediante named pipe.
--shared-memory-base-name=name
Esta opcin, actualmente, se utiliza slo en Windows. Designa el nombre de
memoria compartida utilizado por un servidor Windows para permitir a los clientes
conectarse mediante memoria compartida.
--pid-file=path
Esta opcin se utiliza nicamente en Unix. Indica el nombre del archivo en el que el
servidor escribe su ID de proceso.
13
Si utiliza las siguientes opciones de archivo de registro, deben ser diferentes para cada
servidor:
--log=path
--log-bin=path
--log-update=path
--log-error=path
--bdb-logdir=path
--tmpdir=path
--bdb-tmpdir=path
Tener diferentes directorios temporales tambin es una buena prctica, para hacer ms
fcil determinar qu servidor MySQL cre cualquier archivo temporal.
Generalmente, cada servidor debera utilizar un directorio de datos diferente, lo que se
especifica con la opcin --datadir=path.
Atencin: Normalmente no debera tener dos servidores que actualicen los datos de la
misma base de datos. Esto podra llevar a obtener sorpresas indeseadas si su sistema
operativo no tiene soporte para bloqueos sin posibilidad de fallo. Si (a pesar de este aviso)
ejecuta mltiples servidores que utilicen el mismo directorio de datos y tienen el registro
activado, debera utilizar las opciones adecuadas para especificar nombres de archivos de
registro que sean nicos para cada servidor. De otra manera, lo servidores intentan registrar
en los mismos archivos. Por favor, tengan cuenta que este tipo de configuracin slo
funciona con tablas MyISAM y MERGE, y no con ningn otro de los motores de
almacenamiento.
Este aviso en contra de compartir un directorio de datos entre servidores tambin se aplica
en entornos NFS. Permitir que mltiples servidores MySQL accedan a un directorio comn
es una muy mala idea.
Faciltese las cosas: Olvdese de compartir un directorio de datos entre servidores sobre
NFS. Una solucin mejor es tener una mquina que tenga diferentes CPUs y utilizar un
sistema operativo que gestione los hilos de ejecucin eficientemente.
Si tiene mltiples instalaciones de MySQL en diferentes lugares, normalmente puede
especificar el directorio base de instalacin para cada uno con la opcin --basedir=path, de
manera que cada servidor utilice un directorio de datos, archivo de registro, y archivo de
PID diferentes. (Los valores por defecto de todos ellos son determinados en relacin al
directorio base). En ese caso, las nicas opciones adicionales que necesita especificar son
las opciones --socket y --port. Por ejemplo, suponga que debe instalar diferentes versiones
de MySQL utilizando distribuciones binarias en archivos tar. Se instalan en diferentes
lugares, as que puede iniciar el servidor de cada instalacin utilizando el comando
bin/mysqld_safe bajo su correspondiente directorio base. mysqld_safe determina la
opcin --basedir apropiada para pasarle a mysqld, y usted slo necesita especificar las
opciones --socket y --port a mysqld_safe.
Tal como se explica en las siguientes secciones, es posible iniciar servidores adicionales
mediante el establecimiento de sus variables de entorno, o especificando opciones de lnea
de comandos apropiadas. Aun as, si necesita ejecutar servidores mltiples de manera
permanente, es ms conveniente utilizar archivos de opciones para especificar a cada
servidor las opciones que deben ser nicas para l.
CONCLUSIONES
Es indispensable conocer todos los tipos de tablas y datos que podemos guardar en MySQL
ya que de esto depende como podamos almacenar y particionar nuestra base de datos, cabe
sealar que MySQL soporta varios servidores a la vez que quiere decir que soporta instancias
mltiples, en mi opinin es uno de los mejores SMBD que existe.
BIBLIOGRAFA
ORACLE. (2014). MYSQL The world's most popular open source database. Obtenido de
dev.mysql.com/doc/refman/5.0/es/multiple-windows-servers.html
15