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

313

当我尝试连接到mysql时,出现以下错误:

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

这个错误有解决方案吗?可能的原因是什么?


我已经在这里回答了,请查看下面的链接:https://dev59.com/8mct5IYBdhLWcg3wkuPE#35577309 - Pratik Patil
刚遇到了这样的问题,重启解决了。不过,我还是不太明白它的原因。 - caot
38个回答

273

您是连接到“localhost”还是“127.0.0.1”? 我注意到当您连接到“localhost”时,会使用套接字连接器,但是当您连接到“127.0.0.1”时,则使用TCP/IP连接器。如果套接字连接器未启用/工作,则可以尝试使用“127.0.0.1”。


32
在那种情况下,你应该检查一下你的MYSQL服务器是否真的在运行。 - Jan Thomä
3
你还可以通过socket参数强制使用socket(在/usr/bin/mysql中为-S),并提供端口号来强制使用TCP/IP(在/usr/bin/mysql中为-P)。 - Kaoru
3
提示给cygwin用户:如果cygwin上的mysql客户端想要连接到本地的WAMP mysql服务器,需要使用-h <非localhost的主机名>参数。不要尝试创建一个mysql.sock文件并在任何my.cnf文件中声明它,这样做是行不通的。 - Fabien Haddadi
一个错误的主机名给了我完全相同的错误。查看我的Docker容器中的/etc/hosts文件,显示了我的MySql主机名为mysql。在我的连接配置中使用相同的主机名解决了这个问题。 - Stephane
1
完美的答案,谢谢!我正在容器中运行mariadb,并使用非标准主机端口映射。即使我在.my.cnf中指定了要使用的端口,客户端仍然尝试使用套接字。将.my.cnf中的主机从localhost更改为127.0.0.1是我需要的解决方法。 - KayCee
显示剩余2条评论

212

确保你的mysql服务正在运行

service mysqld start

接下来,请尝试以下操作之一:

(如果您没有为MySQL设置密码)

mysql -u root

如果您已经设置了密码

mysql -u root -p

8
在较新的Debian版本中,使用命令 service mariadb start 来启动Mariadb,因为参考链接中提到了Debian 9发布了Mariadb的MySQL变体。 - Zahra
4
给那个人一枚奖章。 - Siraj Alam
这对我来说是答案。由于我正在使用mariadb,解决方案是运行以下命令:“sudo systemctl start mariadb”。之后一切都很好。 - mohsen
给 @Zahra 颁发一枚奖章。 - Ahmed C

34

如果您的文件my.cnf(通常位于etc文件夹中)配置正确,则为

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

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

mysqladmin -u root -p status

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

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

这对我解决了问题。


它对我也有效,但是在我升级到最新版本后出现了这个问题,我想知道为什么会发生这种情况? - Ben
sudo chmod -R 777 /var/lib/mysql/ 这个命令解决了我在启动Docker容器MySQL时遇到的问题。 - user3152459
你不应该将mysql数据目录设置为全局可写!/var/lib/mysql 应该设置为750,并将套接字文件移动到另一个目录(例如,在/etc/my.cnf [mysqld]和[client]部分中设置socket=/tmp/mysql.sock)。或者至少将/var/lib/mysql设置为755。 - HomeIsWhereThePcIs
非常感谢您。sudo chmod -R 777 /var/lib/mysql/ 对我很有帮助,我能够节省大量时间和精力。 - hiburn8

24

MySQL 服务器未运行,或其套接字文件的位置错误(请检查 my.cnf 文件)。


我之前遇到了上述问题,问题就在这里。谢谢。 - oshirowanen
5
Homebrew 的安装位置在哪里? - pal4life

24
如果您使用的是最新版本的RHEL操作系统,您可能需要启动mariadb(一个开源的mysql数据库)而不是mysql数据库:
yum remove mysql
yum -y install mariadb-server mariadb
service mariadb start

然后您应该能够以通常的方式访问mysql:

mysql -u root -p

顺便提一下,这也适用于CentOS 8.1。安装完mariadb-servermariadb之后,别忘了运行mysql_secure_installation来清理一些默认的不安全设置。 - Dio Phung

23

很可能 mysql.sock/var/lib/mysql/ 中不存在。

如果你在另一个位置找到了同样的文件,则可以创建符号链接:

例如: 我将其放置在 /data/mysql_datadir/mysql.sock

切换到 mysql 用户并执行以下命令:

su mysql

ln -s /data/mysql_datadir/mysql.sock /var/lib/mysql/mysql.sock

那解决了我的问题。


将mysql.sock重命名为其他名称,然后重新启动mysqld(“service mysqld restart”),然后将其他名称重新命名为mysql.sock对我有用。这是对此答案的轻微变化,所以谢谢。 - Fuzzy Analysis
这个回答可能有助于定位 mysql.sock 文件。 - Aurelio
这些文字指令并没有解决我特定使用情况的问题,但是使用符号链接到 .sock 的概念确实有用! - BuvinJ
符号链接对我来说起作用了 - 我也将MySQL数据目录放在了非标准的路径中。 - Ross

23

只需编辑/etc/my.cnf文件,然后将以下行添加到my.cnf中。

[mysqld]

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

[client]

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

重新启动mysql并再次连接

mysql -u 用户名 -p 密码 数据库名 -h 主机地址;


1
唯一正确的答案。我想知道为什么它没有足够的赞数。 - CentAu

15
在我的情况下,我已经将socket文件从/var/lib/mysql/mysql.sock移动到/tmp/mysql.sock中的另一个位置,这是在/etc/my.cnf中进行的设置。
即使在重新启动mysqld服务之后,当我尝试连接时仍然会看到错误消息。ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) 问题出在客户端配置方式上。运行诊断实际上会显示正确的socket路径,例如ps aux | grep mysqld
正常工作:
mysql -uroot -p -h127.0.0.1
mysql -uroot -p --socket=/tmp/mysql.sock

无法工作:

mysql -uroot -p
mysql -uroot -p -hlocalhost

您可以通过在mysql配置文件的[client]部分下添加相同的socket行来解决此问题。

14

检查您的mysqld服务是否正在运行,如果未运行,请启动该服务。

如果您的问题没有解决,请查找/etc/my.cnf并进行以下修改,其中您看到以socket开头的行。 在执行此更新之前备份该文件。

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

更改为

socket=/opt/lampp/var/mysql/mysql.sock -u root

1
嗨,Sekar,我输入了“find / -name my.cnf”,然后我得到了两个位置。1)/opt/lampp/etc/my.cnf 2)/etc/mysql/my.cnf。那么,该使用哪一个呢? 我在这里提出了问题.. http://stackoverflow.com/questions/32437796/bind-address-not-present-in-my-cnf-file-laravel/ - Nana Partykar

10

MariaDB,是MySQL的一个由社区开发的分支,已经成为许多发行版中MySQL的默认实现。

所以首先你应该开始,

$ sudo systemctl start mariadb

如果这个方法失败了,那么请尝试另一种方式,

$ sudo systemctl start mysqld

然后启动mysql:

$ mysql -u root -p

截至今日,在Fedora中,该软件包称为mariadb,而在Ubuntu中被称为mariadb-server

因此,如果您的系统中尚未安装它,则可能需要安装它。



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