MySQL 连接不工作:2002 没有这样的文件或目录

Posted

技术标签:

【中文标题】MySQL 连接不工作:2002 没有这样的文件或目录【英文标题】:MySQL connection not working: 2002 No such file or directory 【发布时间】: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 上的相同问题。 相关:I've got `PDOException: SQLSTATE(2002) No such file or directory 【参考方案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 进行连接。

以上是关于MySQL 连接不工作:2002 没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 连接不工作:2002 没有这样的文件或目录

MySQL 连接不工作:2002 没有这样的文件或目录

MySQL 连接不工作:2002 没有这样的文件或目录

警告:PDO::__construct(): [2002] 没有这样的文件或目录(试图通过 unix:///tmp/mysql.sock 连接)

警告:mysql_connect(): [2002] 没有这样的文件或目录(试图通过 unix:///tmp/mysql.sock 连接)

Yosemite 上的 MAMP - 连接错误:SQLSTATE[HY000] [2002] 没有这样的文件或目录