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


441

我在Ubuntu 12.04 LTS(精确的穿山甲)上安装了LAMP,然后在phpMyAdmin上设置了root密码。我忘记了密码,现在无法登录。当我尝试通过终端更改密码时,我得到:

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

我怎样才能解决这个问题?我无法打开LAMP,将其卸载或重新安装。


也许重新安装更容易: stackoverflow.com/a/31984482/763744
Zernel 2015年

通过停止MySQL并跳过--grant表以安全模式启动它来重置密码
davejal

在终端“ sudo apt-get install mysql-server”中键入此命令
Humphrey

启动或重启mysql服务并检查。sudo /etc/init.d/mysql start或sudo /etc/init.d/mysql restart
Jitendra Patel

systemctl start mariadb.service
Thewebus

Answers:


253

我曾经遇到过这个问题,并通过安装解决了这个问题mysql-server,因此请确保您已安装mysql-server,而不是mysql-client或其他东西。

该错误意味着该文件/var/run/mysqld/mysqld.sock不存在,如果您未安装mysql-server,则该文件将不存在。因此,在这种情况下,请使用

sudo apt-get install mysql-server

但是,如果mysql-server已经安装并正在运行,则需要检查配置文件。

配置文件为:

/etc/my.cnf
/etc/mysql/my.cnf
/var/lib/mysql/my.cnf

在中/etc/my.cnf,套接字文件config可能是,/tmp/mysql.sock而在/etc/mysql/my.cnf套接字文件config中的可能是/var/run/mysqld/mysqld.sock。因此,删除或重命名/etc/mysql/my.cnf,让mysql使用/etc/my.cnf,即可解决问题。


您可以运行mysql守护程序,并安装mysql-server-core,但是您需要安装mysql-server,它是二进制文件和系统数据库设置!
Cedric

99
sudo apt-get install mysql-server在ubuntu上安装mysql
拖延

9
如果我必须从技术上进行解释,我会说1)如果您正在运行“ mysql -u <用户名> -h <MySQL服务器地址> -p”,则实际上是在运行mysql客户端以访问mysql服务器。如果您在用“ -h”提及的地址/ IP地址上未安装mysql服务器,则会弹出上述错误。这是因为它无法通过套接字mysql.sock连接到MySQL服务器。2)如果已经安装了Mysql-server,则它应该正在运行。否则,您会看到同样的错误。因此,使其在您指定的服务器上运行。
Mayur Nagekar 2014年

1
如果您尝试更改存储数据库的目录,但是将错误的目录输入配置文件中(例如拼写错误),也会发生这种情况。不会告诉您输入错误目录不存在,而是告诉您您没有访问该目录的权限。
迈克尔(Michael)

4
作为第一步,我建议尝试重新启动服务器进程(请参见服务器与客户端之间的其他区别)。尝试sudo /etc/init.d/mysql restart。通常,不需要重新安装。我建议您首先检查日志文件。不仅是mysql的日志文件,还有/ var / log / syslog,因为您可能发生服务器崩溃,导致mysql崩溃。
赖因

212

尝试这个:

mysql -h 127.0.0.1 -P 3306 -u root -p <database>

另外(看看它是否正在运行):

telnet 127.0.0.1 3306 

可能只是my.cnf文件中的配置错误/etc/somewhere(取决于Linux发行版)。


1
我遇到了同样的错误。并且我已经检查了main和my.cnf中的默认绑定已经设置为127.0.0.1。但是,使用上面的命令可以连接我。将不得不继续寻找以了解为什么仅仅执行“ mysql”会给出错误。
cchiera

1
我得到telnet:无法连接到远程主机:telnet命令导致连接被拒绝。但是apache仍然运行,因为我能够打开本地主机
Rishi Dua 2014年

@cchiera您知道,我之前没有这个错误。但是,当我想使用ssh隧道通过iOS应用程序连接到数据库时,出现了2013错误。为了解决这个问题,我必须编辑/etc/my.cnf并注释了#bind-address = 127.0.0.1 Reference 1 Reference 2。然后我可以连接。在此之后,我意识到我现在遇到了这个2002年错误,这使我得到了答案,现在又可以正常工作了。我肯定会通过解释为什么只键入mysql而不-h抛出错误的原因与您达成一致。
Pathros

注意:mysql -h localhost不起作用。确保使用mysql -h 127.0.0.1答案中指定的方式。
vadasambar '19

如果我在此答案中使用命令登录,该如何解决?
卡洛斯·希门尼斯·霍姆奎斯特

128

我看到所有这些问题的答案,但没有提供该选项重置密码没有公认的答案。实际的问题是他忘记了密码,因此他需要重设密码,而不是密码是否正在运行(是否已安装),如大多数答案所示。


重设密码

请执行以下步骤(如果您确实忘记了密码并且可以随时尝试,即使您目前不在这种情况下也可能会有所帮助):

  1. 停止 mysql

    sudo /etc/init.d/mysql stop

    或其他发行版本:

    sudo /etc/init.d/mysqld stop
  2. 以安全模式启动MySQL

    sudo mysqld_safe --skip-grant-tables &
  3. 使用root登录到MySQL

    mysql -uroot
  4. 选择要使用的MySQL数据库

    use mysql;
  5. 重设密码

    -- MySQL version < 5.7
    update user set password=PASSWORD("mynewpassword") where User='root';
    
    -- MySQL 5.7, mysql.user table "password" field -> "authentication_string"
    
    update user set authentication_string=password('mynewpassword') where user='root';
  6. 冲洗特权

    flush privileges;
  7. 重新启动服务器

    quit
  8. 停止并再次启动服务器

    Ubuntu和Debian:

    sudo /etc/init.d/mysql stop
    ...
    sudo /etc/init.d/mysql start

    在CentOS,Fedora和RHEL上:

    sudo /etc/init.d/mysqld stop
    ...
    sudo /etc/init.d/mysqld start
  9. 使用新密码登录

    mysql -u root -p
  10. 输入新密码,然后再次使用服务器,就像什么也没发生

这取自“ 重置MySQL根密码”


更新用户密码对我来说不起作用,但是一旦登录到MySQL监视器并使用了mysql数据库,repair table user use_frm对我来说就可以解决此问题。- stackoverflow.com/questions/4297592/...
克雷格面包车托德

20
在MySQL 5.7中,删除了mysql.user表字段中的password字段,现在该字段名称为'authentication_string',因此(5)应为update user set authentication_string=password('mynewpassword') where user='root';
Daniel

您知道使它成为bash脚本的方法吗?每次重新启动包装盒时,似乎都需要它。
vphilipnyc

某些信息告诉我您需要一种解决方法,但是实际上您应该尝试找出为什么每次都需要这样做并加以解决。至于脚本,请问一个新问题并发布您已经尝试过的内容,也许其他人可以帮忙
davejal

2
这对我来说非常有效,但是我首先必须实现以下解决方案:stackoverflow.com/questions/42153059/…–
安德鲁·福克斯

68

我尝试了以下步骤:

  1. 登录为super user或使用sudo
  2. /etc/mysql/my.cnf使用gedit打开
  3. 查找bind-address,然后将其值更改为数据库服务器主机的IP地址。对我来说,这是localhost127.0.0.1
  4. 保存并关闭文件。
  5. 回到终端并执行 sudo service mysql start

它为我工作。


4
从这,我只是运行sudo服务mysql restart并且它起作用了。
Orane 2015年

在我的情况下,错误是IP改变了,所以我设置绑定地址=本地主机
尼古拉斯·阿里亚斯

@rshahriar在我的/etc/my.cnf文件中没有所谓的bind-address的事,添加字段是个好主意
RCBian

@SilvioDelgado如果您想通过ssh隧道进行连接,则不会。这里的解释
Pathros

重新启动mysql服务也对我
有用

41

我通过执行以下命令解决了此问题:

mysql.server start

如果您使用的是Mac,并且使用brew安装mysql,则只需使用:

brew services start mysql

35

我有一个类似的问题。mysql无法启动:

sudo service mysql start
start: Job failed to start

如果我禁用了apparmor:

sudo aa-complain /etc/apparmor.d/*

问题消失了。问题是mysqld试图访问/run/mysqld/mysqld.sock,但是apparmor配置文件仅授予对/var/run/mysqld/mysqld.sock的权限(/ var / run被符号链接到/ run,因此这些实际上是相同)。不知道为什么mysqld不使用var路径,因为这是所有配置文件中设置的,但是您可以通过将以下内容添加到/etc/apparmor.d/usr.sbin.mysqld中来解决问题

/run/mysqld/mysqld.pid rw,
/run/mysqld/mysqld.sock rw,

我不知道我必须调用“ sudo服务mysql start”。上次我在Ubuntu上安装MySQL时,我认为它会在安装后自动启动。Manjaro上的MariaDB要求在安装后显式启动该服务。
dmiller309

31

以我为例,磁盘已满,并且mysqld无法启动。

尝试重新启动mysql服务。

> service mysql restart

要么

> service mysql stop

> service mysql start

如果无法识别stop命令,则肯定是磁盘空间。您应该在分区中留出一些空间mysql中分配或使磁盘更大。

使用以下命令检查磁盘空间

> df -h

2
我也发生了同样的事情-全盘。清理了一些空间,重新启动后问题就消失了。
达伦(Darren)2014年

2
如果那是您执行的问题:“ /etc/init.d/mysqld start”将告诉您磁盘分区已满
Tickon 2015年

对我来说,磁盘100%。清理空间并开始服务还可以
雨果

28

我通过取消mysql进程解决了这个问题:

ps -ef | grep mysql
kill [the id]

然后,我再次使用以下命令启动服务器:

sudo /etc/init.d/mysql restart

start也可以:

sudo /etc/init.d/mysql start

然后我以 admin完成。


好吧,我实际上是在崩溃之前中止了mysql。然后我得到“ *请查看系统日志。” 和“ ERROR 2002(HY000):无法通过套接字'/var/run/mysqld/mysqld.sock'(111)连接到本地MySQL服务器”。最终,我意识到它正在尝试恢复自身,因此我将其杀死并重新启动。
cwhsu

在少数情况下,“ mysql start”将失败,因此您需要使用“ restart”参数。如果您需要终止守护进程,最好使用“ stop”参数而不是kill命令。但是,killall命令比kill命令(killall mysqld)更方便。
赖因

杀死MySQL进程然后重新启动MySQL对我
有用

21

MySQL服务器进程以某种方式未创建套接字,或者客户端在错误的位置寻找套接字。

我的第一个建议是检查MySQL服务器是否正在运行。第二个建议可能是,MySQL服务器是否在另一台主机上运行?如果是这样,请将-h <hostname>标志添加到终端中的MySQL客户端。

如果MySQL确实正在运行并且在本地运行,请检查您的my.cnf文件。应该有这样一条线

socket = /var/run/mysqld/mysqld.sock

查看是否与您在帖子中提到的套接字位置匹配。

根据经验,我会说最有可能的情况是您的MySQL服务器根本没有运行,或者与从终端运行MySQL客户端的主机不在同一主机上。


19

在必须重新启动生产服务器之后,我刚刚遇到了相同的问题。我在DigitalOcean Droplet上运行Debian 8.1(Jessie)。

这是我为解决问题所做的工作:

  1. 检查文件是否/var/run/mysqld/mysqld.sock存在。如果不是,请通过输入手动创建它touch /var/run/mysqld/mysqld.sock(这是我要做的)。

  2. 因此,MySQL进程可以使用此文件。输入来更改该文件的所有权chown mysql /var/run/mysqld/mysqld.sock

  3. 完成“ 2”后,通过输入service mysql restart或重新启动MySQL服务/etc/init.d/mysql restart

完成上述步骤后,我的问题已解决。我很少遇到这个问题,并且可能有更好的方法,因此如果需要的话,请务必提供建设性的反馈意见。


1
我注意到文件不存在,只是重新启动了mysql服务器。它会自动创建文件并启动就好了。感谢您的带头。
Sojurn


15

检查"bind-adress"my.cnf中的参数。

否则尝试使用以下命令:

mysql -h 127.0.0.1 -P 3306 -u root -p
  • -h代表host 127.0.0.1,即localhost

  • -P(注意-P为大写)3306,即MySQL的默认端口



11

如果您使用的是Amazon EC2,并且实例上存在此问题,则只需执行以下操作:

sudo yum install mysql-server
sudo service mysqld restart

Amazon EC2没有安装服务器(仅安装了客户端),因此,在这种情况下,您需要在实例上安装该服务器,然后尝试

 mysql -u root -p

检查是否有效。


无法重新启动mysqld.service:找不到单元mysqld.service。在Ubuntu 16.04中
Ketav Chotaliya

9

我想每当你得到错误

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

我将建议首先检查mysql守护程序是否正在运行...大多数情况下,默认情况下它将不运行。您可以通过进行检查/etc/init.d/mysqld status

如果它没有运行,请先启动它:

.../etc/init.d/mysqld start.

我敢打赌,它将成功110%。


9

而不是使用本地主机:

mysql -u myuser -pmypassword -h localhost mydatabase

使用127.0.0.1

mysql -u myuser -pmypassword -h 127.0.0.1 mydatabase

(还要注意,-p和mypassword之间没有空格)

请享用 :)


为了安全起见,您也不能在命令行中输入以下密码:mysql -u myuser -p -h 127.0.0.1 mydatabase MySQL会询问您密码而不回显密码。
DDay

1
这为我解决了。不过,我仍然不知道为什么127.0.0.1工作,同时localhost不?
not2savvy

9

确保您已经备份了重要的数据库,然后尝试卸载MySQL相关的内容:

apt-get remove --purge mysql\*

然后重新安装

apt-get install mysql-server mysql-client

这对我有用,并且保留了数据。

如果PHP MySQL显示错误,则可能必须重新安装PHP MySQL

apt-get install php5-fpm php5-mysql

我认为那是致命的武器。我尝试了一切,但是只有您的建议对我有所帮助。谢谢 !
Messou

9

我也面临着同样的问题,如果mysql server默认情况下您没有运行它,它将再次出现,几秒钟后它将再次停止,因此您再次运行($ sudo service mysql start )命令,如果知道,可以进行更改。

对于该使用命令

$ sudo service mysql start   

(如果需要,请输入用户密码,因为我们使用sudo),然后运行

$ sudo mysql -u root -p          (put user password if required )

现在您有了数据库



7

如果您在Linux机器上安装了XAMPP,请尝试将my.cnf文件从复制/opt/lampp/etc/my.cnf/etc/my.cnf

然后,mysql -u root再次运行...现在,您应该具有正确的套接字,并且能够运行MySQL客户端。


7

我也遇到了这个问题,但是我只是做到了:

sudo service mysql restart 

它为我工作。


7

我找到了解决方案

在触发命令之前mysql_secure_installation

  • 步骤1: sudo systemctl stop mariadb
  • 第2步: sudo systemctl start mariadb
  • 第三步: mysql_secure_installation

然后它将询问root密码,您只需 Enter并设置新的root密码即可。


6

在我的情况下,默认端口3306被其他进程使用,因此它没有启动。在我停止其他服务并执行之后sudo service mysql start,它运行良好。顺便说一句,您可以使用类似的sudo lsof -Pn -iTCP:3306方法查看谁在使用该端口。


6

就我而言,它是通过一些研发工作的:

我可以使用以下方式连接到MySQL

root-debian#mysql -h 127.0.0.1 -u root -p

但它不与 mysql -u root -p

bind-addressmy.cnf中找不到任何内容。所以我outcommented参数socket=/var/lib/mysql/mysqld.sockmy.cnf这是害我一个问题登录。

重新启动服务后,一切正常:

root@debian:~# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.6.19 MySQL Community Server (GPL)

6

我用重启mysql解决了这个问题

/etc/init.d/mysql stop

/etc/init.d/mysql start

而已。


5

根据经验,我说您需要先检查服务器是否正在运行,然后再尝试配置MySQL。最后一种解决方案是重新安装MySQL。


5

打开终端并输入:

sudo apt-get purge mysql-client-core-5.6

sudo apt-get autoremove

sudo apt-get autoclean

sudo apt-get install mysql-client-core-5.5

sudo apt-get install mysql-server  

MySQL数据库核心客户端和MySQL Server软件包都将是相同的5.5版本。MySQL客户端5.5和MySQL Server 5.5是Ubuntu 14.04中这些软件包的“最佳”版本,具体由软件包维护者确定。

如果您想安装MySQL Client 5.6和MySQL Server 5.6,也可以在Ubuntu软件中心中找到mysql-client-core-5.6和mysql-server-5.6软件包。重要的是,在任何情况下,客户端和服务器版本号均匹配。

这对我有用。


5

检查您是否具有正确的权限:

sudo chmod 755 /var/lib/mysql/mysql

我遇到了同样的问题,这对我有用。完成此操作后,我能够启动MySQL。


5

就我而言,当我运行时,似乎真的无法杀死mysql进程

sudo service mysql stop
ps -ef | grep mysql

mysql进程始终存在,它似乎正在阻止套接字文件,而新的mysql进程本身无法创建它。

所以这有帮助

cd /var/run
sudo cp mysqld/ mysqld.bc -rf
sudo chown mysql:mysql mysqld.bc/
sudo service mysql stop
sudo cp mysqld.bc/ mysqld -rf
sudo chown mysql:mysql mysqld -R
sudo /usr/sbin/mysqld --skip-grant-tables --skip-networking &

现在我可以使用登录数据库了

mysql -u root

然后更新root密码:

UPDATE user SET authentication_string=password('YOURPASSWORDHERE') WHERE user='root';
FLUSH PRIVILEGES;

PS:我在更新root passwod时遇到问题,似乎是“ auth_socket”插件的问题,因此我必须创建具有完全特权的新用户

insert into user set `Host` = "localhost", `User` = "super", `plugin` = "mysql_native_password", `authentication_string` = NULL, `password_expired` = "N", `password_lifetime` = NULL, `account_locked` = "N", `Select_priv` = "Y",
`Insert_priv` = "Y", `Update_priv` = "Y", `Delete_priv` = "Y", `Create_priv` = "Y", `Drop_priv` = "Y", `Reload_priv` = "Y", `Shutdown_priv` = "Y", `Process_priv` = "Y", `File_priv` = "Y",
`Grant_priv` = "Y",  `References_priv` = "Y", `Index_priv` = "Y", `Alter_priv` = "Y", `Show_db_priv` = "Y", `Super_priv` = "Y", `Create_tmp_table_priv` = "Y", `Lock_tables_priv` = "Y",
`Execute_priv` = "Y", `Repl_slave_priv` = "Y",  `Repl_client_priv` = "Y",  `Create_view_priv` = "Y", `Show_view_priv` = "Y", `Create_routine_priv` = "Y", `Alter_routine_priv` = "Y",
`Create_user_priv` = "Y",  `Event_priv` = "Y", `Trigger_priv` = "Y", `Create_tablespace_priv` = "Y";

这将创建没有密码的用户“ super”,然后您可以与 mysql -u super


感谢您的回答,我能够登录mysql,但是我的数据库中没有用户表。
约翰·乔布

此解决方案有效。但是,在执行sql语句以更改root用户的密码之前,需要选择一个数据库。执行以下语句<br> use mysql;<br>,您现在可以使用<br>UPDATE user SET authentication_string=password('YOURPASSWORDHERE') WHERE user='root'; FLUSH PRIVILEGES;
CharleK。18年

5

在Debian服务器Jessie上,我的工作解决方案是简单地执行

service mysql restart
service mysql reload

以root用户身份

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.