16

我在使用 MySQLdb 模块时遇到问题。

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

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

我得到的错误是:

错误 2002:无法通过套接字 '/var/lib/mysql/mysql.sock' 连接到本地 MySQL 服务器 (2)

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

mysql服务器肯定在那里:

[root@baster ~]# mysql -uroot -p -P3000
输入密码:
欢迎使用 MySQL 监视器。命令以 ; 结尾 或\g。
您的 MySQL 连接 ID 是 19
服务器版本:5.0.77 源码分发

输入“帮助”;或 '\h' 寻求帮助。键入 '\c' 以清除缓冲区。

mysql> 使用测试数据库;
数据库已更改
mysql>

我直接从python提示符尝试:

>>> db = MySQLdb.connect(user='root', passwd='', port=3000, host='localhost', db='pyneoform')
回溯(最近一次通话最后):
文件“”,第 1 行,在
Connect 中的文件“/usr/lib64/python2.5/site-packages/MySQLdb/__init__.py”,第 74 行
返回连接(*args,**kwargs)
文件“/usr/lib64/python2.5/site-packages/MySQLdb/connections.py”,第 169 行,在 __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)")
>>>

我很困惑... :(

4

7 回答 7

53

更改localhost127.0.0.1使用以下方法解决了我的问题MySQLdb

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

Using127.0.0.1强制客户端使用 TCP/IP,以便侦听 TCP 端口的服务器可以选择它。如果host指定为localhost,将使用 Unix 套接字或管道。

于 2011-06-26T05:57:38.707 回答
12

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

于 2009-05-07T12:41:01.107 回答
3

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

这是mysql 5.1 手册中有关 unix 套接字和故障排除连接的相关部分。请注意,描述的错误(2002)与您得到的错误相同。

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

于 2009-04-17T03:19:03.913 回答
3

我遇到了这个问题,unix 套接字文件在其他地方,python 试图连接到一个不存在的套接字。一旦使用 unix_socket 选项纠正了这个问题,它就起作用了。

于 2010-07-14T22:58:58.357 回答
2

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

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

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

于 2011-01-25T01:26:52.473 回答
0

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

在 CLI 客户端中,当您说“-h localhost”时,它实际上将 localhost 解释为“哦,localhost?我将只连接到 unix 套接字”,而不是 Internet localhost 套接字。

即,mysql CLI 客户端正在做一些神奇的事情,而 Python 连接器正在做一些“一致但有限制”的事情。

选择你的毒药。(双关语不是故意的;))

于 2009-09-03T23:19:53.017 回答
-2

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

于 2009-04-17T03:07:36.157 回答