【问题标题】:MySQL connection not working: 2002 No such file or directoryMySQL 连接不工作:2002 没有这样的文件或目录
【发布时间】:2010-12-13 04:45:17
【问题描述】:

我正在尝试设置 WordPress。我正在运行 Apache 和 MySQL,并且帐户和数据库都已设置好。我试图建立一个简单的连接:

<?php
    $conn = mysql_connect('localhost', 'USER', 'PASSWORD');
    if(!$conn) {
        echo 'Error: ' . mysql_errno() . ' - ' . mysql_error();
    }
?>

我总是得到这个:

错误:2002 - 没有这样的文件或 目录

它可能在谈论什么文件或目录?

我在 OS X Snow Leopard 上,使用内置的 Apache。我使用 x86_64 dmg 安装了 MySQL。

更新:我发现套接字在 /tmp/mysql.sock,所以在 php.ini 中,我用那个替换了所有出现的错误路径。

【问题讨论】:

  • 如果您使用的是基于 debian 的发行版,请粘贴 /etc/init.d/mysql start 的输出。如果失败,请检查 /etc/my.cnf 文件以获取正确的 mysql 套接字文件路径。
  • 使用“127.0.0.1”代替“localhost”解决了使用 XAMPP 在 OS X 上的相同问题。

标签: php mysql connection


【解决方案1】:

我会检查您的 php.ini 文件并验证 mysql.default_socket 设置是否正确,并验证您的 mysqld 是否正确配置了它可以访问的套接字文件。典型的默认值为“/tmp/mysql.sock”。

【讨论】:

  • 好的,上面写着/var/mysql/mysql.sock,但该路径不存在。
【解决方案2】:

并不是说它对你有多大帮助,但是在 MySQL 的recent versions(甚至是less recent)中,错误代码 2002 表示“Can't connect to local MySQL server through socket [name-of-socket]”,所以这可能会告诉你更多。

【讨论】:

  • 在从源代码安装 MySQL 5.5.38 的 OSX 10.9.x 上,我收到此错误。这个提示是正确的:它是一个套接字问题,即使 mysqli_connect_errno() 和 mysqli_connect_error()) 都在说 2002 file not found 消息。我能够通过编辑我的 /etc/php.ini 并将 mysql.default_socket 和 mysqli.default_socket 设置为正确的套接字值来解决这个问题(因为我的应用程序使用 mysqli 进行连接)
【解决方案3】:

首先,确保 MySQL 正在运行。命令:mysqld启动

如果仍然无法连接,则: 你的 /etc/my.cnf 是什么样的? (或 /etc/msyql/my.cnf)

另外2个帖子是正确的,因为2002是一个socket错误,所以你需要检查你的socket。

关于设置 LAMP 的一个很好的教程是:http://library.linode.com/lamp-guides/centos-5.3/index-print

【讨论】:

  • 安装程序没有放my.cnf文件,但是有一个/usr/local/mysql/mysql-test/include/default_my.cnf,我应该把它作为my.cnf复制到/etc吗?
  • 是的,但您可能会发现您需要稍后对其进行修改。
【解决方案4】:

如果您使用 Linux:mysql.sock 文件的路径错误。这通常是因为您使用的是 (LAMPP) XAMPP 而它不在 /tmp/mysql.sock 中

打开php.ini文件,找到这一行:

mysql.default_socket

然后去做

mysql.default_socket = /path/to/mysql.sock

【讨论】:

  • 如果您不确定,请尝试 /var/lib/mysql/mysql.sock 作为套接字的新路径。
  • 嗯。也许他们的意思是豹或虎。无论如何,请尽情享受 WordPress!
  • 注意如果使用mysqli连接,你可能需要设置mysqli.default_socket = /path/to/mysql.sock
  • 普通 MySQL 安装的默认套接字位置是 /tmp/mysql.sock。
  • "主机名 localhost 有特殊含义。它绑定到使用 Unix 域套接字。无法使用主机名 localhost 打开 TCP/IP 连接,您必须使用 127.0.0.1 代替。” -php.net/manual/en/mysqli.quickstart.connections.php。所以基本上有些东西不能连接到允许localhost工作的Unix域套接字,而TCP/IP正在工作,所以将它更改为TCP/IP地址127.0.0.1就可以了。
【解决方案5】:

我遇到了类似的问题,并且能够通过使用127.0.0.1 而不是localhost 来解决我的mysql。

这可能意味着我的主机设置有问题,但这个快速修复让我现在就去。

【讨论】:

  • 你刚刚为我节省了一些宝贵的时间。
  • 我检查了我的 hosts 文件,发现有一行 code127.0.0.1 localhostcode。这让我很好奇为什么通过 localhost 连接不起作用。如果有人能启发我,我会很高兴。
  • 这是因为 php.ini 中的 mysql.default_socket 错误。运行“php -i | grep mysql.default_socket”
  • 这对我有用,我正在使用通过自制软件安装的带有 mysql 5.7 的 el Capitan。我正在尝试安装 WP,当我将“localhost”更改为“127.0.0.1”时,它能够连接。
  • "主机名 localhost 有特殊含义。它绑定到使用 Unix 域套接字。无法使用主机名 localhost 打开 TCP/IP 连接,您必须使用 127.0.0.1 代替。” -php.net/manual/en/mysqli.quickstart.connections.php。所以基本上有些东西不能连接到允许 localhost 工作的 Unix 域套接字,而 TCP/IP 正在工作,所以将其更改为 TCP/IP 地址 127.0.0.1 将工作。
【解决方案6】:

这适用于 Mac OS X,带有 Apache HTTP 的本机安装MySQL 的自定义安装

答案基于@alec-gorge 的出色响应,但由于我必须在 Google 上进行一些特定更改才能在我的配置中配置它,主要是 Mac OS X 特定的,所以我想我会在这里添加它完整性。

为 Apache HTTP 启用 PHP5 支持

确保在/etc/apache2/httpd.conf 中启用了 PHP5 支持。

使用sudo vi /etc/apache2/httpd.conf(询问时输入密码)编辑文件并取消注释(从开头删除;)行以加载php5_module模块。

LoadModule php5_module libexec/apache2/libphp5.so

使用sudo apachectl start 启动Apache HTTP(或restart,如果它已经启动并且需要重新启动以重新读取配置文件)。

确保/var/log/apache2/error_log 包含一条告诉您php5_module 已启用的行 - 您应该看到PHP/5.3.15(或类似名称)。

[notice] Apache/2.2.22 (Unix) DAV/2 PHP/5.3.15 with Suhosin-Patch configured -- resuming normal operations

查找 Socket 文件名

当 MySQL 启动并运行时(使用./bin/mysqld_safe),应该会在控制台上打印出调试行,告诉您在哪里可以找到日志文件。请注意文件名中的主机名 - 在我的情况下为 localhost - 这可能与您的配置不同。

Logging to 之后的文件很重要。这是 MySQL 记录其工作的地方。

130309 12:17:59 mysqld_safe Logging to '/Users/jacek/apps/mysql/data/localhost.err'.
130309 12:17:59 mysqld_safe Starting mysqld daemon with databases from /Users/jacek/apps/mysql/data

打开localhost.err 文件(同样,您的文件可能名称不同),即tail -1 /Users/jacek/apps/mysql/data/localhost.err 以找出套接字文件的名称 - 它应该是最后一行。

$ tail -1 /Users/jacek/apps/mysql/data/localhost.err
Version: '5.5.27'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server (GPL)

注意socket: 部分 - 这是您应该在php.ini 中使用的套接字文件。

还有另一种方法(有人说是更简单的方法)通过登录 MySQL 并运行来确定套接字文件名的位置:

show variables like '%socket%';

使用 MySQL 支持配置 PHP5 - /etc/php.ini

说到 php.ini...

/etc 目录中有/etc/php.ini.default 文件。将其复制到 /etc/php.ini

sudo cp /etc/php.ini.default /etc/php.ini

打开/etc/php.ini 并查找mysql.default_socket

sudo vi /etc/php.ini

mysql.default_socket 的默认值为/var/mysql/mysql.sock。你应该把它改成你之前记下的值——在我的例子中是/tmp/mysql.sock

替换 /etc/php.ini 文件以反映套接字文件的名称:

mysql.default_socket = /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock

最终验证

重新启动 Apache HTTP。

sudo apachectl restart 

如果没有与 PHP5 相关的错误,请检查日志。没有错误意味着你已经完成了,PHP5 和 MySQL 应该可以正常工作。恭喜!

【讨论】:

  • 这个答案有帮助
  • 这个答案很垃圾。它与所问的问题无关,基本上只是 am(acos)amp 教程,如果把它放在这里,而不是在实际搜索设置放大器堆栈的人的地方,它会更加浪费macos 正在看。关于被问到的问题:这个答案并没有解释为什么会发生错误以及为什么 php 尝试通过套接字而不是主机名进行连接,尽管它被传递给mysql_connect,这是 actual 原始问题的问题,而不是安装软件的一般误解。
  • @ohcibi 我写了 “为了完整起见,我想我会在这里添加它。” 并认为这就足够了(并且有几个人支持喜欢它)。我喜欢你让答案更容易找到的想法,但不知道如何。你能分享你的想法并再次帮助我吗?谢谢!
  • @JacekLaskowski 一般:写一篇博文并评论它的链接,指向已接受/最受好评的回复,其意图与您在此处的相同(“为了完整性而添加它”)。但是在这个线程中,我什至看不到发布该链接的理由。 OP说他使用的是macOS,但这个问题与任何操作系统都没有关系,而是与mySQL解释localhost的方式有关。没有人会通过谷歌搜索来寻求在 macos 上设置 xamp 的帮助。因此,我使用了“废话”这个词。该线程与 macOS 完全无关,仅与 mysql 无关(甚至与 php 无关)。
【解决方案7】:

我也遇到了这个问题,然后我把'localhost'修改为'127.0.0.1',就可以了。

【讨论】:

    【解决方案8】:

    我遇到了类似的问题。
    基本上这里的问题是可能有两个mysql实例正在运行。
    A) 一个在 /etc/init.d 运行
    B) 灯泡安装在 /opt/lamp
    解决方案:
    第 1 步:- 使用命令“find / | grep mysqld”查找所有正在运行的 mysql 实例
    第 2 步:- 使用 service mysql stop 关闭在 /etc/init.d 上运行的服务
    第 3 步:- 使用 /opt/lamp/lamp restart 重启您的 Lamp 服务

    你应该很高兴:)

    【讨论】:

      【解决方案9】:

      就我而言,mysqli_connect 有问题。
      当我想连接时
      mysqli_connect('localhost', 'myuser','mypassword')
      mysqli_connect_error() 返回这个错误“没有这样的文件或目录”

      这对我有用 mysqli_connect('localhost:3306', 'myuser','mypassword')

      【讨论】:

      • 这对我很有效;这是我需要将 Armchair Analysis 的美式足球统计数据包加载到 OS X 本地 Mysql 安装中的更改。谢谢!
      • 很高兴听到这个消息:)
      【解决方案10】:

      在配置文件(数据库连接)中将“localhost”替换为“127.0.0.1”有帮助!

      【讨论】:

      • 但为什么要帮助它?
      • "将 'localhost' 替换为 '127.0.0.1'" 或 127.0.0.1 为实际的 MySQL 服务器地址,即 u55151.mysql.someserver.eu。
      【解决方案11】:

      错误2002表示MySQL无法通过socket文件(如/tmp/mysql.sock)连接到本地数据库服务器。

      要找出你的套接字文件在哪里,运行:

      mysql_config --socket
      

      然后仔细检查您的应用程序是否使用正确的 Unix 套接字文件或改为通过 TCP/IP 端口连接。

      然后仔细检查您的 PHP 是否有正确的 MySQL 套接字设置:

      php -i | grep mysql.default_socket
      

      并确保文件存在

      测试套接字:

      mysql --socket=/var/mysql/mysql.sock
      

      如果 Unix 套接字错误或不存在,您可以对其进行符号链接,例如:

      ln -vs /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock
      

      或更正您的配置文件(例如php.ini)。

      要直接从 PHP 测试PDO 连接,您可以运行:

      php -r "new PDO('mysql:host=localhost;port=3306;charset=utf8;dbname=dbname', 'root', 'root');"
      

      还要检查 Apache 和 CLI(命令行界面)之间的配置,因为配置可能不同。

      可能是服务器正在运行,但您尝试使用不同于服务器正在侦听的 TCP/IP 端口、命名管道或 Unix 套接字文件进行连接。要更正此问题,您需要调用客户端程序(例如指定 --port 选项)以指示正确的端口号,或正确的命名管道或 Unix 套接字文件(例如 --socket 选项)。

      见:Troubleshooting Problems Connecting to MySQL


      其他有助于跟踪问题的实用程序/命令:

      • mysql --socket=$(php -r 'echo ini_get("mysql.default_socket");')
      • netstat -ln | grep mysql
      • php -r "phpinfo();" | grep mysql
      • php -i | grep mysql
      • 在您的xdebug.ini 中使用带有xdebug.show_exception_trace=1 的XDebug
      • 在 OS X 上尝试 sudo dtruss -fn mysqld,在 Linux 上使用 strace 进行调试
      • 检查 Unix 套接字的权限:stat $(mysql_config --socket) 以及是否有足够的可用空间 (df -h)。
      • 重新启动 MySQL。
      • 检查net.core.somaxconn

      【讨论】:

        【解决方案12】:

        Matthias D's answer here 上扩展,我能够使用以下命令在 MySQL 和 MariaDB 上解决这个 2002 错误

        首先获取 MySQL 套接字的实际路径

        netstat -ln | grep -o -m 1 '/.*mysql.sock'
        

        然后获取PHP路径

        php -r 'echo ini_get("mysql.default_socket") . "\n";'
        

        使用这两个命令的输出,将它们链接起来:

        sudo ln -s /actualpath/mysql.sock /phppath/mysql.sock
        

        如果返回 No such file or directory,您只需创建 PHP mysql.sock 的路径,例如,如果您的路径是 /var/mysql/mysql.sock,您将运行:

        sudo mkdir -p /var/mysql
        

        然后再次尝试 sudo ln 命令。

        【讨论】:

          【解决方案13】:

          确保您的本地服务器(MAMP、XAMPP、WAMP 等)正在运行。

          【讨论】:

          • 除此之外,如果您在 MacOS 上使用 MAMP(显然!),如果您在将 Mac 从睡眠中唤醒后立即访问您的网站,也会收到此错误。当然,解决方案是简单地等待并重试。 :-)
          【解决方案14】:

          在 Mac 上,在进行所有艰苦的工作之前,只需检查您在 System Preferences &gt; MySQL 中的设置。自从The MySQL Server Instance is stopped 以来,我经常遇到团队遇到这个问题。

          点击Start MySQL Server按钮,魔法就会发生。

          【讨论】:

            【解决方案15】:

            我在我的服务器中使用 PHP-FPM 或多个 php 版本。就我而言,我更新了 mysqli 值,因为没有 mysql 默认套接字参数:

            mysqli.default_socket
            

            到:

            mysql.default_socket = /path/to/mysql.sock
            

            感谢@Alec Gorge

            【讨论】:

              【解决方案16】:

              我遇到了同样的问题。我的套接字最终在 /tmp/mysql.sock 中找到。然后我将该路径添加到 php.ini。我通过检查 MySQL Workbench 中的“服务器状态”页面找到了那里的套接字。如果您的套接字不在 /tmp/mysql.sock 中,那么 MySQL Workbench 可能会告诉您它在哪里? (当然你使用 MySQL Workbench...)

              【讨论】:

                【解决方案17】:

                我已经使用安装程序安装了 MySQL。实际上,“bin”目录旁边没有数据目录。

                所以,我手动创建了“C:\Program Files\MySQL\MySQL Server 8.0”下的“data”目录。它有效(按照https://dev.mysql.com/doc/mysql-windows-excerpt/5.7/en/resetting-permissions-windows.html 建议的步骤更改root密码。

                【讨论】:

                  【解决方案18】:

                  重新启动 mysql 服务器可能会有所帮助。就我而言,重启服务器节省了很多时间。

                  service mysql restart
                  

                  P.S.- 非 root 用户使用 sudo service mysql restart

                  【讨论】:

                  • 当简单的解决方案真正起作用时真是太棒了。
                  【解决方案19】:

                  启用并启动 mariadb 服务

                  sudo systemctl 启用 mariadb.service

                  sudo systemctl start mariadb.service

                  【讨论】:

                    【解决方案20】:

                    数字海洋 MySql 2002-no-such-file-or-directory

                    添加此文件末尾/etc/mysql/my.cnf

                    [mysqld]
                    innodb_force_recovery = 1
                    

                    重启MySql

                    service mysql restart

                    【讨论】:

                    • 正确的是重启MySQL服务
                    【解决方案21】:

                    可能我回答这个问题迟了,但解决我的问题是安装 mysql-server

                    sudo apt-get install mysql-server
                    

                    花了超过 5 个小时后,我找到了帮助我继续进行的解决方案。 如果最重要的答案对他们没有帮助,我希望这会对他们有所帮助

                    【讨论】:

                      【解决方案22】:

                      首先检查 MySQL 服务器是否正在运行。如果正在运行,则通过命令行登录 MySQL 检查套接字路径。

                      mysql -uUSER -pPASSWORD

                      然后

                      显示像'socket'这样的变量;

                      你会找到 mysql 套接字的路径,你可以在下面的连接字符串中进一步使用它:

                      $conn = mysqli_connect('localhost', 'USER', 'PASSWORD', '路径 套接字文件');

                      如果 MySQL 没有运行。那么请分享您要进一步排除故障的错误日志。

                      【讨论】:

                      • 这并没有解决我的问题,但它引导我找到了解决方案:由于我运行 DBngin,我没有套接字,所以运行 mysql -u... 导致找不到套接字。那时我意识到我需要使用 127.0.0.1 进行连接。
                      猜你喜欢
                      • 2021-08-18
                      • 1970-01-01
                      • 2017-06-12
                      相关资源
                      最近更新 更多