lunes, 24 de diciembre de 2007

MySQL lento, demora al conectar (unauthenticated user)

Uhhh mucho tiempo que no escribía nada... por falta de tiempo y porque no tenia ganas.

 

Hace un tiempo tuve un problema con MySQL que me quitó el sueño varios días porque no encontré ayuda fácilmente (seguramente estaba buscando mal).

 

Un programa que yo hice (que trabaja con una base de datos MySQL), algunas veces demoraba entre 2 y 30 segundos en completar las consultas a la base de datos... después de hacer cambios en el equipo servidor, programa, red, equipos cliente el problema continuaba; incluso había días en que la demora se producía pocas veces y era muy corta y otros días era muy frecuente. Ni se imaginan la vergüenza que me daba al ver que mi programa "se quedaba pegado".

 

mysql> show processlist; ¡¡¡Eso es lo primero que debería haber hecho!!!. Cuando se producía la demora, se podía ver en la lista de procesos, una o varias líneas que como usuario ponía: "unauthenticated user"... esa fue la palabra mágica que me ayudo a encontrar el problema y la solución.

 

Cuando un usuario se conecta, MySQL además de comprobar el nombre de usuario y la contraseña también comprueba el host, osea, resuelve a través del servicio DNS (ya sea local o remoto) la IP y/o dominio desde donde se realiza la conexión... es aquí donde se produce el problema: si el servicio DNS no responde con la rapidez necesaria (algo muy común) se retrasa el login y todo lo demás (consulta, ejecución o lo que sea que se quiera hacer en el servidor).

 

Para evitar este problema (la "incompetencia" del servicio DNS) simplemente le decimos a MySQL que NO intente resolver IP y/o dominio, para esto agregamos "skip-name-resolve" al archivo de configuración de MySQL (/etc/mysql/my.cnf) o lanzamos el servicio mysqld con la opción --skip-name-resolve.

 

Es importante mencionar que solo se podrán usar IPs como host de usuarios.

 

Ahí por fin pude demostrarle al cliente que mis programas y un servidor Linux con MySQL son una maravilla jajaja...

 

Aquí hay mas información sobre como "tunear" MySQL:

How To: Optimize MySQL response time

10 tips para Optimizar consultas MySQL

Porqué MySQL es lento con grandes tablas?

25 comentarios:

Anónimo dijo...

Hola!

Exelente tu TIP hoy todo el dia estuve como loco averiguando cual era el problema ya que monte un servidor nuevo para bases de datos y cual sera mi sorpresa que la aplicacion que se conecta a la base de datos se comportaba supremamente lenta, simplemente agrege la linea skip-name-resolve y boalaaa se arreglo el problema.

Gracias por el tip.

Gerardo
doomtux@yahoo.com

hodavame dijo...

Me alegra mucho saber que te sirvió!

H.

David dijo...

Excelente aporte amigo, solo un comentario, esto solo pasa con clientes Windows, tengo el servidor en ubuntu 7.10 y con clientes ubuntu no tengo problemas, lo que me resulta por demás extraño, si sabes por que comentalo, de todas formas voy a investigar, Saludos y gracias

hodavame dijo...

Hola David

Por lo que he leído (no lo he comprobado yo mismo), este problema no ocurre si en tu servidor tienes un servicio DNS (local o remoto) que funcione perfecto o si en tu /etc/hosts tienes los nombres e IPs de los equipos clientes.

Yo el problema lo tuve en un servidor Debian "Etch" en que no tenia ningún servicio DNS local y los clientes tenían IP dinámica... así que no tenia por donde! La única solución fue desactivar la resolución de nombres en MySQL. Todos los clientes eran windows, así que no sabría decirte si con clientes Linux hubiera funcionado mejor... quizás entre pingüinos se entienden mejor jajaja.

H.

Jesus dijo...

Novato pregunta:

hodavame como esta eso de los host ? es que tengo una aplicacion y se me vuelve extremadamente lenta cuando se utiliza por varios usuarios ya le puse en el MY.cnf la opcion de skip-name-resolve. que mas puedo hacer ?

hodavame dijo...

Hola Jesus

Cuando se produzca el problema de lentitud, revisa los procesos que se están ejecutando, desde mysql con el comando "show processlist" o desde phpMyAdmin en la pestaña "Procesos".

También revisa el "slow query log" (de no estar activo, revisa el my.cnf).

Podría ser también que las tablas son demasiado grandes y no están correctamente indexadas o que el/los programas que utilizan la base de datos hacen consultas innecesariamente complejas o repetitivas.

Te recomiendo que leas las 3 paginas que puse al final del post, salen otros tantos consejos para mejorar el rendimiento de MySQL.

Saludos

pablog dijo...

Hola!
Tuve exactamente el mismo problema que tu, y me has ayudado enormemente. Muchas gracias!

hodavame dijo...

Hola pablog!!


Me alegra mucho que te sirviera!!

Saludos.

Anónimo dijo...

Muchas gracias por este aporte... me fue de gran utilidad, solucione el problema... tenia a casi toda la empresa encima por este problemita... gracias nuevemente....

Anónimo dijo...

simplemete me salvaste
gracias

Anónimo dijo...

Excelente!! Mil gracias.

Anónimo dijo...

Excelente tutorial, me has ahorrado un dolor de cabeza bien grande.

Mil Gracias......!!!!!!!!

deiner dijo...

Hola. Lleba dias con este problema y gracias a su publicacion lo pude solucionar.

Estoy altamente agradecido..

Albert dijo...

Hola compañero, yo suponia que el mysql tardaba mucho en loguiarce y queria cambiarlo porque mis competidores actuales trabajan versiones de sql server. que tambien trabaja muy bien. Pero con este tip que me diste supere los tiempos en velocidad y rendimientos.

Muchas gracias por tu aportacion. Me funciono de lo mejor, ahora tengo mi potente servidor linux funcionando al 100%.

Anónimo dijo...

Tuve el mismo problema con pc`s clientes XP y Windows 2003, lo cual se soluciono incluyendo las ip's en el archivo host.

Ahora que cambie algunas pc's clientes a windows 7, no me funciona ninguna configuracion se pone lento y aparece "unauthenticate user", que podra ser?????

Nicolas M. dijo...

Gracias por darte el tiempo de documentar estas cosas. Nos es muy útil este tipo de aportes...

A mi me has ayudado mucho en un problema que jamás pensé que sucedería por esta razón...

Muchas Gracias

Anónimo dijo...

Mil gracias!! acabas de salvar mi vida! y mi trabajo!!.. no dejes de escribir cosas en tu blog, de nuevo mil gracias!!

Anónimo dijo...

Gracias un gran aporte!! me quite dolores de cabeza!

juantxo dijo...

Dios, gracias, llevo una semana loco por culpa del mismo problema que tenias tu, ya no sabia por donde mirar.

Anónimo dijo...

Muchas gracias, me ayudo bastante. Saludos!!!

Anónimo dijo...

Muchas gracias!!! ya me estaba volviendo un poco loco sin saber porque iban tan lentas las peticiones con el servidor MySQL.

En windows hay una forma facil de activar esa opcion desde el MySQL Administrator mismo. Entráis en la seccion Startup Variables, la pestaña Advanced Networking, y abajo de todo está para activar la opción "Disable name resolving". La activáis, aplicáis los cambios y ya está.

PD: Si os dá error al guardar, ejecutad el MySQL Administrator con el modo administrador.

Anónimo dijo...

Muchísimas gracias. Me sirvió de mucho

Anónimo dijo...

Buenísimo!
Pero no me iba y comprobé qeu hay que escribirlo debajo de [mysqld]
Si se hace al final no sirve.
Muchas gracias

maoegui dijo...

Muchas gracias, problema resuelto

sebastian dijo...

HOLA HODAVAME

YO TENGO EL MISMO PROBLEMA QUE VOS .
tengo un programa cliente en java que conecta mysql servidor que busca por ejemplo desde una interfaz gráfica nombre de artículos stock por ejemplo y la verdad lo hace muy pero muy lento.

Explico lo que hice … logré hacer una coneccion remota a un servidor mysql linux ubuntu
15.10. a través del comando putty haciendo un tunnel .

y después hice los cambios pertinente osea agregar la línea
skip-name-resolve
al archivo sudo gedit /etc/mysql/my.cnf
sería así :
sudo gedit /etc/mysql/my.cnf
[mysqld]
skip-name-resolve
cerré ese archivo con las modificaciones y posteriormente
sudo /etc/init.d/mysql restart
pero sigue andando lento ….
ahora la consulta que te hago hodavame u otros lectores que ya hayan pasado por la misma situación. como lograste la conexion a traves del ip public a través del puerto convencional 3306 de mysql liberando los puertos del router ..3306 ??
o tal vez sea que hay que tocar en el archivo /etc/hosts
a mi me figura así
:
gedit /etc/hosts
127.0.0.1 localhost
127.0.1.1 eduart-VirtualBox

saludos a todos ...espero yo también poder servir a alguien ..que tenga una duda con conexiones putty mi mail es seba266@yahoo.com.ar