python - mac - No se puede conectar al servidor MySQL local a través del socket ''/tmp/mysql.sock
python 3.4 mysql (24)
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, puedo conectarme en todo momento a MySQL ejecutando el programa de línea de comando mysql
. Un ps aux | grep mysql
ps aux | grep mysql
muestra que el servidor se está ejecutando, y stat /tmp/mysql.sock
confirma que el socket existe. Además, si abro un depurador en la cláusula except
de esa excepción, puedo conectarme con los mismos parámetros exactamente.
Este problema se reproduce con bastante fiabilidad, sin embargo, no parece ser el 100%, porque de vez en cuando en una luna azul, mi suite de pruebas se ejecuta, de hecho, sin encontrar este error. Cuando intenté ejecutar con sudo dtruss
, no se reprodujo.
Todo el código del cliente está en Python, aunque no entiendo cómo sería relevante.
El cambio al uso del host 127.0.0.1
produce el error:
DatabaseError: Can''t connect to MySQL server on ''127.0.0.1'' (61)
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'': '''',
},
Asegúrate de que tu / etc / hosts tenga 127.0.0.1 localhost
y que funcione bien
Comprueba que tu mysql no haya alcanzado las conexiones máximas, o que no esté en algún tipo de ciclo de arranque, como ocurre con bastante frecuencia si la configuración es incorrecta en my.cnf.
Use ps aux | grep mysql para verificar si el PID está cambiando.
Configure su conexión de base de datos en el cuadro de diálogo ''Administrar conexiones DB''. Seleccione ''Estándar (TCP / IP)'' como método de conexión.
Consulte esta página para obtener más información 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 en su servidor ejecutando estos comandos:
Si se está ejecutando un proceso mysqld, puede verificarlo con los siguientes comandos. El número de puerto o el nombre del archivo de socket Unix puede ser diferente en su configuración. host_ip representa la dirección IP de la máquina donde se está ejecutando 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
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 con relación a la primera interacción de la base de datos requerida, por ejemplo, mediante la importación de un módulo en settings.py o en algún __init__.py. Trataré de buscar más información, pero esto ya podría sonar para tu caso.
Cuando, si pierdes tu daemon mysql en mac OSx pero está presente en otra ruta, por ejemplo en privado / var haz el siguiente comando
1)
ln -s /private/var/mysql/mysql.sock /tmp/mysql.sock
2) reinicia tu conexión a mysql con:
mysql -u username -p -h host databasename
funciona también para mariadb
Después de intentar algunas de estas soluciones y no tener éxito, esto es lo que funcionó para mí:
- Reiniciar el sistema
- mysql.server start
- ¡Éxito!
Ejecuta el siguiente cmd en la terminal
/ usr / local / mysql / bin / mysqld_safe
Luego reinicie la máquina para que tenga efecto. ¡¡Funciona!!
El socket está ubicado en / tmp. En el sistema Unix, debido a modos y propiedades en / tmp, esto podría causar algún problema. Pero, mientras nos diga que PUEDE usar su conexión de MySQL normalmente, supongo que no es un problema en su sistema. Una comprobación primordial debería ser reubicar mysql.sock en un directorio más neutral.
El hecho de que el problema ocurra "al azar" (o no todo el tiempo) me permite pensar que podría ser un problema del servidor.
¿Tu / tmp está ubicado en un disco estándar, o en una montura exótica (como en la RAM)?
¿Tu / tmp está vacío?
¿
iotop
te muestra algo mal cuando encuentras el problema?
Este puede ser uno de los siguientes problemas.
- Bloqueo de mysql incorrecto solución: tienes que encontrar el socket mysql correcto,
mysqladmin -p variables | zócalo grep
y luego ponerlo 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 de grep
2. Solución de puerto mysql incorrecto: 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.
He visto esto en mi tienda cuando mis desarrolladores tienen instalado un gestor de pila como MAMP que viene preconfigurado con MySQL instalado en un lugar no estándar.
en tu carrera de terminal
mysql_config --socket
eso le dará su camino al archivo de calcetín. toma ese camino y úsalo en tu parámetro HOSPITALES HOST.
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 ejecute which mysql_config
si de alguna manera tiene instaladas varias instancias del servidor mysql en la máquina que puede estar conectando con la incorrecta.
La sección relevante del manual de MySQL está aquí . Comenzaría repasando los pasos de depuración que figuran allí.
Además, recuerde que localhost y 127.0.0.1 no son lo mismo en este contexto:
- Si el host se establece en
localhost
, entonces se usa un socket o pipe. - Si el host se establece en
127.0.0.1
, entonces 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.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 necesite publicar más detalles sobre su configuración de MySQL, exactamente cómo está instanciando la conexión, etc.
Miró en línea demasiado tiempo para no contribuir. Después de tratar de escribir la solicitud de mysql desde la línea de comando, 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 mi mysql.server. Desde aquí, simplemente escribe:
shell> mysql.server start
Esto relanzará el servidor mysql local.
A partir de ahí, 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 mí, el problema era que no estaba ejecutando el servidor mysql. Ejecute el servidor primero y luego ejecute mysql
.
$ mysql.server start
$ mysql -h localhost -u root -p
Para mí, estoy seguro de que mysqld está iniciado y que la línea de comando 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, encontré cuando inicio el servicio mysqld con el servicio mysqld start, hay problemas (problema de permisos selinux), y cuando soluciono el problema de selinux, y comienzo el mysqld con "service mysqld start", desaparece el problema de la conexión httpd. Pero cuando comienzo el 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 socket, lee este archivo
/etc/mysql/my.cnf
y vea cuál es la ubicación de socket estándar. Es una línea como:
socket = /var/run/mysqld/mysqld.sock
ahora crea un alias para tu capa como:
alias mysql="mysql --socket=/var/run/mysqld/mysqld.sock"
De esta manera no necesita privilegios de root.
Simplemente intente ejecutar mysqld
.
Esto era lo que no funcionaba para mí en mac. Si no funciona, intente /usr/local/var/mysql/<your_name>.err
a /usr/local/var/mysql/<your_name>.err
para ver los registros de errores detallados.
Tenía este mismo problema. Resultó que mysqld
había dejado de funcionar (estoy en Mac OSX). Lo reinicié y el error desapareció.
Descubrí que mysqld
no funcionaba en gran parte debido a este enlace: http://dev.mysql.com/doc/refman/5.6/en/can-not-connect-to-server.html
¡Note el primer consejo!
Tengo dos conjeturas furtivas en este caso
CONJECTURA # 1
Observe 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
, su sesión de 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 necesite 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 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 te permitió autenticarte en MySQL
Si estas funciones vuelven con los mismos valores, entonces se está conectando y autenticando como se esperaba. Si los valores son diferentes, puede que necesite crear el usuario correspondiente [email protected]
.
Tuve que eliminar todas las instancias de mysql buscando primero todos los ID de proceso:
ps aux | grep mysql
Y luego matarlos:
matar -9 {pid}
Entonces:
mysql.server start
Trabajó para mi.
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.
en ubuntu14.04 puedes 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=
si recibes 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 solo encuentra la ubicación de tu archivo mysqld.sock y agrégalo a "HOST".
Como si estuviera usando xampp en Linux, mi archivo mysqld.sock
está en otra ubicación. por lo 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'' : ''''
}
}
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.