错误:无法通过套接字'/var/run/mysqld/mysqld.sock'(2)连接到本地MySQL服务器--缺少/var/run/mysqld/mysqld.sock。

472

我的问题始于我无法再以root身份登录到mysql。我正试图在没有开启密码的情况下运行mysql,但每次输入命令时都会出问题。

# mysqld_safe --skip-grant-tables &

我从未收到提示。 我试图按照这些恢复密码的说明进行操作。
屏幕看起来就像这样:
root@jj-SFF-PC:/usr/bin# mysqld_safe --skip-grant-tables
120816 11:40:53 mysqld_safe Logging to syslog.
120816 11:40:53 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

我没有收到提示开始输入SQL命令以重置密码。

当我通过按下 CTRL + C 来终止它时,我会收到以下消息:

error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)'

Check that mysqld is running and that the socket: '/var/run/mysqld/mysqld.sock' exists!

如果我重试命令并等待足够长的时间,我会得到以下一系列消息:

root@jj-SFF-PC:/run/mysqld# 120816 13:15:02 mysqld_safe Logging to syslog.
120816 13:15:02 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
120816 13:16:42 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

[1]+  Done                    mysqld_safe --skip-grant-tables
root@jj-SFF-PC:/run/mysqld#

但是,如果我尝试通过以下方式以root身份登录:
# mysql -u root

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

我检查了一下,发现 /var/run/mysqld/mysqld.sock 文件不存在。文件夹是存在的,但是文件不在。
此外,我不知道这是否有帮助,但我运行了 find / -name mysqld 命令,它返回了:
/var/run/mysqld - folder
/usr/sbin/mysqld - file
/run/mysqld - folder

我不知道这是否正常,但是我包含这些信息以便帮助您。

最终我决定卸载并重新安装mysql。

apt-get remove mysql-server
apt-get remove mysql-client
apt-get remove mysql-common
apt-get remove phpmyadmin

在按照上述相同顺序重新安装所有软件包后,在安装phpmyadmin期间,我收到了相同的错误提示:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

所以我尝试再次卸载/重新安装。这一次,在我卸载了软件包之后,我也手动将所有mysql文件和目录重命名为它们各自的位置中的mysql.bad

/var/lib/mysql 
/var/lib/mysql/mysql
/var/log/mysql
/usr/lib/perl5/DBD/mysql
/usr/lib/perl5/auto/DBD/mysql
/usr/lib/mysql
/usr/bin/mysql
/usr/share/mysql
/usr/share/dbconfig-common/internal/mysql
/etc/init.d/mysql
/etc/apparmor.d/abstractions/mysql
/etc/mysql

然后我尝试重新安装mysql-servermysql-client。但是我注意到它没有提示我输入密码。它不应该要求管理员密码吗?


只需重新启动服务器,然后重启mysql服务即可解决。 - bowpunya
2
@Anto 这不是重复的问题。这个缺少了/var/run/mysqld/mysqld.sock文件。你链接的那个问题有这个文件。 - motorbaby
这里和其他任何地方的答案都没有解决我的问题。由于这是一个新项目,我切换到了PostgreSQL,现在它可以正常工作了! :-) - James Bradbury
53个回答

429

尝试使用这个命令,

sudo service mysql start

6
我必须使用 sudo service mysqld start - Gavin Miller
3
开始:作业启动失败 :( - Tibor Szasz
26
如果您还没有安装mysql-server,请执行以下命令:sudo apt-get install mysql-server :) - aimme
24
如果你遇到这个问题,务必先运行这个简单的命令再测试其他东西,它只需要一秒钟时间,如果服务器没有运行,启动后就可以解决问题,这意味着它没有自动启动,这将是需要解决的实际问题。 - Lizardx
2
如果服务启动失败怎么办? - cassepipe
显示剩余4条评论

244

要查找系统上的所有套接字文件,请运行以下命令:

sudo find / -type s

我的Mysql服务器系统中的socket已经打开,位于/var/lib/mysql/mysql.sock

一旦你找到了打开socket的位置,在你的/etc/my.cnf文件中添加或编辑该行,写入socket文件的路径:

socket=/var/lib/mysql/mysql.sock
有时启动命令行可执行文件的系统启动脚本会指定一个标志 --socket=path。这个标志可能会覆盖 my.cnf 的位置,导致在 my.cnf 文件指示应该在哪里找到套接字时,找不到套接字。然后当您尝试运行mysql命令行客户端时,它将读取my.cnf以查找套接字,但由于它与服务器创建的套接字偏离,因此它将无法找到它。所以,除非您关心套接字所在的位置,否则只需更改my.cnf以匹配即可解决问题。
然后,停止mysqld进程。如何停止这将因系统而异。
如果您是linux系统中的超级用户,并且不知道Mysql设置使用哪种特定方法,请尝试以下其中之一: service mysqld stop /etc/init.d/mysqld stop mysqladmin -u root -p shutdown 有些系统没有为停止mysql提供优雅的方式(或由于某种原因mysql没有响应),您可以使用以下方法强制终止mysql:
1. 一步: pkill -9 mysqld 2. 两步骤(最不喜欢): - 使用pgrep mysqlps aux | grep mysql | grep -v grep查找mysql的进程ID。 - 假设进程ID为4969,请使用kill -9 4969终止它。
在这样做之后,您可能需要在/var/run/mysqld/中查找pid文件并将其删除。
确保套接字的权限使得mysqld正在运行的任何用户都可以读取/写入它。一个简单的测试是将其打开以进行完全读写,并查看是否仍然有效:
chmod 777 /var/run/mysqld/mysqld.sock

如果那样修复了问题,您可以根据您的安全设置自定义套接字的权限和所有权。

此外,套接字所在的目录必须可被运行mysqld进程的用户访问。


20
请不要建议使用kill -9命令;在采取此步骤之前,应该尝试其他几种方法。 - Ignacio Vazquez-Abrams
2
请在终端运行命令:@dot run ps -aux | grep mysqld,查看是否有其他MySQL进程在运行。 - Ray
尽管mysql服务正在运行,但是搜索socket(“sudo find / -type s”)没有返回mysql socket。我停止了mysql服务并在安全模式下启动它'sudo mysqld_safe'...现在socket搜索(“sudo find / -type s”)返回了mysql socket。 - latvian
如果您不想(或无法)编辑/etc/my.cnf,则socket =指令也可以写入您的本地目录~/.my.cnf - Paul Rougieux
当你遇到"[ERROR] Found option without preceding group in config file"错误时,请确保my.cnf文件中的socket行位于组标题[mysqld]下方。 - James Bradbury
显示剩余9条评论

209

这个错误是由于安装了多个mysql引起的。 运行以下命令:

ps -A|grep mysql

使用以下命令结束进程:

sudo pkill mysql

然后运行命令:

ps -A|grep mysqld

也可以通过运行以下命令来杀死该进程:

sudo pkill mysqld

现在,您已经完全设置好了,只需运行以下命令:

service mysql restart
mysql -u root -p

重新使MySQL正常运行

7
在在网上搜寻了将近4个多小时后,这种方法终于奏效了。应该是最佳答案👍。 - Shivam Gaur
11
mysql.service的工作因为控制进程以错误代码退出而失败。请使用"systemctl status mysql.service"和"journalctl -xe"命令查看详细信息。 - John Joe
3
mysql.service 的作业失败,因为控制进程退出时出现错误代码。有关详细信息,请参见“systemctl status mysql.service”和“journalctl -xe”。 - Adib Aroui
2
mysql.service 的工作失败,因为控制进程以错误代码退出。有关详细信息,请参见“systemctl status mysql.service”和“journalctl -xe”。 - Imad Oulhou
简短、易懂、准确。是最佳答案。谢谢! - araujophillips
显示剩余4条评论

45

解决方案非常简单。

  1. 首先,您需要在终端中使用命令“sudo find / -type s”查找mysql.sock文件所在位置。在我的情况下,它位于/opt/lampp/var/mysql/mysql.sock
  2. 打开终端并输入以下命令:sudo Nautilus
    这将以超级用户权限启动文件管理器。
  3. 从Nautilus导航到mysql.sock文件所在的位置。
  4. 右键单击该文件并选择创建链接
  5. 将链接文件重命名为mysqld.sock,然后右键单击该文件并将其剪切.
  6. 转到/var/run并创建一个名为mysqld的文件夹并进入其中。
  7. 现在右键单击并粘贴链接文件。
  8. 大功告成!现在您将在/var/run/mysqld/mysqld.sock上拥有mysqld.sock文件 :)

6
如何找到 mysql.sock 文件?我尝试了 find / -name 'mysql.sock',但是没有返回结果。 如何查找 mysql.sock 文件?我执行了 find / -name 'mysql.sock' 命令,但是没有找到任何结果。 - Matthew Lock
2
@MatthewLock 首先,请确保 mysql 正在运行(使用“ps aux | grep mysql”命令),否则,mysql.sock 文件将不会出现。其次,使用“sudo find / -type s”命令,在系统上查找所有套接字以定位 mysql.sock 文件。 - narengi
52
如果 sudo find / -type s 命令的输出结果中没有包含任何 mysql.sock,那会怎样? - jeff
1
它能够工作。但我不知道为什么这些开发人员在过去的几年里从未完成这项工作? - Yi Jiang
3
如果使用“find / -type s”命令查找mysql.sock的位置很麻烦,可以尝试使用“mysql_config --socket”命令。您可以使用sudo apt-get install libmysqlclient-dev命令进行安装。 - alexche8
显示剩余2条评论

33

安装完毕后只需启动MySQL服务:

对于Ubuntu系统:

sudo service mysql start;

对于 CentOS 或 RHEL:

sudo service mysqld start;

请先通过以下命令检查MySQL服务状态:sudo systemctl status mysql.service,如果服务未启动,请使用以下命令启动MySQL服务:sudo systemctl start mysql.service。这对我有效。 - Byeongin Yoon

20

在Ubuntu上使用MySQL 5.6和5.7会出现一个bug,即每当MySQL服务停止或重新启动时,var/run/mysqld/都会消失。这会导致MySQL无法运行。找到了一个解决方法,虽然不完美,但至少可以在停止/重启后使其运行:

mkdir /var/run/mysqld/
chown mysqld /var/run/mysqld/

谢谢 - 这个对我有所帮助,我每次重启mysql服务都需要重新创建目录并重置所有权。然而,我并没有在官方任何地方找到报错信息,否则我就会在这里分享链接 :) - djoe
1
尚未尝试过,但也许可以帮到您:创建一个新文件/etc/tmpfiles.d/mysql.conf:`# systemd tmpfile settings for mysql

See tmpfiles.d(5) for details`

然后, d /var/run/mysqld 0755 mysql mysql -重启后,MySQL 应该正常启动。这是来自 https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1435823 的第三条评论。如果您在 MySQL 5.7 中遇到此问题,请在 Launchpad 上发表评论。越多的用户解决问题,它就会得到更多的关注。
- motorbaby
1
对我有用...不过必须使用mysql作为用户名,而不是mysqld。 - Evan Parsons
根据motorbaby的评论,在Centos 7操作系统上使用“mysql Ver 15.1 Distrib 10.3.11-MariaDB”,将一行添加到“/etc/tmpfiles.d/mysql.conf”中解决了我的问题。 - turrican_34
这对我解决了问题。 - shikata

19

请确保您无法访问的套接字文件路径与“/var/run/mysqld/mysqld.sock”相同,否则请将路径更改为您自己的路径。 停止mysqld

$ sudo /etc/init.d/mysqld stop

如果该进程仍在运行;

$ sudo pkill -9 mysqld

删除MySQL目录以便创建套接字。对我来说,它不允许我删除,所以我不得不强制删除。

$ sudo mkdir -p /var/run/mysqld

将所有权设置为该目录

$ sudo chown mysql:mysql /var/run/mysqld

启动mysql

$ sudo /etc/init.d/mysql start

尝试连接mysql

$ sudo mysql -u dbuser -p

是的,这就是我在2019年2月14日11:56给出的相同答案(请参见下文)。 - Ingo
你是救命稻草。 - Sahib Khan

17

好的,只需复制并粘贴以下代码:这应该在终端中完成,在服务器内部,当您的mysql数据库未正确安装且出现以下错误时使用:'无法通过套接字'/var/run/mysqld/mysqld.sock' (2)'。

停止MySql

sudo /etc/init.d/mysqld stop

重新启动或启动它。
sudo /etc/init.d/mysqld restart or sudo /etc/init.d/mysqld start

创建一个类似这样的链接并将其提供给系统。
ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock

运行安全的安装程序,该程序将指导您完成配置mysql所需的所有步骤。
/usr/bin/mysql_secure_installation

当我尝试运行以上命令时,我会收到相同的“无法连接”错误。 - cjmling
我发现了一些有关Ubuntu的问题。如果你使用 /etc/init.d/mysqld start 启动mysqld,你将会遇到这个问题。相反,使用 service mysql start 就可以解决这个问题。虽然很令人恼火,但最终我还是找到了解决方法。 - Adam Short

15

我曾经遇到过同样的错误,并发现这是由于程序包升级导致的。因此,在重启我的系统后,我解决了这个错误。

我认为这可能是由于 SQL 库/程序包更新造成的错误。如果你也在进行一些升级操作,请尝试这种方法 :)


1
我在重新安装(或升级)后做了这个,现在它可以工作了。不再有套接字消息了。谢谢! - wraithie

10

为什么会出现这个错误

我收到了新的mysql库更新,所以我更新了我的Kubuntu操作系统,之后遇到了这些错误。


我尝试过的命令和如何解决它。

MySql-server正在正确运行,但当我尝试连接时却出现了这个错误。

Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'.

我检查了/var/run/mysqld/mysqld.sock目录。

我的文件不存在。

我还尝试过这些命令进行连接,但对我没有起作用。

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

 sudo service mysql start

浪费了大约2个小时后,我找到了解决方案

sudo apt-get clean
sudo apt-get update
sudo apt-get upgrade -f

之后我的问题都得到了解决。


这帮助我解决了问题。我不明白它与我遇到的套接字问题有什么关系... - Čamo
我遇到了相同的错误并按照相同的步骤来解决上述问题,但仍然遇到了错误:Job for mysql.service failed because the control process exited with error code. 请查看 "systemctl status mysql.service" 和 "journalctl -xeu mysql.service" 获取详细信息。 我正在使用最新版本的Ubuntu 22.04。 - Rahul Gupta
我希望人们停止要求别人升级他们的操作系统。 - Owl

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