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

126

Cuando intenté conectarme a un servidor MySQL local durante mi paquete 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 mysqlprograma de línea de comando . A ps aux | grep mysqlmuestra que el servidor se está ejecutando y stat /tmp/mysql.sockconfirma que el socket existe. Además, si abro un depurador en la exceptcláusula 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 100%, porque de vez en cuando en una luna azul, mi suite de prueba realmente se ejecuta sin detectar este error. Cuando intenté correr con sudo dtrussél no se reprodujo.

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

El cambio para usar el host 127.0.0.1produce el error:

DatabaseError: Can't connect to MySQL server on '127.0.0.1' (61)
Alex Gaynor
fuente
1
¿Es posible que de alguna manera esté golpeando la base de datos con muchas conexiones concurrentes? ¿Quizás intente aumentar max_connectionssu archivo de configuración de MySQL?
dgel
2
hace mysql -h 127.0.0.1el trabajo de la línea de comandos? No estoy tan seguro de que su servidor mysql realmente esté escuchando en un puerto TCP.
Eli
1
¿Está seguro de que tiene las versiones correctas de las bibliotecas de cliente MySQL de Python para su versión de MySQL? Además, ¿ mysql -h localhostfunciona de manera confiable?
Old Pro
2
¿MySQL registra algo en el registro de errores? Además, verifique los permisos de archivo en /tmp/mysql.sock y su directorio de datos mysql. ¿También se producen los errores si ejecuta el conjunto de pruebas como root (sudo)?
Erik Cederstrand
2
Muchas de estas sugerencias están cubiertas por el manual de referencia oficial de MySQL al que hago referencia en mi respuesta a continuación. Es mejor utilizar el tiempo para revisar sistemáticamente las sugerencias del manual de referencia de MySQL, en lugar de probar solo una o dos de esas sugerencias.
jtoberon

Respuestas:

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

Pratyay
fuente
1
He pasado más de 2 semanas (ni siquiera bromeo) y esto es lo más cerca que finalmente puedo conectarme. Sin embargo, está atascado en 'iniciar mysql' ..... Pero gracias, ¡buena publicación!
L. Klotz el
2
sudo: /usr/local/mysql/support-files/mysql.server: comando no encontrado. ¿por qué?
Syam Pillai
1
¿Por qué un colon después de sudo? Compruebe si existe el camino
Pratyay
O, si mysql está instalado con homebrew: sudo /usr/local/Cellar/mysql/<version>/support-files/mysql.server start
Majoren
1
El servidor se cerró sin actualizar el archivo PID (/var/lib/mysql/Saranshs-MacBook-Pro.local.pid).
saran3h
89

La sección relevante del manual de MySQL está aquí . Comenzarí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 en localhost, se usa un socket o una tubería.
  • Si el host está configurado en 127.0.0.1, el cliente se ve obligado a usar TCP / IP.

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

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

jtoberon
fuente
Aunque en general seguir los procedimientos de diagnóstico establecidos es una buena idea, si lee la pregunta (y los procedimientos) verá que se han seguido los procedimientos y ha determinado que esto no es un problema con el servidor MySQL. Esto es algo que tiene que ver específicamente con el cliente Python, ya que todos los demás accesos a través del socket funcionan bien, incluido otro acceso desde Python.
Old Pro
1
Qué extraño voto negativo. Publiqué el procedimiento establecido por varias razones: (1) otras personas publicaban solo una parte del procedimiento establecido y es mejor ser sistemático sobre la depuración, (2) parecía haber cierta confusión sobre localhost vs 127.0.0.1, y (3 ) otras personas con el mismo síntoma "No se puede conectar al servidor mysql local" probablemente tropezarán con esta pregunta. Soy consciente de que es probable que sea el cliente de Python, por lo que solicité más información, por ejemplo, sobre cómo se instancia la conexión.
jtoberon
3
+1 Recibí este error al intentar conectarme a mysql a través de un túnel ssh ( localhostcomo host). Cambiando para 127.0.0.1arreglarlo.
krock
Para el registro, esto solucionó mi problema: "No se puede conectar al servidor MySQL local a través del socket '/tmp/mysql.sock'".
Proinsias
¡Gracias! funcionó para mí esta solución mientras intentaba conectarme a un contenedor docker maridb.
Lucian Oprea
86

Para mí, el problema era que no estaba ejecutando el servidor mysql. Ejecute primero el servidor y luego ejecútelo mysql.

$ mysql.server start
$ mysql -h localhost -u root -p
yask
fuente
28

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

en su terminal

mysql_config --socket

eso le dará su ruta al archivo de calcetines. toma ese camino y úsalo en tu paramater de BASE DE DATOS.

Lo que debe hacer es señalar su

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

NOTA

también se ejecuta which mysql_configsi de alguna manera tiene instancias múltiples de servidor mysql instaladas en la máquina, puede estar conectándose a la incorrecta.

Francis Yaconiello
fuente
¿Qué pasa si falta el archivo de calcetín?
AlxVallejo
comprar otro par? j / k eso significa que el servicio mysql no se está ejecutando. iniciar / reiniciar su mysql
Francis Yaconiello
66
En mi caso, cambiar HOST de "localhost" a "127.0.0.1" resolvió el problema.
lucaswxp
@lucaswxp: En mi caso, tengo que cambiar localhost con nombre de dominio
Anshul Mishra
19

Acabo de cambiar HOSTde localhosta 127.0.0.1y funciona bien:

# settings.py of Django project
...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '',
},
...
Sirbito X
fuente
44
Sería bueno saber qué archivo cambiaste y dónde está ubicado
Empi
1
En settings.pydel proyecto.
Sirbito X
11

Cuando, si pierde su demonio mysql en mac OSx pero está presente en otra ruta por ejemplo en privado / var, haga 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

trabaja también para mariadb

aurny2420289
fuente
9

Ejecute el cmd a continuación en la terminal

/ usr / local / mysql / bin / mysqld_safe

ingrese la descripción de la imagen aquí

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

Prashanth Sams
fuente
1
Esto funcionó para mí en un iMac con High Sierra que se había actualizado a Mojave. Lo que debe haber sucedido fue que el archivo mysql.sock había estado en tmp y eliminado en la actualización. Como el socket se crea automáticamente al iniciar MySQL, solo necesita asegurarse de que MySQL esté apagado y luego iniciarlo en modo seguro, como se indicó anteriormente. El archivo mysql.sock aparece mágicamente.
David
8

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

Aumente el límite de archivos abiertos y vuelva a ejecutar.

Hsen
fuente
También me he encontrado con esto antes, y no podrás hacerlo solo a través de tu archivo .cnf. En realidad, es posible que deba ulimitaumentar la cantidad de archivos abiertos que su cliente y servidor pueden abrir. si tiene una versión reciente de ubuntu, esto puede requerir editar el script de inicio mysql en / etc / init, pero espero que pueda hacerlo en el archivo .cnf.
Underrun
8

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

  1. Reiniciar el sistema
  2. inicio mysql.server
  3. ¡Éxito!
Mark Lohr
fuente
7

Este puede ser uno de los siguientes problemas.

  1. Bloqueo mysql incorrecto. solución: debe encontrar el socket mysql correcto,

mysqladmin -p variables | toma de grep

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

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

/tmp/mysql.sock es el devuelto por grep

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

mysqladmin -p variables | grep port

y luego en tu código:

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

3306 es el puerto devuelto por grep

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

Chamith Malinda
fuente
6

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 completó. En mi caso, mysql.server startme dio el siguiente error:

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

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

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

Si está en el mismo barco, primero instale a [email protected]través de homebrew, detenga el servidor y luego 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

Luego,

mysql.server start

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

Blaszard
fuente
Me sale lo mismo ERROR! The server quit without updating PID fileotra vez.
awebartisan
En mi caso, acabo de instalar [email protected] y eliminé la última. Todo comenzó Ninguna base de datos eliminada.
Andrew Luca
4

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 testrunner inicializa las conexiones de la base de datos en relación con la primera interacción de la base de datos requerida, por ejemplo, mediante la importación de un módulo en settings.py o algún __init__.py. Trataré de obtener más información, pero esto ya puede sonar una campana para su caso.

Martín
fuente
4

Asegúrate de que tu / etc / hosts tenga 127.0.0.1 localhosty debería funcionar bien

hd1
fuente
Sorprendentemente (con respecto) esto lo resolvió para mí: al verificar esto, descubrí que al intentar configurar webdav Mavericks había agregado algunas líneas adicionales (totalmente ilegibles) a mi archivo host, incluida una que reasignó localhost.
rob_was_taken
4

Tengo dos conjeturas furtivas sobre este

CONJECTURA # 1

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

CONJECTURA # 2

Acceder a mysql a través de 127.0.0.1puede 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 evitará iniciar sesión como root@localhost, pero asegúrese de haberlo root@'127.0.0.1'definido.

La próxima vez que se conecte a MySQL, ejecute esto:

SELECT USER(),CURRENT_USER();

¿Qué te da esto?

  • USER () informa cómo intentó autenticarse 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 [email protected].

RolandoMySQLDBA
fuente
3

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, busque la ubicación de su archivo mysqld.sock y agréguelo a "HOST".

Como si estuviera usando xampp en Linux, mi mysqld.sockarchivo está en otra ubicación. entonces 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' : ''
    }
}
Shyam
fuente
2

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

Utilice ps aux | grep mysql para verificar si el PID está cambiando.

beiller
fuente
2

Miré en línea demasiado tiempo para no contribuir. Después de intentar escribir el indicador mysql desde la línea de comandos, seguía 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 estaba ubicado 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;
preynolds
fuente
2

Tuve que matar todas las instancias de mysql al encontrar primero todas las ID de proceso:

ps aux | grep mysql

Y luego matarlos:

matar -9 {pid}

Luego:

inicio mysql.server

Trabajó para mi.

HomerPlata
fuente
1

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, siempre y cuando nos diga que PUEDE usar su conexión mysql normalmente, supongo que no es un problema en su sistema. Una comprobación primaria debe ser la reubicación de mysql.sock en un directorio más neutral.

El hecho de que el problema ocurra "al azar" (o no cada vez) me permite pensar que podría ser un problema del servidor.

  • ¿Está su / tmp ubicado en un disco estándar o en una montura exótica (como en la RAM)?

  • ¿Está / tmp vacío?

  • ¿ iotopLe muestra algo mal cuando encuentra el problema?

Koreth
fuente
0

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
Sólo tu
fuente
0

en ubuntu14.04 puede hacer esto para resolver 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=
ZackZang
fuente
0

Para mí, estoy seguro de que mysqld se inició y 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 del socket).

Inicié el servicio con mysqld_safe &.

Finalmente, descubrí que cuando inicio el servicio mysqld con el servicio mysqld start, hay problemas (problema de permiso de selinux), y cuando soluciono el problema de selinux e inicio mysqld con "service mysqld start", el problema de conexión httpd desaparece. Pero cuando inicio mysqld con mysqld_safe &, mysqld puede funcionar. (El cliente mysql puede funcionar correctamente). Pero todavía hay problemas al conectarse con httpd.

Robin LI
fuente
0

Si está relacionado con el socket, lea este archivo

/etc/mysql/my.cnf

y vea cuál es la ubicación estándar del zócalo. 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 necesita privilegios de root.

MaxV
fuente
0

Simplemente intenta correr mysqld .

Esto era lo que no me funcionaba en Mac. Si no funciona, vaya /usr/local/var/mysql/<your_name>.erra ver registros de errores detallados.

eloone
fuente
0
# shell script ,ignore the first 
$ $(dirname `which mysql`)\/mysql.server start

Puede ser de ayuda.

陈 也在 哦
fuente
Igual que la respuesta más estrella 'sudo /usr/local/mysql/support-files/mysql.server start', pero diferentes sistemas operativos pueden tener una ruta diferente del 'mysql.server'. Así que intenté escribir una línea de comando que podría Ser útil en muchos sistemas operativos.
陈 也在 哦
0

Usando MacOS Mojave 10.14.6 para MySQL 8.0.19 instalado a través de Homebrew

  • Corrió sudo find / -name my.cnf
  • Archivo encontrado en /usr/local/etc/my.cnf

Trabajó por un tiempo y luego finalmente el error regresó. Desinstalé la versión Homebrew de MySQL e instalé el archivo .dmg directamente desde aquí

Felizmente conectando desde entonces.

Paciencia Mpofu
fuente
0

En mi caso, lo que ayudó fue editar el archivo /etc/mysql/mysql.conf.d/mysqld.cnfy reemplazar la línea:

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

con

socket      = /tmp/mysql.sock

Luego reinicié el servidor y funcionó bien. Lo curioso es que si volvía a poner la línea como estaba antes y la reiniciaba, todavía funcionaba ...

jav
fuente
0

Me había enfrentado a un problema similar recientemente. Pasé por muchas respuestas. Lo conseguí trabajando siguiendo los pasos.

  1. cambie la ruta del socket en /etc/my.cnf (ya que repetidamente recibí un error con /tmp/mysql.sock) referencia para cambiar la ruta del socket
  2. ejecute mysqld_safe para reiniciar el servidor, ya que es la forma recomendada de reiniciar en caso de errores. referencia a mysqld_safe
Arjun KR
fuente
0

Para mí, el servidor mysql no se estaba ejecutando. Entonces, comencé el servidor mysql a través de

mysql.server start

luego

mysql_secure_installation

para asegurar el servidor y ahora puedo visitar el servidor MySQL a través de

sudo mysql -uroot -p

sh6210
fuente