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

mk1*_*k12 96 php mysql connection

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

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

我总是得到这个:

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

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

我使用的是内置Apache的OS X Snow Leopard.我使用x86_64 dmg安装了MySQL.

更新:我发现套接字位于/tmp/mysql.sock,所以在php.ini中,我用它替换了所有错误路径.

bry*_*edy 140

我有一个类似的问题,并能够通过解决我的mysql 127.0.0.1而不是解决它localhost.

这可能意味着我在主机设置中出了问题,但是这个快速解决方法让我现在就开始了.

  • "主机名localhost具有特殊含义.它必然使用Unix域套接字.使用主机名localhost打开TCP/IP连接是不可能的,你必须使用127.0.0.1." - http://php.net/manual/en/mysqli.quickstart.connections.php.所以基本上没有什么东西不能连接到允许`localhost`工作并且TCP/IP正常工作的Unix域套接字,因此将其更改为TCP/IP地址`127.0.0.1`将起作用. (5认同)
  • 你刚刚为我节省了一些宝贵的时间。 (2认同)
  • 我检查了我的hosts文件,发现了一行`code`127.0.0.1 localhost`code`.这让我很好奇为什么通过localhost连接无法正常工作.如果有人能够启发我,我会很高兴. (2认同)
  • 这是因为php.ini中的mysql.default_socket是错误的.运行"php -i | grep mysql.default_socket" (2认同)
  • 这对我有用,我在 el Capitan 上通过自制程序安装了 mysql 5.7。我正在尝试安装 WP,当我将“localhost”更改为“127.0.0.1”时,它能够连接。 (2认同)

Ale*_*rge 91

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

打开php.ini文件并找到以下行:

mysql.default_socket
Run Code Online (Sandbox Code Playgroud)

并成功

mysql.default_socket = /path/to/mysql.sock
Run Code Online (Sandbox Code Playgroud)

  • 如果您不确定,请尝试将/var/lib/mysql/mysql.sock作为套接字的新路径. (4认同)
  • 注意如果与mysqli连接,你可能需要设置mysqli.default_socket = /path/to/mysql.sock (3认同)
  • "主机名localhost具有特殊含义.它必然使用Unix域套接字.使用主机名localhost打开TCP/IP连接是不可能的,你必须使用127.0.0.1." - http://php.net/manual/en/mysqli.quickstart.connections.php.所以基本上没有什么东西不能连接到允许`localhost`工作并且TCP/IP正常工作的Unix域套接字,因此将其更改为TCP/IP地址`127.0.0.1`将起作用. (3认同)
  • MySQL安装库存的默认套接字位置是/tmp/mysql.sock. (2认同)

Jac*_*ski 37

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

答案基于@ alec-gorge的出色响应,但由于我不得不谷歌一些特定的更改,以便在我的配置中配置它,主要是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
Run Code Online (Sandbox Code Playgroud)

启动Apache HTTP 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
Run Code Online (Sandbox Code Playgroud)

查找套接字文件的名称

当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
Run Code Online (Sandbox Code Playgroud)

打开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)
Run Code Online (Sandbox Code Playgroud)

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

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

show variables like '%socket%';
Run Code Online (Sandbox Code Playgroud)

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

说到php.ini ......

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

sudo cp /etc/php.ini.default /etc/php.ini
Run Code Online (Sandbox Code Playgroud)

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

sudo vi /etc/php.ini
Run Code Online (Sandbox Code Playgroud)

默认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
Run Code Online (Sandbox Code Playgroud)

最终验证

重启Apache HTTP.

sudo apachectl restart 
Run Code Online (Sandbox Code Playgroud)

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


小智 14

在配置文件(db connection)中将'localhost'替换为'127.0.0.1'有帮助!


Tod*_*ses 9

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

如果你仍然无法连接那么:你的/etc/my.cnf是什么样的?

其他2个帖子是正确的,因为你需要检查你的套接字,因为2002是套接字错误.

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


Ava*_*iya 8

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

service mysql restart
Run Code Online (Sandbox Code Playgroud)

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

  • 当简单的解决方案真正起作用时,真是太棒了。 (2认同)

Art*_*uer 7

不,它可以帮助你多,但在最近的版本(甚至更少最近的MySQL),错误代码2002的意思是"无法通过socket [名称的插座]连接到本地MySQL服务器",这样可能会告诉你多一点.


mat*_*l87 7

扩展Matthias D的答案在这里我能够使用这些命令在MySQL和MariaDB上使用确切的路径解决这个2002错误:

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

netstat -ln | grep -o -m 1 '/.*mysql.sock'
Run Code Online (Sandbox Code Playgroud)

然后获取PHP路径:

php -r 'echo ini_get("mysql.default_socket") . "\n";'
Run Code Online (Sandbox Code Playgroud)

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

sudo ln -s /actualpath/mysql.sock /phppath/mysql.sock
Run Code Online (Sandbox Code Playgroud)

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

sudo mkdir -p /var/mysql
Run Code Online (Sandbox Code Playgroud)

然后再次尝试sudo ln命令.


Myl*_*les 6

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


Jac*_*Sun 6

我也遇到了这个问题,然后我将'localhost'修改为'127.0.0.1',它的工作原理.


mas*_*011 6

在我的情况下,我有mysqli_connect的问题.
当我想连接
mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error()时返回此错误"没有这样的文件或目录"

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