【问题标题】:MySQLdb connection problemsMySQLdb连接问题
【发布时间】:2010-10-20 00:26:25
【问题描述】:

我在使用 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 输入密码: 欢迎使用 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)") >>>

我很困惑... :(

【问题讨论】:

    标签: python mysql connection


    【解决方案1】:

    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 端口的服务器可以pickle。如果host 指定为localhost,则将使用Unix 套接字或管道。

    【讨论】:

    • 是的,这特别棘手:通过“localhost”请求 TCP 连接会触发 unix 套接字错误。
    • 太棒了,这也解决了我的问题!这适用于 XAMPP 和 Big Brother Bot (B3)!
    • 或者,您可以找出您的 MySQL unix 套接字在哪里,并使用 unix_socket=/path/to/mysql.sock 指定它
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • Proto Recv-Q Send-Q 本地地址 外部地址 状态 PID/程序名称 tcp 0 0 0.0.0.0:3300 0.0.0.0:* LISTEN 5361/mysqld
      • 是的,我的错,在上面的示例中,我写了端口 3000。我修复了它.. 奇怪的是,问题仍然存在。呵呵。呃。
      • 更新配置后是否重启过服务器?
      • 我今天早些时候重新启动了.. 但我没有修改服务器,我只是更新了脚本以使用 3300 而不是 3000(这是代码中的错误)。
      • 我刚刚注意到一些奇怪的东西.. [root@baster httpd]# mysql -uroot -p -P666 输入密码:mysql> 显然 mysql 忽略了我的端口号.. :|
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

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

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

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

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

          【讨论】:

          • 这是完全错误的。如果您尝试连接到127.0.0.1,您将通过 TCP/IP 进行连接。如果您尝试连接到localhost,您将通过 unix 套接字进行连接。 MySQL的默认socket通常是/tmp/mysql.sock,但是如果你的socket在别的地方,你必须指定它在哪里使用unix_socket='/path/to/mysql.sock
          • 注意:这也取决于您使用的库。
          【解决方案7】:

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

          【讨论】:

          • 刚试过,它不喜欢None,所以我做了'',现在它抱怨''不是有效的套接字。奇怪,好像它只想通过套接字连接..
          猜你喜欢
          • 2011-09-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-11
          • 2012-12-06
          • 1970-01-01
          • 1970-01-01
          • 2015-09-02
          相关资源
          最近更新 更多