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

Posted

技术标签:

【中文标题】ERROR 2002 (HY000): 无法通过套接字 \'/var/run/mysqld/mysqld.sock\' 连接到本地 MySQL 服务器 (2)【英文标题】:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)ERROR 2002 (HY000): 无法通过套接字 '/var/run/mysqld/mysqld.sock' 连接到本地 MySQL 服务器 (2) 【发布时间】:2019-12-17 22:07:49 【问题描述】:

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

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

我该如何解决这个问题?我无法打开、卸载或重新安装 LAMP。

【问题讨论】:

可能重新安装它更容易:***.com/a/31984482/763744 通过停止 MySQL 并以安全模式启动它跳过 --grant 表来重置密码 在你的终端输入这个“sudo apt-get install mysql-server” 启动或重启mysql服务并检查。 sudo /etc/init.d/mysql start 或 sudo /etc/init.d/mysql restart systemctl start mariadb.service 【参考方案1】:

我曾经遇到过这个问题并通过安装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 中,套接字文件配置可能是/tmp/mysql.sock,而在/etc/mysql/my.cnf 中,套接字文件配置可能是/var/run/mysqld/mysqld.sock。所以,删除或者重命名/etc/mysql/my.cnf,让mysql使用/etc/my.cnf,那么问题就解决了。

【讨论】:

sudo apt-get install mysql-server在ubuntu上安装mysql 如果我必须从技术上解释,我会说 1)如果你正在运行“mysql -u -h -p”,你实际上是在运行 mysql 客户端来访问 mysql服务器。如果你用'-h'提到的地址/IP地址上没有安装mysql服务器,就会弹出上述错误。这是因为它无法通过套接字 mysql.sock 连接到 MySQL 服务器 2) 如果已经安装了 Mysql-server,它应该正在运行。如果没有,您将观察到相同的错误。所以让它在你指定的服务器上运行。 如果您尝试更改存储数据库的目录,但在配置文件中输入错误的目录(如拼写错误),也会发生这种情况。它不会告诉您拼写错误的目录不存在,而是会告诉您您没有访问它的权限。 作为第一步,我建议尝试重新启动服务器进程(请参阅其他服务器与客户端的区别)。尝试 sudo /etc/init.d/mysql 重启。通常,不需要重新安装。我建议您首先检查日志文件。不仅是 mysql 的日志文件,还有 /var/log/syslog,因为您可能有服务器崩溃导致 mysql 作为副作用而崩溃。 对我来说是在 etc/mysql/mysql.conf.d/mysqld.cnf 。这是唯一存在/var/run/mysqld/mysqld.sock 的文件【参考方案2】:

试试这个:

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

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

telnet 127.0.0.1 3306 

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

【讨论】:

我遇到了同样的错误。我已经检查过了,main 和 my.cnf 中的默认绑定已经设置为 127.0.0.1。但是,使用上面的命令允许我连接。将不得不继续寻找以了解为什么只执行“mysql”会给出错误。 我得到 telnet:无法连接到远程主机:由于 telnet 命令,连接被拒绝。但是 apache 仍然运行,因为我能够打开 localhost @cchiera 你知道,我以前没有这个错误。但是当我想使用 ssh 隧道通过 ios 应用程序连接到我的数据库时,我收到了这个 2013 错误。为了解决这个问题,我不得不编辑/etc/my.cnf 并评论#bind-address = 127.0.0.1 Reference 1 Reference 2。然后我可以连接。在此之后,我意识到我现在遇到了这个 2002 年的错误,它把我带到了这个答案,现在它又可以工作了。我同意你的解释,解释为什么只输入 mysql 而没有 -h 会引发错误。跨度> 注意:mysql -h localhost 不起作用。确保使用答案中指定的mysql -h 127.0.0.1 如果我使用这个答案中的命令登录,我该如何解决这个问题?【参考方案3】:

我看到了所有这些答案,但没有提供重置密码不接受答案的选项。实际问题是他忘记了他的密码,所以他需要重置,而不是像大多数答案所暗示的那样查看它是否正在运行(安装与否)。


重置密码

按照以下步骤操作(如果您真的忘记了密码会很有帮助,并且您可以随时尝试,即使您目前不在这种情况下):

    停止mysql

    sudo /etc/init.d/mysql stop
    

    或者对于其他发行版本:

    sudo /etc/init.d/mysqld stop
    

    以安全模式启动 MySQL

    sudo mysqld_safe --skip-grant-tables &
    

    使用 root 登录 MySQL

    mysql -u root
    

    选择要使用的 MySQL 数据库

    use mysql;
    

    重设密码

    -- 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';
    

    刷新权限

    flush privileges;
    

    重启服务器

    quit
    

    停止并重新启动服务器

    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

    使用新密码登录

    mysql -u root -p
    

    输入新密码并再次享受您的服务器,就像什么都没发生一样

这取自 Reset a MySQL root password

【讨论】:

更新用户密码对我不起作用,但是一旦登录 MySQL 监视器并使用了 mysql 数据库,repair table user use_frm 为我解决了这个问题。 - ***.com/questions/4297592/… 在 MySQL 5.7 中,mysql.user 表字段中的密码字段被删除,现在字段名称为 'authentication_string',所以 (5) 应该是update user set authentication_string=password('mynewpassword') where user='root'; 这对我很有用,但我首先必须实施这个解决方案:***.com/questions/42153059/… 对于 MySQL 8,在第 5 步中使用以下内容: UPDATE mysql.user SET authentication_string=null WHERE User='root'; @JoeKreydt,在 v.8 中,也可以使用 v.5.7+ 的原始示例,但是在提供新密码值的情况下进行了较小的修改,而没有周围的 passowrd() 参数。 【参考方案4】:

我尝试了以下步骤:

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

它对我有用。

【讨论】:

从这里,我刚刚运行了 sudo service mysql restart 并且它工作了。 在我的情况下,错误是 IP 更改了,所以我设置了 bind-address=localhost @rshahriar 在我的 /etc/my.cnf 中没有任何称为绑定地址的内容,添加该字段是个好主意 @SilvioDelgado 如果您想通过 ssh 隧道连接,则不会。 Explanation here 重启mysql服务也对我有用,但仍然不确定在哪里可以找到错误日志以找出原因并尝试防止它再次发生......【参考方案5】:

在我的情况下,磁盘已满,mysqld 无法再启动。

尝试重启mysql服务。

> service mysql restart

> service mysql stop

> service mysql start

如果它不能识别stop 命令,那么它肯定是磁盘空间。您应该在分配了mysql 的分区中腾出一些空间或使磁盘更大。

检查磁盘空间

> df -h

【讨论】:

同样的事情发生在我身上——满盘。清理了一些空间,重新启动,问题就消失了。 如果这是您执行的问题:“/etc/init.d/mysqld start”会告诉您您的磁盘分区已满 对我来说也一样,磁盘 100%。清理空间并启动服务正常【参考方案6】:

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

mysql.server start

如果你在 Mac 上使用 brew 安装 mysql,只需使用:

brew services start mysql

【讨论】:

【参考方案7】:

我遇到了类似的问题。 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 service mysql start”。上次我在 Ubuntu 上安装 MySQL 时,我认为它在安装时会自动启动。 Manjaro 上的 MariaDB 要求在安装后显式启动该服务。【参考方案8】:

我通过杀死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): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)”。最后,我意识到它正在尝试自我恢复,所以我杀死并重新启动它。 有(罕见的)“mysql start”会失败的情况,所以你需要使用“restart”参数。如果你需要杀死一个守护进程,最好使用“stop”参数而不是 kill 命令。但是,killall 命令比 kill 命令(killall mysqld)更方便。 杀死 MySQL 进程然后重新启动 MySQL 对我有用,很好【参考方案9】:

MySQL 服务器进程不知何故没有创建套接字,或者客户端在错误的位置寻找套接字。

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

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

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

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

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

【讨论】:

【参考方案10】:

在我不得不重新启动生产服务器后,我刚刚遇到了同样的问题。我在 DigitalOcean 液滴上运行 Debian 8.1 (Jessie)。

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

    检查文件/var/run/mysqld/mysqld.sock 是否存在。如果没有,请输入 touch /var/run/mysqld/mysqld.sock 手动创建它(这是我必须做的)。

    所以 MySQL 进程可以使用这个文件。通过输入chown mysql /var/run/mysqld/mysqld.sock更改所述文件的所有权。

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

经过以上步骤,我的问题就解决了。我很少遇到这个问题,可能有更好的方法,所以如果需要,一定要提供建设性的反馈:)。

【讨论】:

我注意到该文件不存在,只是重新启动了 mysql 服务器。它自动创建了文件并启动得很好。感谢您的领导。【参考方案11】:

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

用命令试试:

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

-h为主机127.0.0.1,即localhost

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

【讨论】:

【参考方案12】:

您的 mysql-server 可能没有运行。通过在终端中输入mysql.server start 来确保它运行。

【讨论】:

【参考方案13】:

我认为每当你得到错误时

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

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

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

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

我打赌它会 110% 起作用。

【讨论】:

sudo /etc/init.d/mysql start 也是正确的解决方案,如果您使用 WSL,因为不支持新贵服务:github.com/Microsoft/WSL/issues/745 相同的想法,但语法不同:service mysqld start【参考方案14】:

如果您使用Amazon EC2,并且您在实例上遇到此问题,那么您只需:

sudo yum install mysql-server
sudo service mysqld restart

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

 mysql -u root -p

检查是否有效。

【讨论】:

重启mysqld.service失败:未找到单元mysqld.service。在 Ubuntu 16.04【参考方案15】:

这对我有用:

ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
service mysql restart

这会创建一个链接。

【讨论】:

对我不起作用 :( 这会在两个文件夹 askubuntu.com/a/56340/242873 之间创建一个符号链接【参考方案16】:

而不是使用本地主机:

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 会询问你的密码而不是回显它。 这为我解决了。但是,我仍然想知道为什么127.0.0.1 有效而localhost 无效?!【参考方案17】:

我也遇到了这个问题,但我就是这样做的:

sudo service mysql restart 

它对我有用。

【讨论】:

【参考方案18】:

确保你有重要数据库的备份,然后尝试卸载 MySQL 相关的东西:

apt-get remove --purge mysql\*

然后重新安装

apt-get install mysql-server mysql-client

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

如果 PHP MySQL 显示错误,您可能需要重新安装 PHP MySQL

apt-get install php5-fpm php5-mysql

【讨论】:

我认为这是致命的武器。我尝试了一切,但只有你的建议对我有帮助。谢谢!【参考方案19】:

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

对于那个使用命令

$ sudo service mysql start   

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

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

现在你有了你的数据库

【讨论】:

【参考方案20】:

您的 MYSQL 似乎已停止。使用以下命令再次启动 MySQL

sudo service mysql start

【讨论】:

【参考方案21】:

我找到了解决方案

发射前命令:mysql_secure_installation

第一步:sudo systemctl stop mariadb 第二步:sudo systemctl start mariadb 第三步:mysql_secure_installation

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

【讨论】:

【参考方案22】:

如果您的安装是最近的,您应该确认您的安装是否是安装服务器... mysql-server-5.5.. 也许您只安装了“mysql”.. 这只是客户端而不是服务器。

【讨论】:

【参考方案23】:

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

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

【讨论】:

【参考方案24】:

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

【讨论】:

【参考方案25】:

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

我可以使用

连接到 MySQL
root-debian#mysql -h 127.0.0.1 -u root -p

但它不适用于mysql -u root -p

我在 my.cnf 中没有找到任何 bind-address。所以我在my.cnf 中对参数socket=/var/lib/mysql/mysqld.sock 进行了注释,这导致我出现登录问题。

重启服务后一切正常:

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)

【讨论】:

【参考方案26】:

在我的情况下,当我运行时,我似乎真的无法杀死 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 密码时遇到了问题,“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密码之前,需要先选择一个数据库。执行下面的语句 use mysql; 你现在可以使用 UPDATE user SET authentication_string=password('YOURPASSWORDHERE') WHERE user='root'; FLUSH PRIVILEGES;【参考方案27】:

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

service mysql restart
service mysql reload

作为根用户

【讨论】:

【参考方案28】:

我通过重启mysql解决了这个问题

/etc/init.d/mysql stop

/etc/init.d/mysql start

就是这样。

【讨论】:

【参考方案29】:

拳头,尝试重新启动它

服务 mysql 停止

服务mysql启动

如果上面没有解决问题,现在我们走吧……

完全卸载 MySQL

sudo apt-get remove --purge mysql\*

重新安装

sudo apt install mysql-server mysql-client

测试它是否运行

sudo mysql

安装php驱动

sudo apt install php7.4 php7.4-fpm php7.4-mysql php7.4-cgi php7.4-cli php7.4-common

您可以将 php7.4 替换为 php7.x 或 php8.0.12 或更高版本 很不错!

【讨论】:

小心数据丢失 这不起作用。你甚至会丢失数据【参考方案30】:

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

【讨论】:

以上是关于ERROR 2002 (HY000): 无法通过套接字 '/var/run/mysqld/mysqld.sock' 连接到本地 MySQL 服务器 (2)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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