MySQLdb连接问题

时间:2009-04-17 02:55:57

标签: python mysql connection

我遇到了MySQLdb模块的问题。

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

(我正在使用自定义端口)

我得到的错误是:

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

这没有多大意义,因为这是my.conf中的默认连接设置..就好像它忽略了我给出的连接信息..

mysql服务器绝对存在:

[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> 

我直接从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)")
>>>

我很困惑...... :(

7 个答案:

答案 0 :(得分:49)

localhost更改为127.0.0.1使用MySQLdb解决了我的问题:

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

使用127.0.0.1强制客户端使用TCP / IP,以便侦听TCP端口的服务器可以对其进行补充。如果将host指定为localhost,则将使用Unix套接字或管道。

答案 1 :(得分:10)

添加unix_socket='path_to_socket',其中path_to_socket应该是MySQL套接字的路径,例如/var/run/mysqld/mysqld2.sock

答案 2 :(得分:3)

确保mysql服务器正在侦听tcp连接,您可以使用netstat -nlp(在* nix中)。这是您尝试进行的连接类型,出于安全原因,db通常不会在网络上侦听。另外,在使用mysql命令时尝试指定--host = localhost,除非另行指定,否则还尝试通过unix套接字进行连接。如果mysql 配置为侦听tcp连接,则该命令也将失败。

以下是关于unix套接字和故障排除连接的mysql 5.1 manual的相关部分。请注意,描述的错误(2002)与您获得的错误相同。

或者,检查您使用的模块是否有通过unix套接字连接的选项(如David建议的那样)。

答案 3 :(得分:3)

我有这个问题,其中unix套接字文件是其他地方,python试图连接到不存在的套接字。一旦使用unix_socket选项进行了更正,就可以了。

答案 4 :(得分:1)

当主机是“localhost”时,Mysql使用套接字,而当主机是其他任何东西时,它使用tcp / ip。默认情况下,Mysql会同时监听两者 - 您可以在my.cnf文件中禁用套接字或网络(有关详细信息,请参阅mysql.com)。

在你的情况下忘记port = 3000 mysql客户端lib没有注意它,因为你使用localhost并在unix_socket ='path_to_socket'中指定套接字。

如果您决定将此脚本移动到另一台计算机,则需要更改此连接字符串以使用实际的主机名或IP地址,然后您可以松开unix_socket并将端口恢复。 mysql的默认端口是3306 - 您不需要指定该端口,但如果这是您正在使用的端口,则需要指定3000。

答案 5 :(得分:-1)

据我所知,python连接器只能通过互联网套接字连接到mysql:不支持unix套接字(命令行客户端的默认设置)。

在CLI客户端中,当你说“-h localhost”时,它实际上将localhost解释为“哦,localhost?我只是连接到unix socket”,而不是互联网localhost socket。

也就是说,mysql CLI客户端正在做一些神奇的事情,Python连接器正在做一些“一致但限制性的”。

选择你的毒药。 (双关语无意;))

答案 6 :(得分:-2)

也许尝试将关键字参数unix_socket = None添加到connect()