MySQL连接无法正常工作:2002没有这样的文件或目录


106

我正在尝试设置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。

更新:我发现套接字位于/tmp/mysql.sock,因此在php.ini中,我用该地址替换了所有错误路径。


2
/etc/init.d/mysql start如果您在Debian基本发行版上,请粘贴输出。如果失败,请检查/etc/my.cnf文件以获取正确的mysql套接字文件路径。
sepehr

4
在X上使用XAMPP使用“ 127.0.0.1”代替“本地主机”解决了相同的问题。
朱塞佩·乌索

Answers:


97

如果使用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作为套接字的新路径。
杰伊,

1
嗯 也许他们的意思是豹子或老虎。无论如何,都可以使用WordPress!
Alec Gorge,2009年

3
注意您可能需要如果与连接设置mysqli.default_socket = /path/to/mysql.sock的mysqli
razzed

2
原始MySQL安装的默认套接字位置是/tmp/mysql.sock。
乔纳森·希尔

4
“主机名localhost具有特殊含义。它必须与Unix域套接字一起使用。使用主机名localhost无法打开TCP / IP连接,必须改为使用127.0.0.1。” - php.net/manual/en/mysqli.quickstart.connections.php。因此,从根本上来说,某些无法正常工作的Unix域套接字无法连接,localhost而TCP / IP仍在起作用,因此将其更改为TCP / IP地址127.0.0.1就可以了。
爱德华

154

我有一个类似的问题,并且能够通过使用127.0.0.1代替来解决我的mysql问题来解决localhost

这可能意味着我在主机设置中出现了问题,但是这个快速解决方案使我现在就可以解决。


2
你为我节省了一些宝贵的时间。
uchamp 2013年

2
我检查了主机文件,并找到了code127.0.0.1 localhost所在的行code。这使我好奇为什么无法通过localhost连接。如果有人能启发我,我会很高兴。
奥拉

2
这是因为php.ini中的mysql.default_socket错误。运行“ php -i | grep mysql.default_socket”
乔纳

1
这对我有用,我在通过自制软件安装的带有MySQL 5.7的el Capitan上。我正在尝试进行WP安装,当我将“ localhost”更改为“ 127.0.0.1”时,它就可以连接。
dgig '16

5
“主机名localhost具有特殊含义。它必须与Unix域套接字一起使用。使用主机名localhost无法打开TCP / IP连接,必须改为使用127.0.0.1。” - php.net/manual/en/mysqli.quickstart.connections.php。因此,从根本上来说,某些无法正常工作的Unix域套接字无法连接,localhost而TCP / IP仍在起作用,因此将其更改为TCP / IP地址127.0.0.1就可以了。
爱德华

39

这是针对Mac OS X带有Apache HTTP本机安装MySQL的自定义安装

答案基于@ alec-gorge的出色响应,但是由于我必须在Google上进行一些特定的更改才能在我的配置中对其进行配置(主要是特定于Mac OS X的配置),因此出于完整性考虑,我想在此添加它。

为Apache HTTP启用PHP5支持

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

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

LoadModule php5_module libexec/apache2/libphp5.so

使用sudo apachectl start(或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相关的错误。没有错误意味着您已经完成,并且带有MySQL的PHP​​5应该可以正常工作。恭喜!


此答案
有所

这个答案是废话。它与所问的问题无关,基本上只是am(acos)amp教程,如果很好的话,如果放在这里而不是在实际搜索设置放大器堆栈的地方,它甚至会浪费掉macos在看。关于被问到的问题:这个答案没有解释为什么会发生错误,为什么php会尝试通过套接字而不是主机名进行连接,尽管这是传递给的mysql_connect,这是原始问题的实际问题,不是通用问题。对安装软件的误解。
ohcibi '18年

@ohcibi我写了“为了完整性我想在这里添加它”。并认为这样就足够了(考虑到投票,有些人喜欢它)。我喜欢您使答案更容易找到的想法,但不知道如何解决。您能分享您的想法并再次帮助我吗?谢谢!
Jacek Laskowski

一般而言,@ JacekLaskowski:撰写博客文章,并以您在此的相同意图对指向已接受/最受欢迎的回复的评论进行评论(“为了完整性起见添加”)。但是在这个线程中,我什至没有看到发布该链接的理由。OP说他正在使用macOS,但是这个问题与任何操作系统都没有关系,而与mySQL的解释方式有关localhost。没有人寻求在macOS上设置Xamp的帮助,因此可以通过谷歌搜索来获得帮助。因此,我使用了“废话”一词。该线程与macos无关,而仅与mysql(甚至php)无关。
ohcibi '18

14

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


1
但是为什么应该帮助呢?
Enamul Hassan 2015年

“将'localhost'替换为'127.0.0.1'”或将127.0.0.1替换为实际的MySQL服务器地址,即u55151.mysql.someserver.eu。
user2812532

13

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

service mysql restart

PS- sudo service mysql restart用于非root用户。


2
当简单的解决方案真正起作用时,它真是太好了。
abalter

10

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

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

其他两篇文章是正确的,因为2002是套接字错误,因此您需要检查套接字。

关于设置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

是的,但是您可能会发现需要稍后对其进行修改。
托德·摩西

7

并不是说它对您有很大帮助,但是在MySQL 的最新版本(甚至更低的版本)中,错误代码2002表示“无法通过套接字[socket-name]连接到本地MySQL服务器”,因此这可能告诉您多一点。


1
在从源代码安装MySQL 5.5.38的OSX 10.9.x上,出现此错误。这个技巧是正确的:即使mysqli_connect_errno()和mysqli_connect_error()都在说2002文件找不到消息,它还是一个套接字问题。我可以通过编辑/etc/php.ini并将mysql.default_socket和mysqli.default_socket设置为正确的套接字值来解决此问题(因为我的应用程序使用mysqli进行连接)
Ronnie

7

这里扩展Matthias D的答案,我能够解决此2002错误使用以下命令使用精确路径 MySQL和MariaDB上的:

首先获取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命令。


6

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


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

6

我也遇到了这个问题,然后我将“ localhost”修改为“ 127.0.0.1”,它可以工作。


6

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

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


这对我来说效果很好;这是我需要将Armchair Analysis的美式足球统计数据包加载到OS X本地Mysql安装中的更改。谢谢!
Michael Scott Cuthbert

很高兴听到这个消息:)
masoud2011'9

4

错误2002表示MySQL无法通过套接字文件连接到本地数据库服务器(例如 /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选项)。

请参阅:对连接到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.show_exception_trace=1在您的计算机上使用XDebugxdebug.ini
  • 在OS X上尝试sudo dtruss -fn mysqld,在Linux上使用strace
  • 检查Unix套接字上的权限:stat $(mysql_config --socket)以及是否有足够的可用空间(df -h)。
  • 重新启动MySQL。
  • 检查net.core.somaxconn

3

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


除此之外,如果您在MacOS上使用MAMP(很明显!),如果从睡眠中唤醒Mac后立即访问站点,也会出现此错误。当然,解决方案是简单地等待并重试。:-)
放荡

0

我有一个类似的问题。
基本上,这里的问题是可能有两个mysql实例正在运行。
A)在/etc/init.d中运行一个
B)在/ opt / lamp中安装灯
解决方案:
步骤1:-使用commnad“ find / | grep mysqld”查找所有mysql运行实例
步骤2:-关闭在以下位置运行的服务/etc/init.d使用服务mysql stop
步骤3:-使用/ opt / lamp / lamp restart重新启动Lamp服务

你应该很好:)


0

在Mac上,进行所有艰苦的工作之前,只需检查中的设置即可System Preferences > MySQL。从很多时候开始,我就经历了团队遇到此问题的经历The MySQL Server Instance is stopped

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


0

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

mysqli.default_socket

至 :

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

感谢@Alec Gorge


0

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



0

Digital Ocean MySql 2002没有这样的文件或目录

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

[mysqld]
innodb_force_recovery = 1

重启MySQL

service mysql restart


-1

我在Linux服务器上也遇到了同样的问题。帮助我的是“ sudo reboot ”命令,该命令用于重新引导Linux服务器。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.