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

时间:2009-11-04 21:16:45

标签: php mysql connection

我正在尝试设置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中,我用它替换了所有错误路径。

23 个答案:

答案 0 :(得分:130)

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

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

答案 1 :(得分:89)

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

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

mysql.default_socket

并制作

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

答案 2 :(得分:36)

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

答案基于@ 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应该工作正常。恭喜!

答案 3 :(得分:13)

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

答案 4 :(得分:9)

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

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

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

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

答案 5 :(得分:6)

不是它对你有多大帮助,但在MySQL的recent versions(甚至是less recent)中,错误代码2002意味着“无法通过套接字连接到本地MySQL服务器[name-of- socket]“,这样可能会告诉你更多。

答案 6 :(得分:6)

扩展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 命令。

答案 7 :(得分:6)

在我的情况下我遇到了mysqli_connect的问题。
当我想连接时     mysqli_connect('localhost:3306', 'myuser','mypassword')
 mysqli_connect_error()返回此错误&#34;没有这样的文件或目录&#34;

这对我有用 { static void Main(string[] args) { Console.WriteLine("shanzzzh@gmail.com"); MailAddress to = new MailAddress(Console.ReadLine()); Console.WriteLine("Mail From"); MailAddress from = new MailAddress(Console.ReadLine()); MailMessage mail = new MailMessage(from,to ); Console.WriteLine("Subject"); mail.Subject = Console.ReadLine() Console.WriteLine("Your Message"); mail.Body = Console.ReadLine() SmtpClient smtp = new SmtpClient(); smtp.Host = "pod51014.outlook.com"; smtp.Port = 587 smtp.Credentials = new NetworkCredential( "*********", "******"); smtp.EnableSsl = true; Console.WriteLine("Sending email..."); smtp.Send(mail); } }

答案 8 :(得分:6)

我也遇到了这个问题,然后我将'localhost'修改为'127.0.0.1',它有效。

答案 9 :(得分:6)

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

答案 10 :(得分:5)

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

service mysql restart

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

答案 11 :(得分:3)

错误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套接字文件不同的TCP / IP端口进行连接。要纠正您需要调用客户端程序(例如,指定--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.show_exception_trace=1
  • 中使用带有xdebug.ini的XDebug
  • 在OS X上尝试sudo dtruss -fn mysqld,使用strace
  • 进行Linux调试
  • 检查Unix套接字的权限:stat $(mysql_config --socket)以及是否有足够的可用空间(df -h)。
  • 重新启动MySQL。
  • 检查net.core.somaxconn

答案 12 :(得分:2)

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

答案 13 :(得分:0)

我遇到了类似的问题 基本上这里的问题是可能有两个mysql运行实例 A)一个在/etc/init.d上运行 B)灯泡安装在/ opt / lamp
解决方案:
步骤1: - 使用commnad&#34; find / |查找所有运行mysql的实例grep mysqld&#34;
步骤2: - 使用service mysql stop关闭在/etc/init.d上运行的服务
步骤3: - 使用/ opt / lamp / lamp restart

重新启动Lamp服务

你应该好好去:))

答案 14 :(得分:0)

在Mac上,在完成所有艰苦工作之前,只需在System Preferences > MySQL中检查您的设置即可。通常情况下,自The MySQL Server Instance is stopped Start MySQL Server以来,我经历过团队遇到此问题。

点击a = [1, 2, 3, 4, 5] b = [6, 7, 8, 9, 10] 按钮,就会发生魔术。

答案 15 :(得分:0)

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

mysqli.default_socket

到:

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

感谢@Alec Gorge

答案 16 :(得分:0)

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

答案 17 :(得分:0)

我使用安装程序安装了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 :(得分:0)

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

添加文件/etc/mysql/my.cnf的结尾

[mysqld]
innodb_force_recovery = 1

重新启动MySql

service mysql restart

答案 19 :(得分:0)

也许我来不及回答这个问题,但是解决我问题的是安装mysql-server

sudo apt-get install mysql-server

花费了5多个小时后,我发现此解决方案有助于我继续前进。 我希望这对某人有帮助,如果最重要的答案不能帮助他们

答案 20 :(得分:0)

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

mysql -uUSER -pPASSWORD

然后

显示类似“ socket”的变量;

您将找到mysql套接字的路径,您可以在连接字符串中进一步使用它,如下所示:

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

如果MySQL未运行。然后,请分享您要进一步解决的错误日志。

答案 21 :(得分:-1)

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

答案 22 :(得分:-2)

启用并启动mariadb服务

sudo systemctl启用mariadb.service

sudo systemctl启动mariadb.service

相关问题