MySQL连接无法工作:2002没有这个文件或目录。

126

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

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

我一直收到这个错误信息:

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

它可能指哪个文件或目录呢?

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

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


2
如果您使用的是基于Debian的发行版,请返回“/etc/init.d/mysql start”的输出。如果失败,请检查“/etc/my.cnf”文件以获取正确的MySQL套接字文件路径。 - sepehr
7
在使用XAMPP时,我在OS X上解决了同样的问题,方法是将“localhost”替换为“127.0.0.1”。 - Giuseppe Urso
23个回答

202

我曾经遇到过类似的问题,通过使用 127.0.0.1 而不是 localhost 来解决了它。

这可能意味着我的主机设置有误,但这个快速解决方案现在让我可以继续前进了。


3
你刚刚为我节省了一些宝贵的时间。 - uchamp
3
我检查了我的hosts文件,并发现一行写着code127.0.0.1 localhostcode。这让我很好奇为什么通过localhost连接没有起作用。如果有人能给我解释一下,我会很高兴的。 - ola
3
这是因为php.ini中的mysql.default_socket设置错误。运行“php -i | grep mysql.default_socket”。 - Jonah
2
这对我有用,我在使用homebrew安装了mysql 5.7版本的el Capitan。我尝试安装WP时,将“localhost”更改为“127.0.0.1”后,它成功连接了。 - dmgig
8
“localhost” 这个主机名具有特殊的含义,它与Unix域套接字的使用绑定在一起。无法使用主机名“localhost”打开TCP/IP连接,必须使用“127.0.0.1”代替。简而言之,连接Unix域套接字时出现了问题,而TCP/IP是可用的,将其更改为TCP/IP地址“127.0.0.1”即可解决问题。 - Edward
显示剩余5条评论

106
如果您使用Linux:mysql.sock文件的路径是错误的。这通常是因为您正在使用(LAMPP)XAMPP,并且它不在/tmp/mysql.sock中。
打开php.ini文件并找到此行:
mysql.default_socket

把它变得更好

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

5
如果你不确定的话,可以尝试将新的套接字路径设为/var/lib/mysql/mysql.sock。 - Jay
1
嗯,也许他们指的是Leopard或Tiger。无论如何,享受使用WordPress吧! - Alec Gorge
3
注意:如果使用mysqli连接,您可能需要设置mysqli.default_socket=/path/to/mysql.sock。 - razzed
2
一个默认的 MySQL 安装的套接字位置是 /tmp/mysql.sock。 - Jonathon Hill
6
“localhost”这个主机名有特殊含义,它与使用Unix领域套接字相关联。无法使用主机名“localhost”打开TCP/IP连接,必须改用“127.0.0.1”。因此,基本上是由于连接到允许使用“localhost”的Unix领域套接字出现问题,而TCP/IP协议是工作正常的,所以将其更改为TCP/IP地址“127.0.0.1”即可解决问题。 - Edward
显示剩余7条评论

42

这是针对安装了本地的Apache HTTP和自定义安装的MySQLMac OS X

答案基于@alec-gorge的出色回答,但由于我不得不搜索一些特定的更改以在我的配置中进行配置,大多数是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

查找套接字文件名

当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 应该可以正常工作。恭喜!


这个答案有帮助。 - Vigneshwaran
这个答案很垃圾。它与所问的问题毫无关系,基本上只是一个(macos)amp教程,如果好的话,即使放在这里,也更加浪费了人们实际寻找在macos上设置amp堆栈的地方。关于所问的问题:这个答案没有解释为什么错误发生以及为什么php尝试通过套接字连接而不是主机名传递给mysql_connect,这是原始问题的实际问题,而不是安装软件的普遍误解。 - ohcibi
@ohcibi,我写了“为了完整起见,我想把它加在这里。”并认为这已经足够了(而且由于一些人的赞同,他们喜欢它)。我喜欢你让答案更易于找到的想法,但不知道该怎么做。你能分享一下你的想法并再次帮助我吗?谢谢! - Jacek Laskowski
@JacekLaskowski 一般来说:编写一篇博客文章,并在接受/最受欢迎的回复中评论一个链接,以达到您在此处的意图(“为完整起见添加它”)。但是,在这个帖子中,我甚至没有看到发布该链接的理由。OP说他正在使用macOS,但这个问题与任何操作系统都没有关系,而是与mysql解释localhost的方式有关。没有人通过谷歌搜索来设置macos上的xamp寻求帮助。因此,我使用了术语“垃圾”。这个帖子与macos没有任何关系,只与mysql有关(甚至不涉及php)。 - ohcibi

18

重新启动mysql服务器可能会有所帮助。 在我的情况下,重新启动服务器节省了很多时间。

service mysql restart

附注:对于非root用户,请使用sudo service mysql restart


2
当简单的解决方案真正奏效时,感觉太棒了。 - abalter

17

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


1
但为什么它应该被帮助呢? - Enamul Hassan
将“localhost”替换为“127.0.0.1”或者将127.0.0.1替换为实际的MySQL服务器地址,例如:u55151.mysql.someserver.eu。 - user2812532

10

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

如果仍然无法连接,请检查您的/etc/my.cnf文件(或/etc/msyql/my.cnf)。

另外两个帖子都是正确的,在2002错误中需要检查您的套接字(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吗? - mk12
是的,但您可能会发现后来需要对其进行一些修改。 - Todd Moses

9

扩展Matthias D在这里的答案,我使用以下命令并使用确切路径解决了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

如果返回“找不到文件或目录”,您只需要创建指向PHP mysql.sock的路径。例如,如果您的路径为“/var/mysql/mysql.sock”,则运行以下命令:
sudo mkdir -p /var/mysql

然后再尝试使用sudo ln命令。

8

虽然这并不能够帮助你太多,但在最近版本(甚至较旧的版本)的MySQL中,错误码2002表示“无法通过套接字[name-of-socket]连接到本地MySQL服务器”,这可能会告诉你更多信息。


1
在安装自源的 MySQL 5.5.38 的 OSX 10.9.x 上,我遇到了这个错误。这个提示是正确的:即使 mysqli_connect_errno() 和 mysqli_connect_error()) 显示出 2002 文件未找到的信息,它是一个 socket 问题。我通过编辑我的 /etc/php.ini 并将 mysql.default_socket 和 mysqli.default_socket 设置为正确的 socket 值来解决了这个问题 (因为我的应用程序使用 mysqli 进行连接)。 - Ronnie

6

在我的情况下,我遇到了mysqli_connect的问题。
当我想要连接时
mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error()返回了这个错误:"No such file or directory"。

对我来说,这个方法有用:
mysqli_connect('localhost:3306', 'myuser','mypassword')


这对我很有效,这是我需要的变化,可以将Armchair Analysis的美式足球统计软件包加载到OS X本地Mysql安装中。谢谢! - Michael Scott Asato Cuthbert
很高兴听到这个好消息 :) - masoud2011

6

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


好的,它说/var/mysql/mysql.sock,但是这个路径不存在。 - mk12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接