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?

30 comentarios:

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

    ResponderBorrar
  2. Me alegra mucho saber que te sirvió!

    H.

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

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

    ResponderBorrar
  5. 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 ?

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

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

    ResponderBorrar
  8. Hola pablog!!


    Me alegra mucho que te sirviera!!

    Saludos.

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

    ResponderBorrar
  10. simplemete me salvaste
    gracias

    ResponderBorrar
  11. Excelente!! Mil gracias.

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

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

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

    Estoy altamente agradecido..

    ResponderBorrar
  14. 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%.

    ResponderBorrar
  15. 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?????

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

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

    ResponderBorrar
  18. Gracias un gran aporte!! me quite dolores de cabeza!

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

    ResponderBorrar
  20. Muchas gracias, me ayudo bastante. Saludos!!!

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

    ResponderBorrar
  22. Muchísimas gracias. Me sirvió de mucho

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

    ResponderBorrar
  24. Muchas gracias, problema resuelto

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

    ResponderBorrar
  26. Yo tengo una aplicación hecha en Java pero también tengo el mismo problema que se hace muy lento al momento de hacer una consulta simple como es de 'select * from producto' bueno la aplicacion esta conectada a una base de datos de un hosting y realmente ya voy como dos dias buscando como solucionarlo peo hasta el momento no he encontrado la forma de solucionar..

    Si alguien me pudiera ayudar la aplicacion es de Java GUI y la base de datos es MySQL 5.6

    ResponderBorrar
  27. Gracias por el aporte!!! Excelente solución!!

    ResponderBorrar
  28. Excelente! Me salvaste el día!

    ResponderBorrar
  29. Está bien, pero puede ser un problema de seguridad en aplicaciones corporativas

    ResponderBorrar