首页 文章

MySQLdb连接问题

提问于
浏览
12

我遇到了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 回答

  • -1

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

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

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

  • 9

    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套接字或管道 .

  • 3

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

  • 48

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

  • 1

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

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

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

  • -1

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

  • 3

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

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

    即,mysql CLI客户端正在做一些神奇的事情,并且Python连接器正在做一些“一致但限制性”的事情 .

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

相关问题