Displaying posts with tag: MySQL (reset)
Host ‘ejemplo’ is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’

Es posible que al conectar a un MySQL recibamos el siguiente error: Host 'ejemplo' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' La solución la tenemos en el mismo error, hacer un FLUSH HOSTS. Vamos a ver que es y que variable controla este comportamiento. La variable que controla el número máximo [...]

Recuperación de una tabla InnoDB sin borrar la actual

Anteriormente ya vimos que podemos recuperar los datos de una tabla InnoDB mediante DISCARD TABLESPACE / IMPORT TABLESPACE. El problema viene cuando queremos recuperar la tabla manteniendo la tabla anterior. Para el el caso de MyISAM es tan simple como copiar del backup los ficheros frm, MYD y MYI con otro nombre, pero esto no [...]

El funcionamiento de un ALTER TABLE es sencillo:

El funcionamiento de un ALTER TABLE es sencillo:

1- MySQL bloquea la tabla que se desea modificar.
2- Crea una nueva tabla vacia con la nueva estructura.
3- Copia los datos de la antigua a la nueva.
4- Borra la antigua.
5- Renombra la nueva tabla con el nombre original.

Esto en tablas pequeñas puede ser un proceso de segundos o minutos. En tablas muy grandes, podemos estar hablando de horas. Horas en las cuales las consultas a dicha tabla estarán bloqueadas y las conexiones y peticiones se encolarán. Por lo tanto, hacer un ALTER TABLE en producción puede tener consecuencias bastante desastrosas.

Si tenemos replicación master-slave, podemos hacer el ALTER TABLE por fases. Primero lo hacemos en el esclavo. Cuando termine, promocionamos el esclavo a maestro y el maestro a esclavo. Y vuelta a lanzar el ALTER TABLE en el antiguo maestro (ahora esclavo).

¿Y si no tenemos …

[Lea más]
Mucha gente cree erroneamente que gracias a la opción...

Mucha gente cree erroneamente que gracias a la opción innodb-file-per-table te permite, como MyISAM, portar una tabla en binario de un servidor a otro de forma transparente o recuperar el backup de una tabla. El problema viene cuando realmente necesitan hacer uso de ese backup y no funciona como ellos esperaban.

Al contrario que con MyISAM, donde los ficheros de tablas MYD e MYI son independientes del resto y portables, todas las tablas de InnoDB dependen de un tablespace común donde se almacenan las definiciones de las tablas y además depende de los IDs de transacciones entre otras cosas. Por lo que, si restauras un .idb, no recuperarás los datos.

Todo esto se aplica a la versión original de MySQL, la desarrollada por Oracle. Pero Xtrabackup y Percona Server nos permite esquivar esta limitación y trabajar con los ficheros binarios como si se tratasen de tablas MyISAM, moviéndolas y restaurándolas de un servidor a otro. …

[Lea más]
Cuando tienes un entorno activo-pasivo o montas un esclavo para las...

Cuando tienes un entorno activo-pasivo o montas un esclavo para las lecturas, el mayor problema que te puedes encontrar al poner los nuevos servidores en producción es que las cachés se encuentren frias (cold cache). Como dichos servidores no han recibido consultas, todas sus cachés, como query cache o innodb_buffer_pool se encuentran vacias y todas las consultas tendrán que ir a disco duro durante los primeros minutos u horas. En esos primeros instantes, el rendimiento de tu backend será pésimo.

Hasta ahora, para evitar en la medida de lo posible ese problema, se lanzaban SELECT contra las tablas que obligasen a leerse todas las filas. Eran consultas muy pesadas que tardaban mucho tiempo en ejecutarse y ralentizaban aún más el rendimiento, pero... no había otra solución. Un ejemplo de está solución se puede leer en el blog de Santi Saez …

[Lea más]
Ahora mismo, todos los servidores que compramos son multi-core o...

Ahora mismo, todos los servidores que compramos son multi-core o multi-cpu. MySQL ha ido solucionando sus problemas de escalabilidad, sobre todo a nivel del engine InnoDB, y la diferencia es clara entre MySQL 5.0 y MySQL 5.5, donde el rendimiento en entornos multicore es cada vez mayor. Pero aún queda un punto por mejorar, la replicación de MySQL.

En una replicación MySQL Master/Slave el problema se puede ver claramente. Mientras que en el maestro puedes tener cientos de threads modificando datos en paralelo, estos se escriben de forma ordenada en el binlog mientras que el slave, que solo tiene un thread para aplicar los cambios (SQL Thread), tiene que escribir los cambios uno a uno. De esta forma, el rendimiento que ganamos con la paralelización de las consultas, se pierden al llegar al Slave. Razón por la cual en entornos de alta carga siempre vemos que el esclavo va muy por detrás del Master aplicando los cambios (Seconds Behind …

[Lea más]
Solución al error "mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table"

Si estamos intentando exportar en MySQL una base de datos de gran volúmen, o una base de datos no muy voluminosa, pero con una tabla muy grande en un servidor limitado en cuanto a memoria, es muy probable que nos acabemos por encontrar el siguiente error:

mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table

Este problema se produce porque MySQL carga por defecto la tabla completa antes de exportarla (si es un export de una base de datos completa, lo hace tabla a tabla), y en ocasiones la memoria disponible en el servidor no es suficiente.

La solución es muy simple, es utilizar la opción --quick o -q para que MySQL exporte fila a fila en lugar de meter en buffer toda la tabla y agotar la memoria. Ver documentación.

Ejemplo:

[Lea más]
En ocasiones es necesario hacer un análisis de que está pasando en un...

En ocasiones es necesario hacer un análisis de que está pasando en un servidor con MySQL, comprobar que queries se están ejecutando, cuanto tardan, donde están los cuellos de botella, etc. Hay diferentes formas de hacerlos:

  • A lo pobre: ejecutar SHOW FULL PROCESSLIST cada pocos segundos, identificar a ojo las querys que pueden ser interesantes y luego analizarlas.
  • A lo basto: habilitar el log general de MySQL y almacenar todas las querys que se ejecutan. Te llevarás una gran cantidad de IOPS y puede que el fichero termine siendo tan grande que analizarlo sea un infierno.

Como casi siempre, las maatkit vienen a ayudarnos en esta tarea. En esta ocasión, mk-query-digest nos va a permitir analizar la ejecución de querys y generarnos un reporte. Esta utilidad es capaz de coger datos de los logs, pero aquí vamos a utilizar un parámetro que nos …

[Lea más]
Las replicaciones necesitan de un chequeo constante en la integridad de...

Las replicaciones necesitan de un chequeo constante en la integridad de los datos. Fallos de disco, corrupción de de logs, mezcla de tablas transaccionales y no transaccionales y otros problemas pueden tumbar la consistencia de nuestros datos. Por lo tanto, podemos tener una replicación funcionando, pero los datos, si no hay una comprobación activa, pueden ser diferentes en las dos máquinas. MySQL no tiene comprobaciones activas de consistencia, por lo que es trabajo nuestro. Para ello, instalamos las herramientas maatkit de Percona:

apt-get install maatkit

Las herramientras que usaremos serán mk-table-checksum y mk-table-sync. El funcionamiento de la herramienta se basa en la replicación en base a sentencias de mysql. mk-table-checksum realiza una comprobación mediante un algoritmo de hashing en las tablas, escribiendo los resultados en la base de datos. Estas sentencias se replicarán en el esclavo y se volverán a …

[Lea más]
JOIN y STRAIGHT_JOIN en MySQL

No es muy común ver que el optimizador del MySQL se equivoque estrepitosamente de plan de ejecución, pero cuando lo hace los resultados pueden ser desastrosos. Por ejemplo, para una JOIN como la siguiente: SELECT ul.id, ul.name, s.body FROM mails as s JOIN users as ul ON s.u_id=ul.id WHERE s.domain_id = 25 ORDER BY mail_id [...]