无法通过套接字'/var/mysql/mysql.sock'(38)连接到本地MySQL服务器

459

我在连接mysql时遇到了一个大问题。当我运行以下命令时:

/usr/local/mysql/bin/mysql start

我有以下错误:

Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (38)

我在/var/mysql目录下有mysql.sock文件。

/etc/my.cnf中,我有以下配置:

[client]
port=3306
socket=/var/mysql/mysql.sock

[mysqld]
port=3306
socket=/var/mysql/mysql.sock
key_buffer_size=16M
max_allowed_packet=8M

/etc/php.ini中,我有以下内容:

; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
mysql.default_socket = /var/mysql/mysql.sock

我已使用sudo /opt/local/apache2/bin/apachectl restart重新启动了apache。

但我仍然遇到错误。

另外,我不知道是否相关,但当我执行mysql_config --sockets时,会得到以下输出:

--socket         [/tmp/mysql.sock]

67
MySQL 运行了吗? - David
2
这肯定能解释为什么尝试连接它会出错。 正如@Romain提到的那样,MySQL的日志中是否有任何指示(尝试使用/var/log/mysql或附近位置)以说明其未运行的原因? 当您尝试启动它时,是否收到错误消息? - David
6
我也遇到了相同的错误,但我发现是因为磁盘已满,导致mysql无法启动。查看/var/log/mysqld.log会有所帮助。 - yellavon
4
他们询问是否正在运行的原因,我想是因为套接字在服务启动时创建。我安装了MySQL,但从未启动过该服务,因此.sock文件不存在。如果您刚刚安装,请键入“service mysqld start”。希望对您有所帮助。 - changokun
4
以下是shimanyi的答案,sudo service mysql start这个命令帮了我。 - Kiren S
显示剩余9条评论
45个回答

240

如果你的文件 my.cnf(通常在/etc/mysql/文件夹中)已正确配置为:

socket=/var/lib/mysql/mysql.sock

您可以使用以下命令检查MySQL是否正在运行:

mysqladmin -u root -p status

尝试更改mysql文件夹的权限。 如果您正在本地工作,可以尝试:

sudo chmod -R 755 /var/lib/mysql/

那对我来说解决了。


11
在按照上述步骤并重新启动mysqld服务后,它对我很有帮助。 - whirlwin
11
最好将权限设置为755,这样只有目录所有者才能对其进行写操作。 - codewaggle
3
我的问题实际上只是我的 Web 应用的存储容量已经用完了!经典问题! - James T Snell
3
在我的openSUSE 12.3系统中,my.cnf文件位于/etc/目录下。 - user2443147
谢谢,只针对我,这只是一个权限问题。 - Omar Giorgetti
显示剩余5条评论

100

你确定已经安装了MySQL和MySQL服务器吗?

例如,为了安装MySQL服务器,我将使用yum或apt来同时安装MySQL命令行工具和服务器:

yum -y install mysql mysql-server (or apt-get install mysql mysql-server)

启用MySQL服务:

/sbin/chkconfig mysqld on

启动MySQL服务器:

/sbin/service mysqld start

然后设置MySQL的root密码:

mysqladmin -u root password 'new-password' (with the quotes)

我使用了Homebrew,它非常好用:brew install mysql - JaKXz
2
我已经安装了客户端,我需要的命令是 sudo apt-get install mysql-server,然后一切都很好。 - ErichBSchulz
1
输出不是来自客户端吗?它是客户端尝试连接并失败了,对吧?(我认为原始问题需要编辑以澄清这一点)。 - msouth

98
一个我用过且有效的快速解决方法:尝试在mysql_connect()中使用本地IP地址(127.0.0.1)而不是'localhost'。这将“强制”PHP通过TCP / IP连接而不是Unix套接字进行连接。

3
在使用本地主机时,您并没有使用互联网套接字(Internet Socket),而是使用IPC套接字(Inter-Process Communication Socket)。127.0.0.1是本地环回地址,这意味着请求不会离开您的计算机,但它将使用TCP/IP协议,因此速度较慢。 - Master Yogurt
我也可以运行。我使用的是Ubuntu 14.04、HHVM和Nginx。 - Maykonn
1
谢谢。这对我有用,但从答案中我不清楚修复方法是什么。 - Nathan Buesgens
1
好的。它可以工作,但是没有必要使用这个技巧 - 可以通过传递连接的附加参数来简单地强制使用TCP/IP:--protocol=tcp - G. Demecki
1
当通过命令行客户端连接到从VirtualBox或Docker转发的端口时,相同的类似问题是,如果您在不使用主机参数的情况下使用它,则会在套接字上失败;如果您使用带有-H主机参数和127.0.0.1而不是localhost,则会成功,例如使用mysql -h 127.0.0.1而不是mysql -h localhost - FantomX1
显示剩余4条评论

55
我收到了以下错误提示:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)

尝试了几种方法,最终通过以下方式解决:

sudo gksu gedit /etc/mysql/my.cnf

修改时间:

#bind-address       = 127.0.0.1

to:

bind-address        = localhost

并重新启动:

sudo /etc/init.d/mysql restart

它成功了。


我曾经遇到过类似的问题;从以太网(192.168.220.11)切换到WiFi(192.168.220.12),但是bind-address硬编码为以太网IP。将其更改为“localhost”即可解决问题。 - user5734311

38
确保你正在运行mysqld:/etc/init.d/mysql start

5
在Ubuntu上启动或重启MySQL服务,请运行sudo service mysql start|restart命令。 - Wtower

24

当我为我的文件设置cron任务时,遇到了这个错误。我将文件权限更改为777,但对我来说仍然无效。最终,我找到了解决方案。也许它对别人有用。

尝试使用以下命令:

mysql -h 127.0.0.1 -P 3306 -u root -p

记住,-h表示主机名,-P表示端口,-p表示密码。


强制使用TCP/IP连接而不是套接字是低效的(并且需要在服务器上启用本地主机TCP/IP支持,如此前的答案所述)。2011年的被接受的答案更好:配置服务器以便您可以正确使用套接字。 - Quentin
11
“-p”不是指“端口”,而是指“密码”,你把它和“-P”混淆了。 - Quentin
这似乎是之前回答的一个复制,或多或少。链接 - Quentin
对我来说,这只是定义正确的主机的问题:`mysql -h 127.0.0.1 -u root -p` - kghbln
谢谢!我没有.sock文件,但是你帮了我。 - Mahdi-Jafaree

19
为了避免问题发生,您必须通过命令行进行合理的服务器关机,而非直接关闭服务器电源。
shutdown -h now

在关闭计算机之前,这将停止正在运行的服务。

基于Centos,当您遇到此问题时,另一种使其重新启动的方法是移动mysql.sock文件:

mv /var/lib/mysql/mysql.sock /var/lib/mysql/mysql.sock.bak

service mysqld start

重新启动服务将创建一个名为mqsql.sock的新条目。


15

正如这里许多答案所示,启动MySQL服务时可能会出现许多问题导致此错误消息。事实上,如果您只查看适当的日志文件,MySQL通常会准确告诉您出了什么问题。

例如,在Ubuntu上,您应该检查/var/log/syslog文件。由于许多其他内容也可能记录到此文件中,因此您可能需要使用grep来查看mysql消息,并使用tail只查看最近的消息。所有在一起,它可能像这样:

grep mysql /var/log/syslog | tail -50

不要盲目更改配置,因为有人说“这在我的系统上起作用”。找出实际问题所在,您将更快地获得更好的结果。


6
+1 对于退一步并指出其他答案甚至未考虑的事情表示赞赏——实际上看到应用程序可能报告的问题比盲目地匆忙进行更改要好得多,这些更改甚至可能不适用...! - SlySven
啊,原来是使用了错误的“.cnf”文件。这就解释了一切。现在我可以停止尝试随机的方法并解决实际问题了。谢谢。 - Synetech

13

另一种解决方法是编辑 /etc/my.cnf 文件,并在 [client] 部分中包含 host。

 [client]
 #password       = your_password
 host            = 127.0.0.1
 port            = 3306
 socket          = /var/run/mysql/mysql.sock

然后重新启动mysql服务。

这个解决方法已在以下版本进行测试:服务器版本:5.5.25a-log源代码发行版


如果my.cnf文件中还没有[client]部分,则建议添加该部分。 - Cris

10
尝试使用 -h(主机)和 -P(端口)参数: mysql -h 127.0.0.1 -P 3306 -u root -p

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