No se puede conectar al servidor MySQL local a través del socket ‘/tmp/mysql.sock

Cuando intenté conectarme a un servidor MySQL local durante mi suite de prueba, falla con el error:

OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)") 

Sin embargo, en todo momento puedo conectarme a MySQL ejecutando el progtwig mysql línea de comandos. A ps aux | grep mysql ps aux | grep mysql muestra que el servidor se está ejecutando y stat /tmp/mysql.sock confirman que el socket existe. Además, si abro un depurador en la cláusula de excepción de esa excepción, puedo conectarme de manera confiable con los mismos parámetros exactos.

Este problema se reproduce de manera bastante confiable, sin embargo, no parece ser del 100%, porque de vez en cuando en una luna azul, mi conjunto de pruebas se ejecuta sin llegar a este error. Cuando intenté correr con sudo dtruss no se reproducía.

Todo el código del cliente está en Python, aunque no puedo entender cómo sería relevante.

Cambiar a usar el host 127.0.0.1 produce el error:

 DatabaseError: Can't connect to MySQL server on '127.0.0.1' (61) 

 sudo /usr/local/mysql/support-files/mysql.server start 

Esto funcionó para mí. Sin embargo, si esto no funciona, asegúrese de que mysqld se está ejecutando e intente conectarse.

La sección correspondiente del manual de MySQL está aquí . Empezaría por seguir los pasos de depuración que se enumeran allí.

Además, recuerde que localhost y 127.0.0.1 no son lo mismo en este contexto:

  • Si el host está configurado como localhost , entonces se usa un socket o una tubería.
  • Si el host está configurado a 127.0.0.1 , entonces el cliente está obligado a usar TCP / IP.

Entonces, por ejemplo, puede verificar si su base de datos está escuchando las conexiones TCP vi netstat -nlp . Parece probable que ESTÁ escuchando conexiones TCP porque dices que mysql -h 127.0.0.1 funciona bien. Para verificar si puede conectarse a su base de datos a través de sockets, use mysql -h localhost .

Si nada de esto ayuda, entonces probablemente deba publicar más detalles sobre su configuración de MySQL, exactamente cómo está instanciando la conexión, etc.

Para mi el problema era que no estaba ejecutando el servidor mysql. Ejecuta el servidor primero y luego ejecuta mysql .

 $ mysql.server start $ mysql -h localhost -u root -p 

He visto que esto sucede en mi tienda cuando mis desarrolladores tienen un administrador de stack como MAMP instalado que viene preconfigurado con MySQL instalado en un lugar no estándar.

en su terminal correr

 mysql_config --socket 

Eso te dará tu ruta al archivo de calcetines. toma ese camino y utilízalo en tu parámetro DATABASES HOST.

Lo que necesitas hacer es apuntar tu

 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test', 'USER': 'test', 'PASSWORD': 'test', 'HOST': '/Applications/MAMP/tmp/mysql/mysql.sock', 'PORT': '', }, } 

NOTA

ejecute también which mysql_config si, de alguna manera, tiene varias instancias de servidor mysql instaladas en la máquina, es posible que se esté conectando a la incorrecta.

Acabo de cambiar el HOST de localhost a 127.0.0.1 y funciona bien:

 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'db_name', 'USER': 'username', 'PASSWORD': 'password', 'HOST': '127.0.0.1', 'PORT': '', }, 

Cuando, si pierde su demonio mysql en mac OSx pero está presente en otra ruta, por ejemplo, en privado / var, realice el siguiente comando

1)

 ln -s /private/var/mysql/mysql.sock /tmp/mysql.sock 

2) reinicie su conexión a mysql con:

 mysql -u username -p -h host databasename 

funciona tambien para mariadb

Ejecutar el siguiente cmd en la terminal

/ usr / local / mysql / bin / mysqld_safe

introduzca la descripción de la imagen aquí

Luego reinicie la máquina para que tenga efecto. ¡¡Funciona!!

Verifique el número de archivos abiertos para el proceso mysql usando el comando lsof.

Aumenta el límite de archivos abiertos y ejecuta de nuevo.

Este puede ser uno de los siguientes problemas.

  1. Bloqueo mysql incorrecto. solución: tienes que encontrar el zócalo mysql correcto mediante,

mysqladmin -p variables | conector grep

y luego ponerlo en su código de conexión de db:

 pymysql.connect(db='db', user='user', passwd='pwd', unix_socket="/tmp/mysql.sock") 

/tmp/mysql.sock es el devuelto desde grep

2. Solución de puerto mysql incorrecta: debe encontrar el puerto mysql correcto:

 mysqladmin -p variables | grep port 

y luego en su código:

 pymysql.connect(db='db', user='user', passwd='pwd', host='localhost', port=3306) 

3306 es el puerto devuelto desde el grep

Creo que la primera opción resolverá tu problema.

Después de intentar algunas de estas soluciones y no tener éxito, esto es lo que funcionó para mí:

  1. Sistema de reinicio
  2. inicio mysql.server
  3. ¡Éxito!

Creo que vi este mismo comportamiento hace algún tiempo, pero no puedo recordar los detalles.
En nuestro caso, el problema fue el momento en que el ejecutor de pruebas inicializa las conexiones de la base de datos en relación con la primera interacción de base de datos requerida, por ejemplo, mediante la importación de un módulo en settings.py o algunos __init__.py. Trataré de obtener más información, pero esto podría sonar ya para su caso.

Tengo dos conjeturas astutas en este caso

CONJECTURA # 1

Mire la posibilidad de no poder acceder al archivo /tmp/mysql.sock . Cuando configuro las bases de datos MySQL, normalmente dejo el sitio del archivo socket en /var/lib/mysql . Si inicia sesión en mysql como root@localhost , la sesión de su sistema operativo necesita acceso a la carpeta /tmp . Asegúrese de que /tmp tenga los derechos de acceso correctos en el sistema operativo. Además, asegúrese de que el usuario sudo siempre pueda leer el archivo en /tmp .

CONJECTURA # 2

Acceder a mysql a través de 127.0.0.1 puede causar cierta confusión si no está prestando atención. ¿Cómo?

Desde la línea de comandos, si se conecta a MySQL con 127.0.0.1 , es posible que deba especificar el protocolo TCP / IP.

 mysql -uroot -p -h127.0.0.1 --protocol=tcp 

o prueba el nombre DNS

 mysql -uroot -p -hDNSNAME 

Esto root@'127.0.0.1' sesión como root@localhost , pero asegúrese de tener root@'127.0.0.1' definido.

La próxima vez que te conectes a MySQL, ejecuta esto:

 SELECT USER(),CURRENT_USER(); 

¿Qué te da esto?

  • USER () informa cómo intentaste autenticar en MySQL
  • CURRENT_USER () informa cómo se le permitió autenticarse en MySQL

Si estas funciones regresan con los mismos valores, entonces se está conectando y autenticando como se esperaba. Si los valores son diferentes, es posible que deba crear el usuario correspondiente root@127.0.0.1 .

Tenía este mismo problema. Resultó que mysqld había dejado de funcionar (estoy en Mac OSX). Lo reinicié y el error desapareció.

Me di cuenta de que mysqld no se estaba ejecutando en gran medida debido a este enlace: http://dev.mysql.com/doc/refman/5.6/en/can-not-connect-to-server.html

¡Fíjate en el primer consejo!

Si obtiene un error como el siguiente:

 django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)") 

Luego simplemente encuentre la ubicación de su archivo mysqld.sock y agréguela a “HOST”.

Al igual que estoy usando xampp en linux, mi archivo mysqld.sock está en otra ubicación. así que no está funcionando para ‘ /var/run/mysqld/mysqld.sock

 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'asd', 'USER' : 'root', 'PASSWORD' : '', 'HOST' : '/opt/lampp/var/mysql/mysql.sock', 'PORT' : '' } } 

Asegúrese de que su / etc / hosts tenga 127.0.0.1 localhost y que funcione bien

Verifique que su mysql no haya alcanzado el máximo de conexiones o que no esté en algún tipo de ciclo de arranque, como ocurre con frecuencia si la configuración es incorrecta en my.cnf.

Utilizar ps aux | grep mysql para comprobar si el PID está cambiando.

Miró alrededor en línea demasiado tiempo para no contribuir. Después de intentar escribir el indicador de mysql desde la línea de comandos, continuaba recibiendo este mensaje:

ERROR 2002 (HY000): no se puede conectar al servidor MySQL local a través del socket ‘/tmp/mysql.sock’ (2)

Esto se debió al hecho de que mi servidor mysql local ya no se estaba ejecutando. Para reiniciar el servidor, navegué a

 shell> cd /user/local/bin 

donde se encuentra mi mysql.server. Desde aquí, simplemente escriba:

 shell> mysql.server start 

Esto relanzará el servidor mysql local.

Desde allí puede restablecer la contraseña de root si es necesario.

 mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass') -> WHERE User='root'; mysql> FLUSH PRIVILEGES; 

Para aquellos que actualizaron de 5.7 a 8.0 a través de homebrew, este error probablemente se deba a que la actualización no se ha completado. En mi caso, mysql.server start me dio el siguiente error:

¡ERROR! El servidor se cerró sin actualizar el archivo PID

Luego verifiqué el archivo de registro a través de cat /usr/local/var/mysql/YOURS.err | tail -n 50 cat /usr/local/var/mysql/YOURS.err | tail -n 50 , y encontré lo siguiente:

InnoDB: la actualización después de un locking no es compatible.

Si está en el mismo barco, primero instale mysql@5.7 través de homebrew, detenga el servidor y vuelva a iniciar el sistema 8.0.

 brew install mysql@5.7 /usr/local/opt/mysql@5.7/bin/mysql.server start /usr/local/opt/mysql@5.7/bin/mysql.server stop 

Entonces,

 mysql.server start 

Esto haría que tu MySQL (8.0) vuelva a funcionar.

El zócalo se encuentra en / tmp. En el sistema Unix, debido a los modos y propiedades en / tmp, esto podría causar algún problema. Pero, mientras nos digas que PUEDES usar tu conexión mysql normalmente, supongo que no es un problema en tu sistema. Una comprobación primordial debe ser reubicar mysql.sock en un directorio más neutral.

El hecho de que el problema se produzca “al azar” (o no siempre) me permite pensar que podría tratarse de un problema del servidor.

  • ¿Su / tmp está ubicado en un disco estándar o en un assembly exótico (como en la RAM)?

  • ¿Está tu / tmp vacío?

  • ¿ iotop muestra algo incorrecto cuando te encuentras con el problema?

Tuve que eliminar todas las instancias de mysql encontrando primero todos los ID de proceso:

ps aux | grep mysql

Y luego matándolos

kill -9 {pid}

Entonces:

inicio mysql.server

Trabajó para mi.

Configure su conexión de base de datos en el cuadro de diálogo ‘Administrar conexiones de base de datos. Seleccione ‘Estándar (TCP / IP)’ como método de conexión.

Consulte esta página para obtener más detalles http://dev.mysql.com/doc/workbench/en/wb-manage-db-connections.html

De acuerdo con esta otra página , se utiliza un archivo de socket incluso si especifica localhost.

Se utiliza un archivo de socket Unix si no especifica un nombre de host o si especifica el nombre de host especial localhost.

También muestra cómo verificar su servidor ejecutando estos comandos:

Si se está ejecutando un proceso mysqld, puede verificarlo probando los siguientes comandos. El número de puerto o el nombre del archivo de socket Unix pueden ser diferentes en su configuración. host_ip representa la dirección IP de la máquina donde se ejecuta el servidor.

 shell> mysqladmin version shell> mysqladmin variables shell> mysqladmin -h `hostname` version variables shell> mysqladmin -h `hostname` --port=3306 version shell> mysqladmin -h host_ip version shell> mysqladmin --protocol=SOCKET --socket=/tmp/mysql.sock version 

en ubuntu14.04 puedes hacer esto para evitar este problema.

 zack@zack:~/pycodes/python-scraping/chapter5$ **mysqladmin -p variables|grep socket** Enter password: | socket | ***/var/run/mysqld/mysqld.sock*** | zack@zack:~/pycodes/python-scraping/chapter5$***ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock*** zack@zack:~/pycodes/python-scraping/chapter5$ ll /tmp/mysql.sock lrwxrwxrwx 1 zack zack 27 11月 29 13:08 /tmp/mysql.sock -> /var/run/mysqld/mysqld.sock= 

Para mí, estoy seguro de que mysqld está iniciado y que la línea de comandos mysql puede funcionar correctamente. Pero el servidor httpd muestra el problema (no se puede conectar a mysql a través de socket).

Comencé el servicio con mysqld_safe &.

Finalmente, encontré que cuando inicio el servicio mysqld con service mysqld start, hay problemas (problema de permisos de selinux), y cuando soluciono el problema de selinux, y comienzo mysqld con “service mysqld start”, el problema de conexión httpd desaparece. Pero cuando comienzo mysqld con mysqld_safe &, mysqld puede ser trabajado. (El cliente mysql puede funcionar correctamente). Pero todavía hay problemas cuando se conecta con httpd.

Si está relacionado con el zócalo, lee este archivo.

 /etc/mysql/my.cnf 

y ver cuál es la ubicación estándar de socket. Es una línea como:

 socket = /var/run/mysqld/mysqld.sock 

ahora crea un alias para tu shell como:

 alias mysql="mysql --socket=/var/run/mysqld/mysqld.sock" 

De esta manera no necesitas privilegios de root.

Simplemente intenta ejecutar mysqld .

Esto era lo que no me funcionaba en Mac. Si no funciona, intente ir a /usr/local/var/mysql/.err para ver los registros de errores detallados.