Академический Документы
Профессиональный Документы
Культура Документы
Instalacin
Instalacin
Cdigo fuente Binarios Sistema de paquetes de tu distribucin Cdigo fuente es laborioso, pero te permite definir mejor las carctersticas de tu servidor, activando y desactivando a tu gusto Los binarios vienen compilados y son ms fciles de actualizar. Si estn compilados con icc se puede casi doblar el rendimiento Sistema de paquetes, facil de instalar y de actualizar
Instalacin
Instalacin
#cpsupportfiles/mymedium.cnf/etc/my.cnf #/usr/local/mysql/bin/mysqld_safeuser=mysql
Arrancamos MySQL :)
Instalacin
Instalacin
En Debian podemos hacer la instalacin con apt-get :) En cualquiera de los tres modos de instalacin es necesario dar una contrasea a root!
SandBox
Montar equipos fsicos e instalarlos (de locos). Montar mquinas virtuales. Usar sandbox!
SandBox
Montar sistemas de replicacin Probar versiones nuevas de MySQL facilmente Manejar mltiples instancias de MySQL desde un nico punto. Te olvidas de rmps, sources, debs... tar.gz binario! Testear Testear Testear...
SandBox
No es un producto oficial de MySQL. Est escrito el perl (puag!) y an as funciona bien. http://mysqlsandbox.net/ Tendremos que descargar un paquete tar.gz de MySQL y Sandbox.
10
Instalacin
Como root!
root@shyris:~#tarxzfMySQLSandbox3.0.05.tar.gz root@shyris:~#cdMySQLSandbox3.0.05/ root@shyris:~/MySQLSandbox3.0.05#perlMakefile.PL root@shyris:~/MySQLSandbox3.0.05#make root@shyris:~/MySQLSandbox3.0.05#maketest root@shyris:~/MySQLSandbox3.0.05#makeinstall root@shyris:/usr/local/bin#ls low_level_make_sandboxmake_multiple_sandboxmake_sandbox make_sandbox_from_sourcesbtest_sandbox make_multiple_custom_sandboxmake_replication_sandbox make_sandbox_from_installedmsandboxsbtool
11
Uso de SandBox
punisher@shyris:~$make_sandbox/home/punisher/MySQL/mysql 5.0.86perconahighperfb19.tar.gz unpacking/home/punisher/MySQL/mysql5.0.86percona highperfb19.tar.gz Executinglow_level_make_sandbox basedir=/home/punisher/MySQL/5.0.86\ sandbox_directory=msb_5_0_86\ install_version=5.0\ sandbox_port=5086\ no_ver_after_name\ my_clause=logerror=msandbox.err
12
Uso de SandBox
Parar sandbox:
Arrancar sandbox:
Utilizar sandbox:
Reiniciar sandbox:
Limpiar el sandbox:
13
Clientes
Mysql Mysqldump Mysqladmin Mysqlimport Mysql Administrator Mysql Query Browser MySQL Workbench
Grficos
etc.
14
Clientes
Mysql: el tpico, nos permite conectarse tanto de forma local como remota y ejecutar sentencias SQL Mysqldump: permite hacer backups Mysqladmin: crear/borrar bases de datos, cambiar contraseas, ver el estado, variables, parar slaves, etc. Mysqlimport frontend para LOAD DATA INFILE Vienen ya incluidos en MySQL
15
Clientes
MySQL administrator
16
Clientes
17
Clientes
MySQL Workbench
18
Ficheros de configuracin
19
Ficheros de configuracin
20
Ficheros de configuracin
defaultsextrafile
21
Ficheros de configuracin
El fichero se encuentra dividido en distintas secciones, por ejemplo [mysqld], [mysql], [mysqldump] Cada opcin dentro de una categora se aplica nicamente a dicha aplicacin
[mysql] prompt='mysql[\h]{\u}(\d)>' [mysqld] user=punisher port=5140 socket= /tmp/mysql_sandbox5140.sock [mysqldump] quick quotenames max_allowed_packet=100M
22
Engines
23
Engines
MySQL es modular, permite elegir entre diferentes engines para el almacenamiento de datos Los engines se aplican a tablas, no a bases de datos Puedes tener una base de datos con diferentes engines, dependiendo del tipo de datos o consultas que se hagan
24
Tablas
Todas las tablas de MySQL tienen ciertas similitudes Las tablas tienen .frm como formato. Este fichero guarda la estructura de la tabla Independientemente del engine, tendremos un .frm A parte, podemos tener otros ficheros acompaando al .frm
25
Engines
26
Engines
mysql[localhost]{msandbox}(mysql)> ***************************1.row*************************** Engine:InnoDB Support:YES Comment:Supportstransactions,rowlevellocking,andforeignkeys Transactions:YES XA:YES Savepoints:YES ***************************2.row*************************** Engine:MRG_MYISAM Support:YES Comment:CollectionofidenticalMyISAMtables Transactions:NO XA:NO Savepoints:NO ***************************3.row*************************** Engine:BLACKHOLE Support:YES Comment:/dev/nullstorageengine(anythingyouwritetoitdisappears) Transactions:NO XA:NO Savepoints:NO [...]
27
MyISAM
MyISAM es el engine por defecto en MySQL Si no se indica lo contrario, todas las tablas se crearn con este engine Es obligatorio tener soporte para el engine en MySQL, ya que todas las tablas de la BBDD son MyISAM La tabla viene definida por tres ficheros:
28
MyISAM
Antes de usar MyISAM hay que conocer bien sus virtudes y defectos :) Soporta busquedas FULLTEXT Al escribir se hace uso de bloqueo de tabla Se puede usar para generar tablas MERGE No soporta, transacciones, integridad referencial o claves externas Suele ser el ms rpido en lecturas No tiene cacheo de datos Se pueden comprimir tablas para ahorrar espacio
http://dev.mysql.com/doc/refman/5.1/en/myisam-storage-engine.html
29
MyISAM
El bloque en MyISAM se hace a nivel de tabla No pueden ocurrir deadlocks (dos procesos se quedan esperando a que termine el otro) Soporta inserciones concurrentes siempre y cuando la tabla no tenga agujeros causados por el borrado de datos (optimize table) Las escrituras tienen prioridad sobre las lecturas El servidor intenta hacer las escrituras en el orden en que las recibe
30
MyISAM
Si una tabla se est leyendo y llega una peticin de escritura, al escritura tiene que esperar Si una tabla se est escribiendo y llega una peticin de lectura, la lectura tiene que esperar Si hay escrituras pendientes, las lecturas que llegun tendrn que ponerse a la cola
31
MyISAM
LOW PRIORITY: para las querys que escriben datos. La escritura se queda esperando a que terminen todas las lecturas, incluso las que llegan despus. Se escribir cuando no exista ninguna lectura pendiente. HIGH PRIORITY: para las querys de lectura. Las querys con este modificador se mueven al principio de la cola, por delante de otras escrituras y lecturas DELAYED: para querys INSERT y REPLACE. El servidor mete en buffer las filas y lo inserta cuando no se est usando la tabla. Las delayed se insertan en bloques en lugar de una a una aumentando el rendimiento
32
MyISAM
MyISAM puede almacenar las filas en tres formatos, fixed, dynamic y compressed.
FIXED
Todas las filas tienen el mismo tamao Ocupan ms espacio Se encuentran ms rpido Usa un tamao variable de datos (menos que fixed) Las filas no se encuentran tan eficientemente Puede haber ms fragmentacin Ocupan mucho menos espacio Optimizado para consultas rpidas Solo lectura
33
DYNAMIC
COMPRESSED
MyISAM
CREATETABLEt(cCHAR(50))ROW_FORMAT=FIXED;
34
MyISAM
Una tabla MyISAM, fixed o dynamic, puede convertirse en tabla comprimida Se suelen comprimir aquellas que se usan para datos histricos y que nunca van a ser modificadas Son de solo lectura Se comprimen con la utilidad myisampack Se debe parar el servidor antes de comprimir los datos Se descomprimen con myisamchk --unpack
35
MyISAM
$myisampackdepartmentsemployees
departmentsistoosmalltocompress Compressingemployees.MYD:(300024records) Calculatingstatistics Compressingfile 47.12% Remembertorunmyisamchkrqoncompressedtables
$myisamchkrqdepartmentsemployees
checkrecorddeletechain recovering(withsort)MyISAMtable'departments' Datarecords:9 Fixingindex1 Fixingindex2 checkrecorddeletechain recovering(withsort)MyISAMtable'employees' Datarecords:300024 Fixingindex1
36
Merge
Una tabla merge es una coleccin de distintas tablas con la misma estructura Una query en la tabla merge se ejecuta en todas las tablas que la componen Puede ayudarnos a superar el tamao mximo de una tabla MyISAM (256TB) Es mas lento, ya que tiene que leer mltiples tablas Aumenta el nmero de descriptores de ficheros abiertos requeridos
37
Merge
Se suele utilizar para borrar millones de datos en un instante. Gracias a merge podemos borrar la tabla que lo compone en lugar de ir eliminando una a una cada fila
mysql>CREATETABLEA(namevarchar(100)) ENGINE=MyISAM;QueryOK,0rowsaffected(0.00sec) mysql>CREATETABLEB(namevarchar(100)) ENGINE=MyISAM;QueryOK,0rowsaffected(0.00sec) mysql>CREATETABLETOTAL(namevarchar(100)) ENGINE=MERGEUNION=(A,B)INSERT_METHOD=LAST; QueryOK,0rowsaffected(0.01sec)
38
Merge
El problema de bloqueo se acenta ms con Merge Cuando se bloquea para escritura, se bloquean todas las tablas que contiene Cuando se bloquea para lectura, se bloquean todas las tablas que contiene Aadir un registro en Merge puede traer como consecuencia el bloqueo de cientos de tablas Contra ms tablas y mas datos, mas problemas de rendimiento y bloqueos
39
Memory
Es una tabla en memoria, lo cual ya nos da sus pros y contras solo con el nombre
Es muy muy rpida Los datos no se guardan despus del reinicio del servidor Usan la memoria RAM, por lo que no debe usarse para tablas grandes Usa bloqueo a nivel de tablas No puede tener columnas TEXT o BLOB
40
Memory
HASH: memory las usa por defecto. El algoritmo es muy rpido para comparaciones que usen ndices nicos. Pero solo se puede usar para comparaciones = o <=> BTREE: es preferible para ndices que se usarn con comparaciones disintas a las anteriores. Por ejemplo: id<1024 or id BETWEEN 4000 and 5000 CREATETABLET(iint)ENGINE=MEMORY;
41
Federated
Te permite usar tablas de otro servidores MySQL remotos De esta forma el cliente no debe conectarse a otros servidores para acceder a los datos Al estar en un servidor remoto, las federated no soportan el bloqueo de tablas
CREATETABLEfederated_table( idINT(20)NOTNULLAUTO_INCREMENT, nameVARCHAR(32)NOTNULLDEFAULT'', otherINT(20)NOTNULLDEFAULT'0', PRIMARYKEY(id), INDEXname(name), INDEXother_key(other) ) ENGINE=FEDERATED DEFAULTCHARSET=latin1 CONNECTION='mysql://fed_user@remote_host:9306/federated/tes t_table';
42
Federated
Los engines que se conectan a un servidor externo para coger datos (como FEDERATED, NDB o SPIDER) tienen un funcionamiento poco optimo cuando las querys tienen condiciones En estos engines, la condicin no se envia junto con la peticin, por lo tanto el servidor remoto nos transmite TODAS las filas de la tabla para que nuestro MySQL local haga la bsqueda Para solucionarlo se debe implementar CONDITION PUSHDOWN ya sea mediante un parche o plugin Dependiendo del engine tendremos diferentes soluciones (o en algunos casos ninguna)
43
InnoDB
Claves externas Integridad referencial Bloqueo de filas en lugar de tablas Auto recuperacin ante errores Transacciones y rollbacks Cacheo de ndices y datos Etc...
http://dev.mysql.com/doc/refman/5.1/en/innodb.html
44
InnoDB
Capacides de busqueda FULLTEXT La posibilidad de comprimir las tablas No poder hacer uso de Merge Slo 64 TB de datos por tabla
45
InnoDB
Atomic: O todas las sentencias se ejectuan correctamente o se cancelan. Consistent: Es consistente cuando una transaccin que comienza la deja en estado consistente al terminar. Isolated: Una transaccin no afecta a las dems. Durable: Todos los cambios efectuados por una transaccin se graban. No se pierden datos.
46
InnoDB
Cuando se producen mltiples transacciones que afectan a los mismos datos, pueden darse los siguientes problemas:
Dirty read: es una lectura de una transaccin de datos no commiteados realizados por otra. Si finalmente esta ltima no hace el commit, lo que hemos leido no sirve! Non-repeatable: ocurre cuando una transaccin realiza la misma peticin de datos dos veces recibiendo resultados distintos Phantom: ocurre cuando aparece una fila que no era visible en la query, ya que otra transaccin la ha incluido durante el proceso de lectura
47
InnoDB
READ UNCOMMITED: permite a una transaccin ver los datos sin commitear de otra. Se pueden dar nonrepeatable reads, phantoms y dirty reads READ COMMITED: permite ver cambios de otras transacciones solo si estn commiteados. Se pueden dar non-repeatable reads y phantoms REPETABLE READ: asegura que la misma SELECT ejecutada dos veces de los mismos valores. Las filas modificadas por una transaccin no puden ser modificadas por otras. Se pueden dar phantoms SERIALIZE: separa completamente los efectos de unas transacciones sobre otras con la restriccin de que las filas seleccionadas por una transaccin no pueden ser accedidas por otras
48
InnoDB
Por defecto InnoDB utiliza REPEATABLE READ para ser full ACID Para cambiar de uno a otro aislamiento de:
[mysqld] Transactionisolation=READCOMMITED
49
InnoDB
InnoDB implementa la concurrencia en las transacciones siguiendo el modelo MVCC (multiversion concurrency control) Permite que cada transaccin tenga una visin nica de los datos (un snapshot) para tener una vista consistente con el paso del tiempo, sin tener en cuenta las modificaciones de otras transacciones Esto puede permitir que distintas transacciones vean datos diferentes de la misma tabla en un mismo momento Gracias a esto evitamos tener que bloquear siempre las filas. Menos overhead y ms operaciones concurrentes En lecturas casi nunca se bloquearn las filas
50
InnoDB
MVCC funciona aadiendo a cada fila dos valores adicionales que indican cuando fu creada y cuando fu eliminada Con esto InnoDB se asegura que al iniciar una transaccin...
La fila exista antes de iniciar la transaccin La fila no fu eliminada antes de iniciar la transaccin
Con cada actualizacin de la fila, la transaccin actualiza los valores asociados El multiversioning se utiliza con:
InnoDB
Por defecto InnoDB viene habilitado con autocommit, cada query se commitea al instante Esto no nos permite hacer rollback ni agrupar querys en batch para mejorar el rendimiento Y como desactivo el autocommit?
52
Mantenimiento de tablas
53
Mantenimiento de tablas
Existen una serie de comandos que nos ayudar al mantenimiento de las tablas Algunos son tienen utilidad en unos engines pero no en otros Podemos:
54
Mantenimiento de tablas
CHECK TABLE
Realizar un chequeo de integridad tanto de la estructura como del contenido de los datos Funciona tanto en MyISAM como InnoDB En MyISAM adems actualiza las estadsticas de los ndices
Su uso es el siguiente:
55
Mantenimiento de tablas
REPAIR TABLE
Repara los errores que se puedan encontrar en una tabla Solo funciona con MyISAM Se puede habilitar el auto-reparado de tablas
56
Mantenimiento de tablas
Reparacin en caliente
57
Mantenimiento de tablas
ANALYZE TABLE
Actualiza las tablas con informacin acerca de la distribucin de los valores de las claves en la tabla Esta informacin la usa el optimizador para elegir el mejor plan de ejecucin Solo funciona en MyISAM
58
Mantenimiento de tablas
OPTIMIZE TABLE
Desfragmenta las tablas MyISAM, eliminando los huecos generados por mltiples updates y deletes Actualiza las estadsticas de los ndices Se puede utilizar en InnoDB, pero no desfragmenta (ya que InnoDB no se fragmenta) Actualiza las estadsticas de ndices y libera espacio relacionado con ndices
Mantenimiento de tablas
Existen herramientas externas de consola que tambin nos pueden ayudar con el mantenimiento
mysqlcheck myisamchk
Mysqlcheck enva las sentencias SQL necesarias para el mantenimiento. Por lo tanto, mysqld debe estr en funcionamiento Myisamchk no necesita de un servidor en funcionamiento, puede actuar directamente contra las tablas en el sistema de ficheros
60
Mantenimiento de tablas
Mysqlcheck nos ofrece alguna ventaja al uso de las sentencias SQL directamente
Podemos indicarle una BBDD para que haga operaciones de mantenimiento en todas sus tablas en lugar de indicar una a una Al ser un comando de consola, se puede crear una tarea programada Mysqlcheck test (chequea BBDD test) Mysqlcheck test A (chequea tabla A de la BBDD test) Mysqlcheck all-databases (chequea todo) --check, --repair, --analyze, --optimize
61
Ejemplo:
Mantenimiento de tablas
Myisamchk permite realizar las mismas tareas que mysqlcheck Se debe hacer offline, con mysqld apagado Actua directamente sobre las tablas Es el ltimo recurso cuando ni siquiera el servidor arranca (por ejemplo, tablas en la BBDD mysql corruptas) Como el propio nombre indica, solo funciona con tablas MyISAM
62
Usuarios y permisos
63
Usuarios y permisos
MySQL permite definir usuarios y decidir que pueden hacer Los usuarios siguen el siguiente formato:
'usuario'@'host'
No es lo mismo irontec@localhost que irontec@10.10.0.210 La primera parte es el nombre de usuario con el que haremos login, mientras que la segunda ser la IP desde la cual nos conectamos
64
Usuarios y permisos
'irontec'@'%'
Los usuarios y permisos se guardan dentro de las tablas user y grant de la BBDD mysql Es posible insertar datos directamente mediante la consola de mysql, pero tambin es ms lioso No debe existir nunca un 'root'@'%', por seguridad!
65
Usuarios y permisos
Privilege: es el nombre del permiso Context: contexto en el cual es posible aplicar el permiso Comment: breve explicacin
66
Usuarios y permisos
Permisos especiales:
ALL y ALL PRIVILEGES da todos los permisos excepto GRANT OPTION USAGE no da ningn privilegio excepto el de conexin
67
Usuarios y permisos
Por ejemplo, no puedes dar permisos FILE a un usuario sobre una tabla, es un permiso global o CREATE ROUTINE a nivel de ndice Todos pueden aplicarse globalmente
68
Usuarios y permisos
Para crear un usuario se debe indicar tanto el usuario como el host y su contrasea (no obligatorio):
mysql>createuser'irontec'@'localhost' IDENTIFIEDBY'1234';
Borrar un usuario:
mysql>dropuser'irontec'@'localhost';
Renombrar un usuario:
mysql>renameuser'irontec'@'localhost'TO 'miguelangel'@'localhost';
69
Usuarios y permisos
mysql>SETPASSWORDfor'miguel'@'localhost'= PASSWORD('nueva');
Para tu usuario:
mysql>SETPASSWORD=PASSWORD('nueva');
Mediante GRANT:
mysql>GRANTUSAGEON*.*TO 'miguel'@'localhost'IDENTIFIEDBY'nueva';
70
Usuarios y permisos
Para dar permisos se usa GRANT Importante: si el usuario al que damos permisos no existe, lo crea
mysql>GRANTSELECTONmysql.*TO 'miguel'@'localhost'IDENTIFIEDBY'test';
Se pueden indicar mltiples permisos separndolos por comas Para aplicar a distintos contextos:
Usuarios y permisos
mysql>REVOKESELECTONmysql.*FROM 'miguel'@'localhost';
mysql>showgrantsfor'miguel'@'localhost';
72
Optimizacin de querys
73
Optimizacin de querys
Hay que tener especial cuidado con las querys que se lanzan a una base de datos Si est mal construida puede degradar el rendimiento del servicio Es necesario detectar estas querys y reescribirlas completamente EXPLAIN nos ayudar a saber como se comportar internamente una query y cuales son sus deficiencias
74
Optimizacin de querys
En primer lugar debemos detectar cuales son esas querys Para ello nos ayudaremos del log-slow En este log se irn escribiendo las sentencias SQL que tarden un tiempo superior al que le indiquemos Su activacin no afecta al rendimiento como otros logs
75
Optimizacin de querys
El log puede crecer con el tiempo y leerlo con un editor de textos convertirse en un infierno No es necesario hacerte tu propio script, ya existen utilidades para dumpearlo
/var/log/mysql#mysqldumpslowmysqlslow.log
76
Optimizacin de querys
Cmo se ve en el log?
77
Optimizacin de querys
Ejemplo de mysqldumpslow:
78
Optimizacin de querys
Basicamente nos mostrar informacin del plan de ejecucin del optimizador Slo funciona con SELECT
79
Optimizacin de querys
Problema:
explainSELECT*fromCitywhere CountryCode='ESP'\G ***************************1.row *************************** id:1 select_type:SIMPLE table:City type:ALL possible_keys:NULL key:NULL key_len:NULL ref:NULL rows:4079 Extra:Usingwhere 1rowinset(0.00sec)
80
Optimizacin de querys
ID: identificador de la query, en caso de tener subquerys select_type: el tipo de select. Simple, primary, derived, union, subquery table: indica el nombre de la tabla utilizada type: tipo de acceso para la query. system/const, eq_ref, ref, ref_or_null, index_merge, range, index, ALL possible_keys: lista de ndices disponibles para usar key: ndice utilizado key_len: nmero de bytes utilizados del ndice rows: nmero de filas a leer extra: informacin extra de la query
81
Optimizacin de querys
Type:
system: la tabla tiene una nica fila const: la tabla tiene una nica fila coincidente con la query eq_ref: la busqueda por ndices da una nica fila ref: similar a eq_ref pero puede devolver ms de una fila ref_or_null: igual que los anteriores, pero tambin busca valores NULL index_merge: el nico tipo de acceso que usa dos ndices range: busqueda por rango index: busqueda completa por la tabla, pero de ndices en lugar de los datos ALL: escaneo completo de la tabla. MAL
82
Optimizacin de querys
Extra:
Using index: se est usando un index, cogiendo el dato del ndice en lugar de la tabla Using filesort: se ordenan las filas de forma manual en lugar de usar ndices Using temporary: se ha usado una tabla temporal (en RAM o disco) para realizar la consulta Using where: el filtrado se hace fuera del engine
83
Optimizacin de querys
Volvemos al problema :)
explainSELECT*fromCitywhere CountryCode='ESP'\G ***************************1.row *************************** id:1 select_type:SIMPLE table:City type:ALL possible_keys:NULL key:NULL key_len:NULL ref:NULL rows:4079 Extra:Usingwhere 1rowinset(0.00sec)
84
Optimizacin de querys
El optimizador no encuentra ndices Al no encontrar... no puede usar Como no hay ndices, el tipo de bsqueda es ALL, se lee todas las filas Como podramos mejorarlo?
85
Optimizacin de querys
Aadiendo un ndice:
Optimizacin de querys
88
Cuando nos referimos a optimizar la base de datos, esto implica en primer lugar optimizar el servidor
RAM: contra ms RAM, ms ndices y datos en memoria, por lo tanto ms velocidad de respuesta CPU: nunca sobra la CPU y los cores ;) Disco duro: contra ms rpido mejor. ltimamente se estan empezando a usar disco SSD para bases de datos
Una vez que tenemos el mejor equipo que podamos comprar, tocar optimizar la base de datos de acuerdo a dicho hardware
89
32 o 64 bits? Siempre que sea posible es recomendable 64 bits En sistemas GNU/Linux y Solaris de 32 bits, un solo proceso no puede usar ms de 2GB. Por lo tanto da igual que tengamos 4, MySQL usar la mitad En algunos sistemas, segn un parmetro de configuracin del kernel, puede disponer de 3 GB, pero puede ser insuficiente En 64 bits no existe esa limitacin Si tienes 32 bits, no configures MySQL para que use mas de 2GB, tendrs errores de falta de memoria
memory=key_buffer+(sort_buffer_size+read_buffer_size)*max_connections
90
Las optimizaciones tambin dependern mucho del tipo de querys que ejecutemos Para tener una estadstica mysql> show status like 'Com%';
91
Son el nmero mximo de conexiones simultaneas que soportar el servidor Cada conexin en espera consume memoria Se debe ajustar a un nmero no muy superior a la media de nuestro servidor
Cada vez que mysql abre una tabla mantiene en cache informacin sobre ella para evitar reabrirlas Si se abren muchas y un usuario necesita abrir otra nueva, una de las ya abiertas debe cerrarse No vale poner millones y millones, estamos limitados por los descriptores del sistema operativo
Si Open_tables est cercano a Table_cache y Opened_tables no para de aumentar, toca subir el table_cache mysql>showstatuslike'Open%tables%';
+++ |Variable_name|Value| +++ |Open_tables|1551| |Opened_tables|0| +++ 2rowsinset(0.02sec)
93
Cachea los ndices que lee de una tabla MyISAM Permite reutilizar los ndices en lugar de leerlos continuamente, ms rendimiento Para calcularlo: Ratio de fallo: Key_reads / Key_read_requests Eficiencia: 1 (Key_reads / Key_read_requests) Los fallos tienen que estar lo ms cerca posible de 0 y eficiencia de 1
mysql>showstatuslike'Key_read%'; +++ |Variable_name|Value| +++ |Key_read_requests|150683856| |Key_reads|325197| +++ 2rowsinset(0.01sec)
94
Cache tanto los ndices como los datos de una tabla InnoDB El valor por defecto es 8 megas, pero se recomienda entre el 50% y 80% de la memoria total del sistema
95
Nos permite almacenar en cache el resultado de una query select La cache solo se mantiene mientras los datos de la tabla no se modifiquen
query_cache_type: OFF desactivado, ON activado, DEMAND solo para SELECT SQL_CACHE query_cache_size: 0 es desactivado query_cache_limit: el tamao mximo de una query que se puede almacenar
96
Qcache_hits: numero de querys que no se han ejecutado por estar en cache Qcache_inserts: el nmero total de querys guardadas en la cache Qcache_lowmem_prunes: nmero de caches eliminadas por falta de memoria
97
Otros valores:
read_buffer_size: cuando se lee una tabla lo leer en bloques del tamao que aqu indiquemos. Contra mas grande, ms rpido la leer read_rnd_buffer_size: por defecto coge el valor del anterior. Se usa para lecturas no secuenciales (como las requeridas por ORDER BY) sort_buffer_size: para las operaciones con ORDER o GROUP BY join_buffer_size: para querys con joins
98
Optimizacin de tablas
99
Optimizacin de tablas
Si las tablas aumentan mucho puede llegar un momento en el que los ndices ocupen ms que la propia RAM del sistema
NDICES
RAM
100
Optimizacin de tablas
Particionemos!
101
Optimizacin de tablas
Si no queremos comprar ms RAM, los ndices se vuelven lentos Particionar se vuelve ms rpido que los ndices Ser nuestra salvacin cuando:
Nos quedemos sin RAM Tenemos muchsimos datos Guardamos datos histricos Rotamos datos Datos crecientes
Optimizacin de tablas
La columna que utilicemos para definir el rango de las particiones debe ser un INT, no se acepta cualquier otro valor Si tenemos una clave nica o una primary key, esta debe usarse para particionar Como mximo se permiten 1024 particiones No se permiten claves externas No se permiten bsquedas FULL TEXT
103
Optimizacin de tablas
Por rango: es el ms sencillo, se divide en base a rangos Por listas: se divide en particiones en base a una lista de posibles valores Por hash: nos permite dividir los datos de forma equitativa entre todas las particiones. La expresin por la que separar los datos debe devolver un entero Por key: similar a hash. En lugar de indicar nosotros el valor del hash, lo hace el propio MySQL con md5 y password(). Pueden usarse columnas que no sean entero
104
Optimizacin de tablas
CREATETABLEemployees( idINTNOTNULL, fnameVARCHAR(30), lnameVARCHAR(30), hiredDATENOTNULLDEFAULT'19700101', separatedDATENOTNULLDEFAULT'999912 31', job_codeINTNOTNULL, store_idINTNOTNULL ) PARTITIONBYRANGE(store_id)( PARTITIONp0VALUESLESSTHAN(6), PARTITIONp1VALUESLESSTHAN(11), PARTITIONp2VALUESLESSTHAN(16), PARTITIONp3VALUESLESSTHAN(21), PARTITIONp3VALUESLESSTHANMAXVALUE );
105
Optimizacin de tablas
CREATETABLEemployees( idINTNOTNULL, fnameVARCHAR(30), lnameVARCHAR(30), hiredDATENOTNULLDEFAULT'19700101', separatedDATENOTNULLDEFAULT'999912 31', job_codeINT, store_idINT ) PARTITIONBYLIST(store_id)( PARTITIONpNorthVALUESIN(3,5,6,9,17), PARTITIONpEastVALUESIN (1,2,10,11,19,20), PARTITIONpWestVALUESIN (4,12,13,14,18), PARTITIONpCentralVALUESIN(7,8,15,16) );
106
Optimizacin de tablas CREATETABLEemployees( idINTNOTNULL, fnameVARCHAR(30), lnameVARCHAR(30), hiredDATENOTNULLDEFAULT'197001 01', separatedDATENOTNULLDEFAULT '99991231', job_codeINT, store_idINT ) PARTITIONBYHASH(YEAR(hired)) PARTITIONS4;
107
Optimizacin de tablas
108
Optimizacin de tablas
Existe un script que nos permite crearnos la query de creacin de particiones http://forge.mysql.com/wiki/Partition_Helper
./partitions_helpertable=mytablecolumn=d interval=yearstart=20040101end=20090101 ./partitions_helpertable=mytablecolumn=d interval=monthstart=20080101end=20090101 ./partitions_helpertable=mytablecolumn=prod_id interval=1000start=1end=10000
109
Optimizacin de tablas
Para comprobar si las particiones funcionan y en que particin se encuentran nuestros datos:
mysql[localhost]{msandbox}(employees)>explain partitionsselectcount(*)fromsalaries wherefrom_datebetween'20000101'and'20001231'\G ***************************1.row *************************** id:1 select_type:SIMPLE table:salaries partitions:p016 type:index possible_keys:NULL key:emp_no key_len:4 ref:NULL rows:2830488 Extra:Usingwhere;Usingindex 1rowinset(0.00sec)
110
Optimizacin de tablas
ALTERTABLEgenteADDPARTITION(PARTITIONp4VALUES LESSTHAN(2010));
Se reorganizar particiones
PARTITIONs0VALUESLESSTHAN(1960), PARTITIONs1VALUESLESSTHAN(1970) );
ALTERTABLEgenteREORGANIZEPARTITIONp0INTO(
111
Optimizacin de tablas
Las particiones HASH o KEY se auto reorganizan segn aadamos o eliminemos particiones
112
Optimizacin de tablas
Reconstruir particin:
Borrar los datos de la particin para volver a insertarlos. De esta forma solucionas el problema de fragmentado Otra forma de solucionar la fragmentacin. Reclama el espacio libre y reorganiza los datos Lee y almacena la distribucin de ndices Repara particiones corruptas Chequea una particin en busca de errores
113
Optimizar particin:
Analizar particin:
Reparar particin:
Chequear particin:
Optimizacin de tablas
114
Logs
115
Logs
Slow: guardan las querys lentas Sql: guarda todas las querys que se ha recibido el servidor Binlog: guarda nicamente las querys que modifican datos Arreglar querys lentas o sin ndices Debuggear a nivel SQL nuestra aplicacin Replicacin o recuperacin de backup
116
Logs
Slow Logs:
Goto 75
117
Logs
SQL log almacena todas las querys que llegan a nuestro servidor Se puede usar para debuggear nuestra aplicacin antes de pasarla a produccin En produccin no es recomendable tenerlo habilitado, consume muchos recusos tanto de CPU como de disco duro Si este log est activado, el logrotate debe estar habilitado log=/var/log/mysql/mysql.log
118
Logs
Los logs binarios almacenan los cambios que se realizan en la BBDD (update, insert, delete, alter, etc.) Nos sirven para:
Es recomendable tenerlos habilitados, no consumen mucho y nos pueden salvar la vida En caso de replicacin es obligatorio tenerlos habilitados
119
Logs
Otras opciones:
max_binlog_size (por defecto y mximo 1 GB) expire_logs_days sync_binlog (>0) replicate-do-db replicate-ignore-db binlog-do-db binlog-ignore-db replicate-do-table replicate-wild-do-table replicate-ignore-table replicate-wild-ignore-table
120
Logs
121
Logs
No se quien es el autor :(
122
123
Arquitecturas de replicacin
124
Limitaciones
Un esclavo solo puede tener un maestro. Por el contrario, un maestro mltiples esclavos. No es recomendable montar una replicacin por WAN. La replicacin es asncrona y sensible a latencias. En un servidor esclavo esta prohibido escribir datos, solo se usarn selects.
125
Maestro-Esclavo
126
Maestro-Esclavo
Habilitar los logs binarios. Crear un usuario que permita conectarse a los esclavos. Habilitar sync_binlog. Elegir un server-id.
127
Maestro-Esclavo
128
Maestro-Esclavo
Configuramos el eslavo:
Seleccionamos un ID diferente para cada uno. Importamos la BD. Nos configuramos como esclavo de un maestro.
129
Maestro-Esclavo
Master_log_pos y Master_log_file indican al esclavo desde que posicin del log binario deben leer, de forma que no se repliquen datos que ya tenemos. Podemos sacarlo con un dump como ya hemos visto o con el comando showmasterstatus; El log binario debe estr habilitado :)
130
Maestro-Esclavo
No se debe dejar al servidor la eleccin de cuando escribir los datos al disco duro. Si el servidor se cae sin que algunos datos se escriban en el log, es posible que estos se pierdan (depender del sistema de ficheros). sync_binlog por defecto es 0, que deja que el servidor decida cuando realizar la escritura al disco. Se recomienda un valor de 1, para que se fuerce la escritura. Esto tambin es lento, depender de los discos duros instalados. Si el servidor se cae, como mucho perderemos una transaccin. 131
Maestro-Esclavo
Para comprobar si la replicacin es correcta tenemos el comando showslavestatus. Este nos tiene que mostrar lo siguiente:
Slave_IO_Running: Se encarga de conectarse al maestro para comprobar cambios Slave_SQL_Running: Se encarga de escribir las sentencias SQL. Seconds_Behind_Master: El lag en segundos entre el maestro y el esclavo.
132
Maestro-Maestro
133
Maestro-Maestro
La arquitectura maestro-maestro es igual a la maestro esclavo. Aqu los hosts realizan las dos tareas, maestro y esclavo al mismo tiempo. Esta arquitectura soporta como mximo dos hosts, ya que un esclavo solo puede tener como mximo un maestro. A es maestro de B. B es maestro de A. A es esclavo de B. B es esclavo de A.
134
Maestro-Maestro
Habilitar el log binario. Seleccionar un server-id. Establecer el valor de sync_binlog. Crear los usuarios para la replicacin.
135
Maestro-Maestro
Los auto-incrementales son el gran problema de este tipo de arquitectura. Si se realizan dos insert al mismo tiempo que incluya un campo autoincremental, podemos tener un problema de ID duplicado. A enva a B un artculo cuyo ID autoincremental es 3000, B enva un artculo diferente a A cuyo autoincremental es 3000 tambin. La replicacin se rompe.
auto_increment_increment=2 auto_increment_offset=1
136
Circular
Lo que se escribe en uno se replica en el siguiente, este en el siguiente, este en... A B C D A Es la menos recomendable. En realidad est casi prohibida tambin ;)
137
Circular
Es una forma de disponer de ms de dos servidores en arquitectura maestro-maestro. Contra ms sean los hosts implicados, mayor el caos de su administracin. ABCDEA Si el host C se cae (por ejemplo) la replicacin se rompe. Lo escrito en B no se replica, lo escrito en D se replica en todos menos en C, etc. Si se cae por ejemplo B y D, el caos es infinito. La solucin es salir corriendo. A no ser que no exista otra solucin, no se recomienda.
138
Circular
Los logs que reciben los esclavos, deben logearlos en el log binario para enviarselo al siguiente en la cadena. Esto no es el funcionamiento por defecto, los que se recibe como esclavo no se logea. Para cambiarlo:
logslaveupdates
En algn momento de la cadena nos llegarn nuestros propios logs. Para evitar formar un bucle:
Replicatesameserverid=0
auto_increment_increment=4 auto_increment_offset=1
139
Replicacin rota
140
Replicacin rota
Es recomendable tener el error-log habilitado, ah se guardar, entre otras cosas, cualquier error relacionado con la replicacin. EJEMPLO!
Sep1111:13:16test2mysqld[6776]:09091111:13:16 [ERROR]Slave:Error'Table't'alreadyexists'on query.Defaultdatabase:'mysql'.Query:'CREATE TABLEt(cCHAR(20)CHARACTERSETutf8COLLATE utf8_bin)',Error_code:1050 Sep1111:13:16test2mysqld[6776]:09091111:13:16 [ERROR]Errorrunningquery,slaveSQLthread aborted.Fixtheproblem,andrestarttheslaveSQL threadwith"SLAVESTART".Westoppedatlog'mysql bin.000003'position421
141
Replicacin rota
Forma rpida y no tan buena de solucionarlo: Decirle al esclavo que ignore esa query y continue con la replicacin:
mysql>stopslave;QueryOK,0rowsaffected(0.00 sec) mysql>SETGLOBALSQL_SLAVE_SKIP_COUNTER=1;Query OK,0rowsaffected(0.00sec) mysql>startslave;
142
Replicacin rota
Forma buena de solucionarlo: http://www.maatkit.org/ Maatkit makes MySQL easier to manage. Lo de easier ponedlo entre muchas comillas. Son una coleccin de herramientas que nos puede ayudar en la administracin de nuestro servidores, y en este caso en particular, en rescatar una replicacin. Todas las utilidades: http://www.maatkit.org/doc/
143
Replicacin rota
Para saber si dos tables estn sincronizadas, podemos sacar un checksum de estas y comparar:
mktablechecksum mktablesync
144
MMM
Cuando ya sabemos que queremos y lo montamos, llega el mantenimiento. Si tenemos un cluster de, por ejemplo, 2 maestros y 50 esclavos, comprobar el correcto funcionamiento es complicado. Y si deseamos parar algn esclavo? Y si deseamos parar algn maestro? Es necesario reducir el tiempo de parada de servicio al mnimo.
145
MMM
146
MMM
Monitorizacin de la replicacin Monitorizacin de los hosts Gestin del failover Balanceo de IPs entre nodos Gestin de grupos de escritura/lectura
147
MMM
La alta disponibilidad se hace mediante el balanceo de Ips virtuales que saltarn de un servidor a otro en caso de ser necesario.
Exclusivo: Una nica IP para muchos hosts. Si el host que la tiene se cae se balancea a otro. Generalmente se usa en los nodos de escritura. Balanceado: Una IP por cada host. Si uno de los hosts se cae la IP se balancea a cualquier otro, pasando a tener dos IPs virtuales. Se usa para nodos en lectura.
148
MMM
Se pueden meter los servidores dentro de dos roles, escritura y lectura. Escritura es obligatorio, mientras que el de lectura no tiene porque definirse. La diferencia es lgica:
Nodos de escritura son aquellos en los que los datos se escribirn. Nodos de lectura son aquellos de los cuales se leern datos.
149
MMM
En los nodos:
150
MMM
Los ficheros de configuracin se guardan en /etc/mysqlmmm Todos tendrn un fichero llamado mmm_common.conf que ser exactamente igual. El nodo de control mmm_mon.conf Los servidores de MySQL mmm_agent.conf
151
MMM
Los Hosts Sus Ips Los roles Usuario/Contrasea del agente Usuario/Contrasea para la replicacin La interfaz de red en la que se trabaja
152
MMM
Usuario/Contrasea para la monitorizacin Ips a las que pingar Ruta de los binarios Ruta del PID Nivel de debug
153
MMM
154
Como hemos visto, hay varios usuarios y contraseas definidos. Hay que crerlos en MySQL.
GRANTREPLICATIONCLIENTON*.*TO'mmm_monitor'@'10.100.1.%' IDENTIFIEDBY'RepMonitor'; GRANTSUPER,REPLICATIONCLIENT,PROCESSON*.*TO 'mmm_agent'@'10.100.1.%'IDENTIFIEDBY'RepAgent'; GRANTREPLICATIONSLAVEON*.*TO'replication'@'10.100.1.%' IDENTIFIEDBY'slave';
MMM
El usuario monitor se usa para comprobar el estado de los servidores Mysql. El usuario agent se usa para cambiar el read only mode, poner offline un equipo, ejecutar un change_master, etc. El usuario replication slave... para replicacin ;)
155
MMM
Una vez puesto en marcha los servicios, se deben poner online los servidores desde el comando de control.
MMM:~#mmm_controlshow db1(10.100.1.1)master/AWAITING_RECOVERY.Roles: db2(10.100.1.2)master/AWAITING_RECOVERY.Roles: db3(10.100.1.3)slave/AWAITING_RECOVERY.Roles: db4(10.100.1.4)slave/AWAITING_RECOVERY.Roles: MMM:~#mmm_controlset_onlinedb1 OK:Stateof'db1'changedtoONLINE.Nowyoucanwait sometimeandcheckitsnewroles! MMM:~#mmm_controlset_onlinedb2 OK:Stateof'db2'changedtoONLINE.Nowyoucanwait sometimeandcheckitsnewroles! MMM:~#mmm_controlset_onlinedb3 OK:Stateof'db3'changedtoONLINE.Nowyoucanwait sometimeandcheckitsnewroles! MMM:~#mmm_controlset_onlinedb4 OK:Stateof'db4'changedtoONLINE.Nowyoucanwait sometimeandcheckitsnewroles!
156
MMM
157
MySQL Proxy
158
MySQL Proxy
El balanceo de carga se puede hacer bien por hardware como por software. Existe un software creado para MySQL que nos puede ayudar. Para que te ayude debes saber LUA. http://forge.mysql.com/wiki/MySQL_Proxy Es un proxy que se pone entre el cliente y los servidores de MySQL.
159
MySQL Proxy
160
MySQL Proxy
http://dev.mysql.com/downloads/mysql-proxy/ /usr/local/mysql-proxy
Descomprimimos en:
161
MySQL Proxy
Los parmetros mnimos a indicar son los servidores para los cuales har de proxy Si no se indica nada ms, actuar como balanceador de carga round-robin Proxy:
mysqlproxyproxyaddress=10.10.0.123:4040proxybackend addresses=127.0.0.1:18002proxybackendaddresses=127.0.0.1:18001
MySQL Proxy
Balancear lecturas entre nodos esclavos Separar lecturas/escrituras entre distintos nodos Reescribir querys proxyluascript=
163
MySQL Proxy
164
Otras soluciones de HA y LB
MMM o MySQL proxy son solo algunas de las soluciones de alta disponibilidad y balanceo de carga Hay muchas opciones, propias de MySQL o genericas del sistema operativo
165
Otras soluciones de HA y LB
166
Backup
167
Backup
Siempre es importante tener un buen backup Adems de tenerlo, debe funcionar cuando lo necesitemos! En MySQL no hay una nica forma de realizar los backups, existen muchas herramientas Los backups pueden ser:
168
Backup
Backup texto plano Estos backups son generalmente ms lentos Generan un fichero con todas las secuencias SQL necesarias para recuperar una BBDD o tabla Son portables entre distintas arquitecturas El servidor de MySQL tiene que estar en funcionamiento mysqldump outfile
169
Backup
Backups binarios Sn ms rpidos No son portables a diferentes arquitecturas, p.ej de Intel x86 a PowerPC El servicio puede estar parado En resumen, se trata de copiar los ficheros de las tablas a mano o con herramientas especializadas mysqlhotcopy xtrabackup ibbackup cp
170
Backups
El fichero de salida no debe existir Vale para cualquier engine Requiere privilegio FILE No tiene muchas ms opciones :) Vlido tanto para un MySQL local como remoto Limitado pero funcional para un momento dado
171
Backup
Mysqldump Puede hacer copia de BBDD completas, o tablas Puede ser local o remoto (almacenndose siempre localmente) Puedes guardar los datos en ficheros con campos separados por tabulador (el tpico CSV)
172
Backup
mysqldump miBD > fichero mysqldump miDB tabla1 tabla2 > fichero mysqldump databases miDB tuDB > fichero mysqldump all-databases > fichero
173
Backup
add-locks: Aade lock tables para las tablas dumpeadas (asi al recuperar ningun proceso interfiere en las tablas) create-options: Aade los statements CREATE TABLE, de forma que las crea y luego las llena de datos quick: Escribe en el dump segun va leyendo las filas. Bueno si tienes una tabla enorme extended-insert: En lugar de mil inserts, agrupa varios inserts en uno solo lock-tables: Bloquea las tablas antes hacer el backup disable-keys: Aade un alter table que deshabilita la actualizacin de los ndices al recuperar el backup, esto hace que la recuperacin se mas rapida
174
Backup
Backup binario de myisam Para hacer un backup binario de tablas myisam se deben copiar los ficheros .frm .MYD y .MYI El servidor debe estar parado o... en caso de estr encendido las tablas bloqueadas:
mysql>useMyDB; mysql>LOCKTABLESMyTableREAD; mysql>FLUSHTABLESMyTable; backup mysql>UNLOCKTABLES;
175
Backup
Backup binario de MyISAM Es un script en perl que puede hacer backup de tablas MyISAM Se conecta a MySQL, bloquea las tablas, las flushea y finalmente las copia
mysqlhotbackupworld/tmp/backup mysqlhotbackupworld./City//tmp/backup
176
Backup
Los ficheros .frm Los tablespaces .ibd Los logs de InnoDB Los ficheros de configuracin que tengas con opciones de InnoDB
Para hacerlo online existen soluciones comerciales (InnoDB Hot Backup) y soluciones libres (xtrabackup)
177
Backup
XtraBackup Herramienta de backup desarrollado por Percona para hacer backup en vivo de tablas InnoDB http://www.percona.com/mysql/xtrabackup/ El binario xtrabackup por defecto solo soporta InnoDB Viene un script en Perl llamado innobackupex-1.5.1 que nos copiar todas las BBDD y tablas existentes (ser como un frontend para XtraBackup) El binario XtraBackup por si slo nicamente backupea el tablespace
178
Backup
Listo! En /tmp/backup tienes una carpeta con la fecha del backup que se puede copiar directamente a /var/lib/mysql ATENCION! Los permisos no se mantienen, tienes que reaplicarlos
179
Backup
Binary logs Si haces un backup todos los das a las 00:00 y la BBDD se rompe a las 08:00, has perdido 8 horas de datos Los logs binarios nos permiten recuperar esos datos Extraer a un .sql
mysqlbinlog/var/log/mysql/bin.123456/tmp/mysql_restore.sql
Se acab
181
182