2009-04-17 25 views
11

Tengo problemas con el módulo MySQLdb.Python: MySQLdb Problemas de conexión

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

(estoy usando un puerto personalizado)

el error que consigo es:

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

Lo cual no tiene mucho sentido ya que es la conexión por defecto en my.conf .. es como si estuviera haciendo caso omiso de la información de conexión doy ..

el servidor MySQL está definitivamente allí:

 
[[email protected] ~]# 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> 

me trataron directamente desde el símbolo del pitón:

 
>>> 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 confundido ... :(

Respuesta

3

Asegúrese de que el servidor mysql esté atento a las 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 forma predeterminada por razones de seguridad. Además, intente especificar --host = localhost cuando use el comando mysql, esto también intente conectarse a través de sockets unix a menos que especifique lo contrario. Si mysql es no configurado para escuchar conexiones tcp, el comando también fallará.

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

Como alternativa, verifique si el módulo que está utilizando tiene una opción para conectarse a través de los zócalos de Unix (como David Suggests).

+0

Proto Recv-Q Dirección local de la dirección externa Dirección de extranjero Nombre del PID/Nombre del programa tcp 0 0 0.0.0.0:3300 0.0.0.0:* ESCUCHAR 5361/mysqld – Ian

+0

Sí , mi mal, en los ejemplos anteriores escribí el puerto 3000. Lo arreglé ... y extrañamente, el problema persiste. heh. ugh. – Ian

+0

¿Ha reiniciado el servidor desde que actualizó la configuración? –

-1

tratan Tal vez añadiendo el parámetro de palabra clave unix_socket = None a connect()?

+0

Acabo de intentarlo, no le gusta ninguno, así que lo hice '' en su lugar y ahora se queja de que '' no es un socket válido. raro, es como si solo quisiera conectarse a través del zócalo ... – Ian

8

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

-1

Por lo que puedo decir, el conector python SOLO se puede conectar a mysql a través de una conexión de internet: los sockets unix (el predeterminado para el cliente de línea de comando) no son compatibles.

En el cliente CLI, cuando dice "-h localhost", realmente interpreta localhost como "Oh, localhost? Simplemente me conectaré al socket Unix en su lugar", en lugar del socket localhost de internet.

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

Elija su veneno. (Pun no previsto;))

+0

Esto es completamente incorrecto. Si intentas conectarte a '127.0.0.1', te conectarás a través de TCP/IP. Si intentas conectarte a 'localhost', te conectarás a través de unix sockets. El socket predeterminado para MySQL suele ser '/ tmp/mysql.sock', pero si su socket está en otro lugar, debe especificar dónde está usando' unix_socket = '/ path/to/mysql.sock' – daviewales

3

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 fue corregido usando la opción unix_socket, funcionó.

1

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 la red en su archivo my.cnf (consulte mysql.com para obtener más información).

En su caso olvídese del puerto = 3000, el cliente mysql lib no le presta atención ya que está utilizando localhost y especifica el socket como en unix_socket = 'path_to_socket'.

Si decidió mover esta secuencia de comandos a otra máquina necesitará cambiar esta cadena de conexión para usar el nombre de host real o la dirección IP 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.

44

Cambio localhost a 127.0.0.1 resuelto mi problema utilizando MySQLdb:

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

Usando 127.0.0.1 obliga al cliente para utilizar TCP/IP, por lo que el servidor escucha el puerto TCP puede conservar en vinagre para arriba. Si host se especifica como localhost, se usará una toma o tubería Unix.

+1

, esto resolvió mi problema también.Gracias. – Vineet

+1

sí, esto es especialmente complicado: una solicitud de una conexión TCP sobre 'localhost' desencadena un error de socket de Unix. – mathieu

+1

increíble, ¡esto resolvió mi problema también! ¡Esto funciona con XAMPP y Big Brother Bot (B3)! – gaborous