Вы находитесь на странице: 1из 182

Administracin MySQL

Miguel ngel Nieto <miguelangel@irontec.com> Irontec Internet y Sistemas sobre GNU/Linux

Irontec Administracin de MySQL

Instalacin

Irontec Administracin de MySQL

Instalacin

La instalacin puede realizarse de las siguientes formas:


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

Cada uno tiene sus ventajas e inconvenientes

Irontec Administracin de MySQL

Instalacin

http://downloads.mysql.com/archives.php Para compilar en debian es necesario como mnimo:

aptgetinstallbuildessentiallibncurses5dev ./configurehelp ./configureprefix=/usr/local/mysql ./configurewithoutplugininnodb #groupaddmysql #useraddgmysqlmysql #cdscripts #./mysql_install_db


4

Como siempre ./configure && make && make install


Tenemos que crear los usuarios:


Creamos las bases de datos necesarias para funcionar


Irontec Administracin de MySQL

Instalacin

Damos permisos a la carpeta:


#chownRroot/usr/local/mysql #chownRmysql/usr/local/mysql/var #chgrpRmysql/usr/local/mysq

Copiamos el fichero de configuracin y lo editamos en caso de que sea necesario:

#cpsupportfiles/mymedium.cnf/etc/my.cnf #/usr/local/mysql/bin/mysqld_safeuser=mysql

Arrancamos MySQL :)

Irontec Administracin de MySQL

Instalacin

Los binarios podemos descargarlos de: http://dev.mysql.com/downloads/mysql/


#groupaddmysql #useraddgmysqlmysql #cd/usr/local #tarxzfmysqlVERSIONOS.tar.gz #cdmysql #chownRmysql. #chgrpRmysql. #scripts/mysql_install_dbuser=mysql #chownRroot. #chownRmysqldata #bin/mysqld_safeuser=mysql&

Irontec Administracin de MySQL

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!

Irontec Administracin de MySQL

SandBox

Para crear una laboratorio de pruebas podemos:


Montar equipos fsicos e instalarlos (de locos). Montar mquinas virtuales. Usar sandbox!

Irontec Administracin de MySQL

SandBox

SandBox nos permite:


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...

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Uso de SandBox

Crear un sandbox con una nica instancia de MySQL

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

Irontec Administracin de MySQL

Uso de SandBox

Parar sandbox:

stop start use restart clean

Arrancar sandbox:

Utilizar sandbox:

Reiniciar sandbox:

Limpiar el sandbox:

13

Irontec Administracin de MySQL

Clientes

Existen distintos clientes para conectarse a la BBDD Clientes de consola


Mysql Mysqldump Mysqladmin Mysqlimport Mysql Administrator Mysql Query Browser MySQL Workbench

Grficos

etc.
14

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Clientes

MySQL administrator

16

Irontec Administracin de MySQL

Clientes

MySQL Query Browser

17

Irontec Administracin de MySQL

Clientes

MySQL Workbench

18

Irontec Administracin de MySQL

Ficheros de configuracin

19

Irontec Administracin de MySQL

Ficheros de configuracin

Algunos parmetros de configuracin se pueden pasar directamente al mysqld

mysqldbasedir/usr/local/mysql Habilitar/deshabilitar engines Opciones de rendimiento Logs

Otros parmetros que se pueden especificar:


Es ms cmodo especificarlo en los ficheros de configuracin

20

Irontec Administracin de MySQL

Ficheros de configuracin

Por defecto busca los ficheros en las siguientes ubicaciones:


/etc/my.cnf $MYSQL_HOME/my.cnf ~/.my.cnf

Se puede aadir un fichero de configuracin en el arranque con:

defaultsextrafile

21

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Engines

23

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Engines

Al crear una tabla se puede indicar el engine:


createtablet(iINT)ENGINE=MyISAM;

Una vez que est creada, se puede cambiar el engine:


altertabletENGINE=MyISAM;

Tambin podemos saber con que engine se ha creado una tabla


Showcreatetablet;

26

Irontec Administracin de MySQL

Engines

De que engines tenemos soporte?


showengines\G

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

Irontec Administracin de MySQL

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:

mitabla.frm mitabla.MYD mitabla.MYI

28

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

MyISAM

Las prioridades pueden moficiarse haciendo useo de los schedulers:

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

MyISAM

Para conocer el formato en el que se encuetran las filas de una tabla:


SHOWTABLESTATUSLIKE't'\G

Crear tabla FIXED:

CREATETABLEt(cCHAR(50))ROW_FORMAT=FIXED;

Crear tabla DYNAMIC:


CREATETABLEt(cCHAR(50))ROW_FORMAT=DYNAMIC;

34

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Memory

Soporta dos tpos de ndices, HASH y BTREE:

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

InnoDB

InnoDB nos ofrece todo aquello de lo que MyISAM carece


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

Irontec Administracin de MySQL

InnoDB

Y que perdemos al pasarnos a 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

Irontec Administracin de MySQL

InnoDB

InnoDB es un engine que cumple las caractersticas ACID:

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

InnoDB

InnoDB dispone de 4 niveles de aislamiento:

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

Irontec Administracin de MySQL

InnoDB

Por defecto InnoDB utiliza REPEATABLE READ para ser full ACID Para cambiar de uno a otro aislamiento de:

[mysqld] Transactionisolation=READCOMMITED

49

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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:

REPETABLE READ READ COMMITED


51

Irontec Administracin de MySQL

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?

SET AUTOCOMIT = 0; START TRANSACTION; COMMIT;

Para habilitar el rollback podemos aadir un SAVEPOINT


SAVEPOINT nombre; ROLLBACK TO SAVEPOINT nombre;

52

Irontec Administracin de MySQL

Mantenimiento de tablas

53

Irontec Administracin de MySQL

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:

Chequear Reparar Analizar Optimizar

54

Irontec Administracin de MySQL

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:

mysql>checktableA; +++++ |Table|Op|Msg_type|Msg_text| +++++ |pruebas.A|check|status|OK| +++++ 1rowinset(0.00sec)

55

Irontec Administracin de MySQL

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

[mysqld] myisamrecover=[Opciones] Default:opcionespordefecto Backup:hacebackupdelastablasquetengaque cambiar Force:fuerzalareparacinaunquesepuedan perderdatos Quick:lastablasnofragmentadasseevitan

56

Irontec Administracin de MySQL

Mantenimiento de tablas

Reparacin en caliente

mysql>repairtableA; +++++ |Table|Op|Msg_type|Msg_text| +++++ |pruebas.A|repair|status|OK| +++++ 1rowinset(0.00sec)

57

Irontec Administracin de MySQL

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

mysql>analyzetableA; +++++ |Table|Op|Msg_type|Msg_text| +++++ |pruebas.A|analyze|status|OK| +++++ 1rowinset(0.00sec)

58

Irontec Administracin de MySQL

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

mysql>optimizetableA; +++++ |Table|Op|Msg_type|Msg_text| +++++ |pruebas.A|optimize|status|OK| +++++ 1rowinset(0.00sec)


59

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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:

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Usuarios y permisos

63

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Usuarios y permisos

Se puede crear un usuario que se conecta desde cualquier ubicacin:

'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

Irontec Administracin de MySQL

Usuarios y permisos

Para ver todos los permisos disponibles y una descripcin:


mysql>showprivileges;

Nos muestra tres columnas:


Privilege: es el nombre del permiso Context: contexto en el cual es posible aplicar el permiso Comment: breve explicacin

66

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Usuarios y permisos

Los permisos pueden aplicarse en diferentes contextos:


Server Databases Tables Functions Procedures Indexes File Access

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Usuarios y permisos

Para cambiar una contrasea hay distintas formas:

Para un usuario en particular:

mysql>SETPASSWORDfor'miguel'@'localhost'= PASSWORD('nueva');

Para tu usuario:

mysql>SETPASSWORD=PASSWORD('nueva');

Mediante GRANT:

mysql>GRANTUSAGEON*.*TO 'miguel'@'localhost'IDENTIFIEDBY'nueva';
70

Irontec Administracin de MySQL

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:

ON *.* ON db.* ON db.table ON db.routine


71

Irontec Administracin de MySQL

Usuarios y permisos

Para eliminar un permiso haremos uso de REVOKE:

mysql>REVOKESELECTONmysql.*FROM 'miguel'@'localhost';

El usuario seguir existiendo, pero sin el permiso indicado

mysql>showgrantsfor'miguel'@'localhost';

Si le borramos el ltimo permiso, USAGE, no se podr conectar

72

Irontec Administracin de MySQL

Optimizacin de querys

73

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

logslowqueries=/var/log/mysql/slowquerys.log long_query_time=5 Logqueriesnotusingindexes

Log de querys lentas (superior a 5 segundos) as como querys sin ndices :)

75

Irontec Administracin de MySQL

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

Nos resumir las querys lentas

76

Irontec Administracin de MySQL

Optimizacin de querys

Cmo se ve en el log?

/var/log/mysql#catmysqlslow.log #Query_time:4.00sLock_time:0Rows_sent:0 Rows_examined:1380 SELECT*FROMfoobarWHEREid="foo"; #Query_time:2.50sLock_time:0Rows_sent:0 Rows_examined:1380 SELECT*FROMfoobarWHEREid="bar";

77

Irontec Administracin de MySQL

Optimizacin de querys

Ejemplo de mysqldumpslow:

/var/log/mysql#mysqldumpslowmysqlslow.log Count:2Time=4s(6.50s)Lock=0.00s(0s) Rows=1380(2760) SELECT*FROMfoobarWHEREid='S';

78

Irontec Administracin de MySQL

Optimizacin de querys

Ya tenemos identificadas las querys lentas, ahora es necesario estudiarlas

Mysql > explain [extended] SELECT [opciones]

Basicamente nos mostrar informacin del plan de ejecucin del optimizador Slo funciona con SELECT

79

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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?

Aadiendo ndices Optimizar la query aadiendo ms detalles

Despus de cada cambio hay que comprobar si existe mejora

85

Irontec Administracin de MySQL

Optimizacin de querys

Aadiendo un ndice:

Mysql>altertableCityaddindex(CountryCode); QueryOK,4079rowsaffected(0.02sec) Records:4079Duplicates:0Warnings:0

Ejecutamos de nuevo la query con explain:


id:1 select_type:SIMPLE table:City type:ref possible_keys:CountryCode key:CountryCode key_len:3 ref:const rows:58 Extra:Usingwhere 1rowinset(0.00sec)
86

Irontec Administracin de MySQL

Optimizacin de querys

Modificamos la query aadiendo ms datos, hacindola ms concisa:


explainSELECT*fromCitywhere CountryCode='ESP'andDistrict='Madrid'; altertableCityaddindex(District); id:1 select_type:SIMPLE table:City type:index_merge possible_keys:CountryCode,District key:District,CountryCode key_len:20,3 ref:NULL rows:1 Extra:Usingintersect(District,CountryCode); Usingwhere 1rowinset(0.00sec)
87

Irontec Administracin de MySQL

Optimizacin de la base de datos

88

Irontec Administracin de MySQL

Optimizacin de la base de datos

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

Irontec Administracin de MySQL

Optimizacin de la base de datos


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

Irontec Administracin de MySQL

Optimizacin de la base de datos

Las optimizaciones tambin dependern mucho del tipo de querys que ejecutemos Para tener una estadstica mysql> show status like 'Com%';

91

Irontec Administracin de MySQL

Optimizacin de la base de datos

Nmero mximo de conexiones (max_connections)

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

mysql>showstatuslike'%connections%'; +++ |Variable_name|Value| +++ |Connections|4651724| |Max_used_connections|41| +++ 2rowsinset(0.01sec)


92

Irontec Administracin de MySQL

Optimizacin de la base de datos

Cache de tablas (table_cache)

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

Irontec Administracin de MySQL

Optimizacin de la base de datos

Cacheo de ndices en MyISAM (key_buffer_size)


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

Irontec Administracin de MySQL

Optimizacin de la base de datos

Buffer de InnoDB (innodb_buffer_pool_size)

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

mysql>showvariableslike 'innodb_buffer_pool_size'; +++ |Variable_name|Value| +++ |innodb_buffer_pool_size|838860800| +++ 1rowinset(0.00sec)

95

Irontec Administracin de MySQL

Optimizacin de la base de datos

Cacheo de querys (query_cache_size)

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

Irontec Administracin de MySQL

Optimizacin de la base de datos

Midiendo la efectividad de la cache:

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

Si hits es bajo e inserts alto... hay que aumentar la cach

97

Irontec Administracin de MySQL

Optimizacin de la base de datos

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

Irontec Administracin de MySQL

Optimizacin de tablas

99

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Optimizacin de tablas

Particionemos!

101

Irontec Administracin de MySQL

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

Es transparente, no tendremos que modificar las aplicaciones


102

Irontec Administracin de MySQL

Optimizacin de tablas

Cosas a tener en cuenta antes de particionar:

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

Irontec Administracin de MySQL

Optimizacin de tablas

El particionado se puede hacer:


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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Optimizacin de tablas CREATETABLEemployees( idINTNOTNULL, fnameVARCHAR(30), lnameVARCHAR(30), hiredDATENOTNULLDEFAULT'197001 01', separatedDATENOTNULLDEFAULT '99991231', job_codeINT, store_idINT ) PARTITIONBYHASH(YEAR(hired)) PARTITIONS4;

107

Irontec Administracin de MySQL

Optimizacin de tablas

CREATETABLEEmployee( emp_idINT, fnameVARCHAR(50), lnameVARCHAR(50), store_idTINYINT )ENGINE=MyISAM PARTITIONBYKEY(lname) PARTITIONS4;

108

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Optimizacin de tablas

Mantenimiento de tablas RANGE y LIST

Se pueden aadir ms particiones Se pueden eliminar particiones (borra datos)


ALTERTABLEgenteDROPPARTITIONp4

ALTERTABLEgenteADDPARTITION(PARTITIONp4VALUES LESSTHAN(2010));

Se reorganizar particiones
PARTITIONs0VALUESLESSTHAN(1960), PARTITIONs1VALUESLESSTHAN(1970) );

ALTERTABLEgenteREORGANIZEPARTITIONp0INTO(

111

Irontec Administracin de MySQL

Optimizacin de tablas

Mantenimiento de tablas HASH y KEY

Se pueden aadir ms particiones


ALTERTABLEgenteADDPARTITIONPARTITIONS2;

Se pueden reducir el nmero de particiones, DROP no funciona


ALTERTABLEgenteCOALESCALEPARTITION2;

Las particiones HASH o KEY se auto reorganizan segn aadamos o eliminemos particiones

112

Irontec Administracin de MySQL

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:

Irontec Administracin de MySQL

Optimizacin de tablas

ALTERTABLEgenteREBUILDPARTITIONp1; ALTERTABLEgenteOPTIMIZEPARTITIONp1; ALTERTABLEgenteANALYZEPARTITIONp1; ALTERTABLEgenteREPAIRPARTITIONp1; ALTERTABLEgenteCHECKPARTITIONp1;

114

Irontec Administracin de MySQL

Logs

115

Irontec Administracin de MySQL

Logs

En MySQL tenemos 3 tipos de 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

Para que nos pueden servir?


116

Irontec Administracin de MySQL

Logs

Slow Logs:

Goto 75

117

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Logs

Los logs binarios almacenan los cambios que se realizan en la BBDD (update, insert, delete, alter, etc.) Nos sirven para:

Recuperacin de backup Replicacin

Es recomendable tenerlos habilitados, no consumen mucho y nos pueden salvar la vida En caso de replicacin es obligatorio tenerlos habilitados

119

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Logs

121

Irontec Administracin de MySQL

Logs

El diagrama para el logeo de tablas es demasiado grande y no entra ;)


http://dev.mysql.com/doc/refman/5.0/en/replication-rules-table-options.html

Para rellenar la diapositiva pondr un dibujo:

No se quien es el autor :(
122

Irontec Administracin de MySQL

Replicacin y alta disponibilidad

123

Irontec Administracin de MySQL

Arquitecturas de replicacin

Tenemos varias formas de montar una arquitectura de replicacin.


Maestro-Maestro Maestro-Esclavo Circular

Segn lo que se necesite, se monta una u otra.

124

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Maestro-Esclavo

Un maestro, mltiples esclavos. En el maestro se escribe, en el esclavo se lee.

126

Irontec Administracin de MySQL

Maestro-Esclavo

Primero debemos configurar el maestro. Imprescindible:


Habilitar los logs binarios. Crear un usuario que permita conectarse a los esclavos. Habilitar sync_binlog. Elegir un server-id.

logbin=mysqlbin serverid=1 sync_binlog=1

127

Irontec Administracin de MySQL

Maestro-Esclavo

Dar permisos de conexin a los eslavos y dumpeamos la BD:


mysqldumpBDmasterdata=2>dump_file;

mysql>grantreplicationslaveon*.*to 'replication'@10.10.10.1identifiedby'slave'; mysql>grantreplicationslaveon*.*to 'replication'@10.10.10.2identifiedby'slave';

128

Irontec Administracin de MySQL

Maestro-Esclavo

Configuramos el eslavo:

Seleccionamos un ID diferente para cada uno. Importamos la BD. Nos configuramos como esclavo de un maestro.

$mysqlurootp<dump serverid=101 mysql>CHANGEMASTERTOMASTER_HOST=10.10.10.100, MASTER_USER=replication,MASTER_PASSWORD=slave, MASTER_LOG_FILE=master_log_file,MASTER_LOG_POS= master_log_pos;

129

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Maestro-Esclavo

Para comprobar si la replicacin es correcta tenemos el comando showslavestatus. Este nos tiene que mostrar lo siguiente:

[...] Slave_IO_Running:Yes Slave_SQL_Running:Yes [...] Seconds_Behind_Master:0

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

Irontec Administracin de MySQL

Maestro-Maestro

Lo que se escribe en uno se replica en el otro. Se puede escribir en los dos.

133

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Maestro-Maestro

Se debe tener en cuenta, al igual que antes, lo siguiente:


Habilitar el log binario. Seleccionar un server-id. Establecer el valor de sync_binlog. Crear los usuarios para la replicacin.

El funcionamiento, opciones, monitorizacin, etc. es todo igual.

135

Irontec Administracin de MySQL

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

Cmo sera para el server B?

136

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Tambin habr que tener cuidado con los autoincrementales:


auto_increment_increment=4 auto_increment_offset=1

139

Irontec Administracin de MySQL

Replicacin rota

140

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Replicacin rota

Para saber si dos tables estn sincronizadas, podemos sacar un checksum de estas y comparar:

mktablechecksum mktablesync

Para sincronizar los datos de dos tablas:

$mktablechecksumh=host1,u=user,p=passwordh=host2 $mktablesyncexecute u=user,p=pass,h=host1,D=db,t=tblhost2

144

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

MMM

146

Irontec Administracin de MySQL

MMM

Tambin el Perl. El mundo se ha vuelto loco... Caractersticas:


Monitorizacin de la replicacin Monitorizacin de los hosts Gestin del failover Balanceo de IPs entre nodos Gestin de grupos de escritura/lectura

147

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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.

Escritura (maestro) Lectura (esclavo)

149

Irontec Administracin de MySQL

MMM

http://mysql-mmm.org/ En el sistema de control se instalar:


mysql-mmm-common_2.0.10-1_all.deb mysql-mmm-monitor_2.0.10-1_all.deb mysql-mmm-common_2.0.10-1_all.deb mysql-mmm-agent_2.0.10-1_all.deb

En los nodos:

Junto con todas las dependencias!

150

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

MMM

mmm_common.conf Incluye la configuracin de:


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

Irontec Administracin de MySQL

MMM

mmm_mon.conf Incluye la configuracin de:


Usuario/Contrasea para la monitorizacin Ips a las que pingar Ruta de los binarios Ruta del PID Nivel de debug

153

Irontec Administracin de MySQL

MMM

mmm_agent Incluye la configuracin de:


El nombre de este servidor Todo el mmm_common.conf Y nada ms :P

154

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

MMM

Ejemplo! Parando un servidor en produccin:


MMM:~#mmm_controlset_offlinedb1 OK:Stateof'db1'changedtoADMIN_OFFLINE.Nowyoucan waitsometimeandcheckallroles! MMM:~#mmm_controlshow db1(10.100.1.1)master/ADMIN_OFFLINE.Roles: db2(10.100.1.2)master/ONLINE.Roles: writer(10.100.1.10) db3(10.100.1.3)slave/ONLINE.Roles:reader(10.100.1.12) db4(10.100.1.4)slave/ONLINE.Roles:reader(10.100.1.11)

157

Irontec Administracin de MySQL

MySQL Proxy

158

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

MySQL Proxy

Trae scripts de ejemplo, que entre otras cosas te permite:


Reescribir queries. Balanceo de carga. Loggeo avanzado. Failover. Anlisis de queries.

160

Irontec Administracin de MySQL

MySQL Proxy

La instalacin es sencilla, descargamos de:

http://dev.mysql.com/downloads/mysql-proxy/ /usr/local/mysql-proxy

Descomprimimos en:

Tenemos el binario en bin Tenemos scripts de ejemplo en share/doc/mysql-proxy/

161

Irontec Administracin de MySQL

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

Dos conexiones de ejemplo balanceadas:


mysql>showvariableslike'%host%'; +++ |Variable_name|Value| +++ |hostname|shyris| |report_host|SBnode1| +++ 2rowsinset(0,00sec)
162

mysql>showvariableslike'%host%'; +++ |Variable_name|Value| +++ |hostname|shyris| |report_host|SBnode2| +++ 2rowsinset(0,00sec)

Irontec Administracin de MySQL

MySQL Proxy

Ya vienen una serie de scripts incluidos Algunas funciones del script:


Balancear lecturas entre nodos esclavos Separar lecturas/escrituras entre distintos nodos Reescribir querys proxyluascript=

Para hacer uso de un script se usa la opcin:

163

Irontec Administracin de MySQL

MySQL Proxy

Ejemplo de reescritura de querys (template-rewrite):

mysqlproxyproxyaddress=10.10.0.123:4040proxybackend addresses=127.0.0.1:24155proxylua script=/usr/local/mysqlproxy/share/doc/mysql proxy/tutorialrewrite.lua

Ahora podemos ejecutar en MySQL los comandos ls y who :)

164

Irontec Administracin de MySQL

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

MySQL Cluster DRBD LVS Heartbeat Flipper etc.

165

Irontec Administracin de MySQL

Otras soluciones de HA y LB

Cada uno tiene sus puntos debiles y fuertes Antes de decirdirse...


Documentarse Probar Probar Probar Documentarse Probar Y elegir!

Importante, que tenga una buena comunidad de usuarios/desarrolladores detrs :)

166

Irontec Administracin de MySQL

Backup

167

Irontec Administracin de MySQL

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:

De texto plano Binarios

168

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Backups

Outfile Es posible hacer backup desde el propio MySQL


mysql>SELECT*INTOOUTFILE'fichero'FROMtabla;

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Backup

Mysqldump Dumpear una BD:

mysqldump miBD > fichero mysqldump miDB tabla1 tabla2 > fichero mysqldump databases miDB tuDB > fichero mysqldump all-databases > fichero

Dumpear varias tablas de una BD:

Dumpar dos DB:

Dumpear todas las DB:

173

Irontec Administracin de MySQL

Backup

mysqldump Por defecto se aplica la opcin opt, que incluye:

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Backup

Backup binario de InnoDB Es necesario tener el servidor parado Se debe copiar:


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

Irontec Administracin de MySQL

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

Irontec Administracin de MySQL

Backup

XtraBackup Hacer un backup


innobackupex1.5.1/tmp/backup/

Preparar el backup (aplicar los logs de innodb creados durante el backup)


innobackupex1.5.1applylog/tmp/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

Irontec Administracin de MySQL

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

Recuperar todo el binlog


mysqlbinlog/var/log/mysql/bin.123456|mysqluroot

Recuperar hasta una fecha/hora


mysqlbinlogstopdate="20050420 9:59:59"/var/log/mysql/bin.123456|mysqluroot

Recuperar desde una fecha/hora


mysqlbinlogstartdate="2005042010:01:00" /var/log/mysql/bin.123456|mysqluroot
180

Irontec Administracin de MySQL

Se acab

miguelangel@irontec.com miguel2angel http://miguelangelnieto.net

181

Irontec Administracin de MySQL

Licencia Creative Commons 3.0

182

Вам также может понравиться