Problemas de conexión MySQLdb

Estoy teniendo 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 recibo es:

  Error 2002: No se puede conectar al servidor MySQL local a través del socket '/var/lib/mysql/mysql.sock' (2) 

Lo cual 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
 Introducir la contraseña: 
 Bienvenido al monitor MySQL.  Los comandos terminan con;  o \ g.
 Su ID de conexión de MySQL es 19
 Versión del servidor: 5.0.77 Distribución de la fuente

 Escriba 'ayuda';  o '\ h' para ayuda.  Escriba '\ c' para borrar el búfer.

 mysql> usa testdb;
 Base de datos cambiada
 mysql> 

Probé directamente desde el indicador de python:

 >>> db = MySQLdb.connect (usuario = 'root', passwd = '', puerto = 3000, host = 'localhost', db = 'pyneoform')
 Rastreo (llamadas recientes más última):
 Archivo "", línea 1, en 
 Archivo "/usr/lib64/python2.5/site-packages/MySQLdb/__init__.py", línea 74, en Connect
 Conexión de retorno (* args, ** kwargs)
 Archivo "/usr/lib64/python2.5/site-packages/MySQLdb/connections.py", línea 169, en __init__
 super (Connection, self) .__ init __ (* args, ** kwargs2)
 _mysql_exceptions.OperationalError: (2002, "No se puede conectar al servidor MySQL local a través del socket '/var/lib/mysql/mysql.sock' (2)")
 >>>

Estoy confundido… 🙁

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

Aquí hay una sección relevante del manual mysql 5.1 sobre sockets 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 de Unix (como lo sugiere David).

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 pueda encerrarlo. Si el host se especifica como localhost , se utilizará un socket o tubería Unix.

agregue unix_socket='path_to_socket' donde path_to_socket debería ser la ruta del socket MySQL, por ejemplo, /var/run/mysqld/mysqld2.sock

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

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

En su caso, olvídese del puerto = 3000, la biblioteca del cliente mysql no le está prestando atención ya que está utilizando localhost y especifique el socket como en unix_socket = ‘path_to_socket’.

Si decide mover esta secuencia de comandos a otra máquina, deberá cambiar esta cadena de conexión para usar el nombre de host o la dirección IP reales y luego perder el unix_socket y recuperar el puerto. El puerto predeterminado para mysql es 3306: no es necesario que especifique ese puerto, pero sí deberá especificar 3000 si ese es el puerto que está utilizando.

Por lo que puedo decir, el conector de Python SOLO puede conectarse a mysql a través de una conexión a Internet: las conexiones de Unix (el valor predeterminado para el cliente de línea de comandos) no son compatibles.

En el cliente CLI, cuando dice “-h localhost”, en realidad interpreta a localhost como “Oh, localhost? Simplemente me conectaré al socket Unix”, en lugar de al 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”.

Elige tu veneno. (Pun no destinado;))

Tal vez intente agregar el parámetro de palabra clave unix_socket = None para connect() ?