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”解决了在 OS X 上使用 XAMPP 的相同问题。
相关:I've got `PDOException: SQLSTATE(2002) No such file or directory
【参考方案1】:
我遇到了类似的问题,并且能够通过使用127.0.0.1
而不是localhost
来解决我的mysql。
这可能意味着我的主机设置有问题,但这个快速修复让我现在就去。
【讨论】:
你刚刚为我节省了一些宝贵的时间。 我检查了我的 hosts 文件,发现有一行code
127.0.0.1 localhostcode
。这让我很好奇为什么通过 localhost 连接不起作用。如果有人能启发我,我会很高兴。
这是因为php.ini中的mysql.default_socket错误。运行“php -i | grep mysql.default_socket”
这对我有用,我在 el Capitan 上,通过自制软件安装了 mysql 5.7。我正在尝试安装 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
将工作。【参考方案2】:
如果您使用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
就可以了。【参考方案3】:
这适用于 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 无关)。【参考方案4】:
重新启动 mysql 服务器可能会有所帮助。就我而言,重启服务器节省了很多时间。
service mysql restart
P.S.- 非 root 用户使用 sudo service mysql restart
。
【讨论】:
当简单的解决方案真正起作用时真是太棒了。【参考方案5】:在配置文件(数据库连接)中将“localhost”替换为“127.0.0.1”有帮助!
【讨论】:
但为什么要帮助它? "将 'localhost' 替换为 '127.0.0.1'" 或 127.0.0.1 为实际的 MySQL 服务器地址,即 u55151.mysql.someserver.eu。【参考方案6】:首先,确保 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
吗?
是的,但您可能会发现您需要稍后对其进行修改。【参考方案7】:
在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 命令。
【讨论】:
【参考方案8】:并不是说它对你有多大帮助,但是在 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 进行连接)【参考方案9】:我会检查您的 php.ini 文件并验证 mysql.default_socket 设置是否正确,并验证您的 mysqld 是否正确配置了它可以访问的套接字文件。典型的默认值为“/tmp/mysql.sock”。
【讨论】:
好的,上面写着/var/mysql/mysql.sock
,但该路径不存在。【参考方案10】:
我也遇到了这个问题,然后我把'localhost'修改为'127.0.0.1',就可以了。
【讨论】:
【参考方案11】:就我而言,mysqli_connect 有问题。
当我想连接时 mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error() 返回这个错误“没有这样的文件或目录”
这对我有用
mysqli_connect('localhost:3306', 'myuser','mypassword')
【讨论】:
这对我很有效;这是我需要将 Armchair Analysis 的美式足球统计数据包加载到 OS X 本地 Mysql 安装中的更改。谢谢! 很高兴听到这个消息:)【参考方案12】:错误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
。
【讨论】:
【参考方案13】:确保您的本地服务器(MAMP、XAMPP、WAMP 等)正在运行。
【讨论】:
除此之外,如果您在 MacOS 上使用 MAMP(显然!),如果您在将 Mac 从睡眠中唤醒后立即访问您的网站,也会收到此错误。当然,解决方案是简单地等待并重试。 :-)【参考方案14】:可能我回答这个问题迟了,但解决我的问题是安装 mysql-server
sudo apt-get install mysql-server
花了超过 5 个小时后,我找到了帮助我继续进行的解决方案。 如果最重要的答案对他们没有帮助,我希望这会对他们有所帮助
【讨论】:
【参考方案15】:数字海洋 MySql 2002-no-such-file-or-directory
添加此文件末尾/etc/mysql/my.cnf
[mysqld]
innodb_force_recovery = 1
重启MySql
service mysql restart
【讨论】:
正确的是重启MySQL服务【参考方案16】:首先检查 MySQL 服务器是否正在运行。如果正在运行,则通过命令行登录 MySQL 检查套接字路径。
mysql -uUSER -pPASSWORD
然后
显示像'socket'这样的变量;
你会找到 mysql 套接字的路径,你可以在下面的连接字符串中进一步使用它:
$conn = mysqli_connect('localhost', 'USER', 'PASSWORD', '路径 套接字文件');
如果 MySQL 没有运行。那么请分享您要进一步排除故障的错误日志。
【讨论】:
这并没有解决我的问题,但它引导我找到了解决方案:由于我运行 DBngin,我没有套接字,所以运行mysql -u...
导致找不到套接字。那时我意识到我需要使用 127.0.0.1 进行连接。【参考方案17】:
我遇到了类似的问题。 基本上这里的问题是可能有两个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 服务
你应该很高兴:)
【讨论】:
【参考方案18】:在 Mac 上,在进行所有艰苦的工作之前,只需检查您在 System Preferences > MySQL
中的设置。自从The MySQL Server Instance is stopped
以来,我经常遇到团队遇到这个问题。
点击Start MySQL Server
按钮,魔法就会发生。
【讨论】:
【参考方案19】:我在我的服务器中使用 PHP-FPM 或多个 php 版本。就我而言,我更新了 mysqli 值,因为没有 mysql 默认套接字参数:
mysqli.default_socket
到:
mysql.default_socket = /path/to/mysql.sock
感谢@Alec Gorge
【讨论】:
【参考方案20】:我遇到了同样的问题。我的套接字最终在 /tmp/mysql.sock 中找到。然后我将该路径添加到 php.ini。我通过检查 MySQL Workbench 中的“服务器状态”页面找到了那里的套接字。如果您的套接字不在 /tmp/mysql.sock 中,那么 MySQL Workbench 可能会告诉您它在哪里? (当然你使用 MySQL Workbench...)
【讨论】:
【参考方案21】:我已经使用安装程序安装了 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密码。
【讨论】:
【参考方案22】:启用并启动 mariadb 服务
sudo systemctl 启用 mariadb.service
sudo systemctl start mariadb.service
【讨论】:
以上是关于MySQL 连接不工作:2002 没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章
警告:PDO::__construct(): [2002] 没有这样的文件或目录(试图通过 unix:///tmp/mysql.sock 连接)
警告:mysql_connect(): [2002] 没有这样的文件或目录(试图通过 unix:///tmp/mysql.sock 连接)