Tengo problemas con el módulo MySQLdb.

db = MySQLdb.connect(
    host = 'localhost', 
    user = 'root', 
    passwd = '', 
    db = 'testdb', 
    port = 3000)

(Estoy usando un puerto personalizado)

El error que obtengo es:

Error 2002: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

Lo que no tiene mucho sentido ya que esa es la conexión predeterminada establecida en my.conf ... es como si ignorara la información de conexión que doy ...

El servidor mysql definitivamente está ahí:

[root@baster ~]# mysql -uroot -p -P3000
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 5.0.77 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use testdb;
Database changed
mysql> 

Intenté directamente desde el indicador de Python:

>>> db = MySQLdb.connect(user='root', passwd='', port=3000, host='localhost', db='pyneoform')
Traceback (most recent call last):
File "", line 1, in 
File "/usr/lib64/python2.5/site-packages/MySQLdb/__init__.py", line 74, in Connect
return Connection(*args, **kwargs)
File "/usr/lib64/python2.5/site-packages/MySQLdb/connections.py", line 169, in __init__
super(Connection, self).__init__(*args, **kwargs2)
_mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)")
>>>

Estoy confundida ... :(

15
Ian 17 abr. 2009 a las 06:55

7 respuestas

La mejor respuesta

Asegúrese de que el servidor mysql esté escuchando conexiones tcp, lo que puede hacer con netstat -nlp (en * nix). Este es el tipo de conexión que está intentando hacer, y los db normalmente no escuchan en la red de manera predeterminada por razones de seguridad. Además, intente especificar --host = localhost cuando use el comando mysql, también intente conectarse a través de sockets unix a menos que especifique lo contrario. Si mysql no está no configurado para escuchar conexiones tcp, el comando también fallará.

Aquí hay una sección relevante de mysql 5.1 manual en tomas Unix y conexiones de solución de problemas. Tenga en cuenta que el error descrito (2002) es el mismo que está recibiendo.

Alternativamente, verifique si el módulo que está utilizando tiene una opción para conectarse a través de sockets unix (como sugiere David).

3
Dana the Sane 17 abr. 2009 a las 03:24

¿Quizás intente agregar el parámetro de palabra clave unix_socket = None a connect()?

-2
David Z 17 abr. 2009 a las 03:07

Tuve este problema donde el archivo de socket de Unix estaba en otro lugar, python estaba tratando de conectarse a un socket no existente. Una vez que esto se corrigió utilizando la opción unix_socket, funcionó.

3
Jens 17 dic. 2012 a las 14:08

Mysql usa sockets cuando el host es 'localhost' y tcp / ip cuando el host es cualquier otra cosa. De forma predeterminada, Mysql escuchará ambos: puede deshabilitar los sockets o las redes en su archivo my.cnf (consulte mysql.com para obtener más detalles).

En su caso, olvide el puerto = 3000, el cliente mysql lib no le está prestando atención, ya que está utilizando localhost y especifique el socket como en unix_socket = 'path_to_socket'.

Si decidió mover este script a otra máquina, necesitará cambiar esta cadena de conexión para usar el nombre de host o la dirección IP reales y luego puede perder el unix_socket y recuperar el puerto. El puerto predeterminado para mysql es 3306: no necesita especificar ese puerto, pero deberá especificar 3000 si ese es el puerto que está utilizando.

1
Frank Flynn 25 ene. 2011 a las 01:26

Agregue unix_socket='path_to_socket' donde path_to_socket debe ser la ruta del socket MySQL, p. /var/run/mysqld/mysqld2.sock

11
hims056 12 sep. 2012 a las 04:23

Cambiar localhost a 127.0.0.1 resolvió mi problema usando MySQLdb:

db = MySQLdb.connect(
    host = '127.0.0.1', 
    user = 'root', 
    passwd = '', 
    db = 'testdb', 
    port = 3000)

El uso de 127.0.0.1 obliga al cliente a usar TCP / IP, de modo que el servidor que escucha el puerto TCP puede recogerlo. Si host se especifica como localhost, se utilizará un zócalo o tubería Unix.

50
Gilles 'SO- stop being evil' 29 oct. 2012 a las 10:50

Por lo que puedo decir, el conector de Python SOLO puede conectarse a mysql a través de un socket de Internet: no se admiten los sockets de Unix (el valor predeterminado para el cliente de línea de comandos).

En el cliente CLI, cuando dices "-h localhost", en realidad interpreta localhost como "Oh, localhost? Simplemente me conectaré al zócalo Unix", en lugar del zócalo localhost de Internet.

Es decir, el cliente mysql CLI está haciendo algo mágico, y el conector Python está haciendo algo "consistente, pero restrictivo".

Elige tu veneno. (Juego de palabras no previsto;))

-1
Ch'marr 3 sep. 2009 a las 23:19