我遇到了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)") >>>
我很困惑...... :(
答案 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()
?