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

Posted

技术标签:

【中文标题】无法通过套接字 \'/var/mysql/mysql.sock\' 连接到本地 MySQL 服务器 (38)【英文标题】:Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (38)无法通过套接字 '/var/mysql/mysql.sock' 连接到本地 MySQL 服务器 (38) 【发布时间】:2011-07-19 14:03:06 【问题描述】:

我在尝试连接 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]

【问题讨论】:

MySQL 正在运行吗? 这当然解释了尝试连接它时的错误。正如@Romain 所提到的,MySQL 的日志中是否有任何内容(尝试/var/log/mysql 或附近的某个地方)表明它为什么没有运行?尝试启动时是否出现错误? 我遇到了同样的错误,但在我的情况下,我发现 mysql 无法启动,因为磁盘已满 100%。 /var/log/mysqld.log 很有帮助。 我想他们询问它是否正在运行的原因是因为套接字是在服务启动时创建的。我安装了 mysql,但从未启动该服务,因此 .sock 文件不存在。如果您刚刚安装,请键入 service mysqld start。 hth 以下shimanyi sudo service mysql start的回答救了我 【参考方案1】:

如果您的文件 my.cnf(通常在 /etc/mysql/ 文件夹中)正确配置了

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

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

mysqladmin -u root -p status

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

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

帮我解决了

【讨论】:

按照上述步骤重新启动mysqld服务后,它对我有帮助。 最好将权限设置为755,这样只有目录所有者才能写入。 我的问题实际上只是我的网络应用程序的存储空间已经用完了!经典! 在我的 openSUSE 12.3 上,my.cnf 在 /etc/ 中。 我们也应该更改/var/log/mysqld.log的权限,谢谢【参考方案2】:

你确定你安装了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)

希望对你有帮助。

【讨论】:

我用的是自制软件,效果很好:brew install mysql 我已经安装了客户端,我需要的命令是sudo apt-get install mysql-server 然后生活很好 输出的Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (38)不是来自客户端吗?是客户端尝试连接但无法连接,对吗? (我认为原始问题需要编辑以澄清这一点)。【参考方案3】:

对我有用的快速解决方法:尝试在 mysql_connect() 中使用本地 IP 地址 (127.0.0.1) 而不是“localhost”。这“强制”php 通过 TCP/IP 而不是 unix 套接字进行连接。

【讨论】:

它成功了...但是为什么呢? MySQL 是否在尝试连接之前解析localhost 并获得127.0.0.1 不...使用本地主机时,您没有使用 Internet 套接字。您正在使用 IPC 套接字。 en.wikipedia.org/wiki/Unix_domain_socket 。 127.0.0.1 是本地环回,这意味着请求不会退出您的机器,但会使用 TCP/IP,因此速度较慢... 也适合我。我在 ubuntu 14.04、hhvm 和 nginx 上。 谢谢。这对我有用,但从答案中我不清楚修复是什么 当你通过 ssh 隧道连接到远程服务器时,这也是必要的【参考方案4】:

我收到以下错误

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

bind-address        = localhost

然后重启

sudo /etc/init.d/mysql restart

成功了

【讨论】:

我遇到了类似的问题;从以太网 (192.168.220.11) 移动到 wifi (192.168.220.12) 但绑定地址硬编码为以太网 IP。更改为 localhost 修复了它。【参考方案5】:

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

【讨论】:

sudo service mysql start|restart 用于 Ubuntu。【参考方案6】:

为我的文件设置 cron 作业时出现此错误。我将文件的权限更改为 777 但它仍然对我不起作用。最后我得到了解决方案。可能对其他人有帮助。

试试这个命令:

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

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

【讨论】:

强制通过 TCP/IP 连接而不是使用套接字效率低下(并且需要您在服务器中打开 localhost TCP/IP 支持,根据this earlier answer)。 2011 年接受的答案更好:配置服务器,以便您可以正确使用套接字。 -p 不是port,而是password,你把它和-P混淆了 这似乎或多或少是this earlier answer的副本 对我来说,只需定义正确的主机:mysql -h 127.0.0.1 -u root -p 谢谢!我没有 .sock 文件,但帮助了我。【参考方案7】:

为防止问题发生,您必须从命令行正常关闭服务器,而不是关闭服务器电源。

shutdown -h now

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

基于 Centos,当您遇到此问题时,另一种重新备份的方法是移动 mysql.sock:

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

service mysqld start

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

【讨论】:

【参考方案8】:

从这里的许多答案可以看出,当您启动 MySQL 服务时,有很多问题可能导致此错误消息。问题是,如果您查看相应的日志文件,MySQL 通常会准确地告诉您出了什么问题。

例如,在 Ubuntu 上,您应该检查 /var/log/syslog。因为很多其他的东西也可能会记录到这个文件中,你可能想用grep查看mysql消息,tail只查看最近的消息。总而言之,这可能看起来像:

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

不要盲目地更改您的配置,因为其他人说“这适用于我的系统”。找出你的系统到底出了什么问题,你会更快地得到更好的结果。

【讨论】:

+1 退后一步并指出许多其他答案甚至都没有考虑到的事情 - 实际查看应用程序可能报告的问题比盲目地查看更好的方法急于做出改变,甚至可能不适用......! 啊,所以它使用了错误的.cnf。这就解释了。现在我可以停止尝试随机的事情并解决实际问题。谢谢。【参考方案9】:

另一种解决方法是编辑 /etc/my.cnf 并在 [client] 部分中包含主机

 [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] 部分【参考方案10】:

我有同样的问题,它是由 mysql 服务器运行时更​​新 mysql 驱动程序引起的。 我修复了它,只是重新启动了 mysql 和 apache2:

sudo 服务 mysql 停止

sudo 服务 mysql 启动

sudo 服务 apache2 停止

sudo 服务 apache2 启动

【讨论】:

就我而言,mysql 没有运行。我在运行sudo service mysql status 后运行sudo service mysql start 以验证它没有运行。【参考方案11】:

尝试使用 -h(主机)和 -P(端口):

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

【讨论】:

【参考方案12】:

就我而言,我使用的是 Centos 5.5。我发现问题是因为mysql服务以某种方式停止了。 于是我用命令启动了mysql服务:

 /etc/init.d/mysqld start

所以.. 愚蠢的错误。

【讨论】:

【参考方案13】:

如果一切正常并且您刚刚开始看到此错误,那么在您执行任何其他操作之前,请确保您没有磁盘空间不足:

df -h

如果创建 mysql.sock 的卷是 100% 使用的,MySql 将无法创建它,这将是此错误的原因。您需要做的就是删除不需要的内容,例如旧的日志文件。

【讨论】:

【参考方案14】:
sudo service mysql start

这应该可以很好地为您服务。您可能更改了一些影响 mysql 配置的命令。

【讨论】:

systemctl start mariadb.service 在 Fedora 22 或 RedHat 7 中。之后可以设置 root 密码。【参考方案15】:

这个问题有很多解决方案,但对于我的情况,我只需要更正机器/服务器(Ubuntu 16.04 服务器)上的 DATE

i) 检查您的服务器的日期并更正它。

ii) 运行sudo /etc/init.d/mysql restart

这应该可以开始了。

【讨论】:

【参考方案16】:

我收到错误是因为我正在运行 MAMP 并且我的 .sock 文件位于不同的位置。我刚刚添加了一个符号链接,应用程序认为它应该指向它的实际位置,它就像一个魅力。

【讨论】:

如何在应用程序认为应该指向的位置添加符号链接以指向实际位置?【参考方案17】:

如果您使用的是 AWS (Amazon Web Services) Micro 版本,那么这是内存问题。我跑的时候

mysql

从终端会说

ERROR 2002 (HY000): Can't connect to local MySQL server through socket /var/run/mysqld/mysqld.sock' (111)

所以我尝试了以下方法,但它会失败。

service mysqld restart

经过大量搜索,我发现您必须为 MySQL 创建一个交换文件才能拥有足够的内存。列出的说明:http://www.prowebdev.us/2012/05/amazon-ec2-linux-micro-swap-space.html

然后,我能够重新启动 mysqld。

【讨论】:

我在 AWS 服务器“微型”实例上遇到了同样的问题,我可以确认制作交换文件 DID 修复了“错误 2002 (HY000): 无法通过套接字连接到本地 MySQL 服务器/var/run/mysqld/mysqld.sock' (111)" 问题。谢谢@jth_92!【参考方案18】:

我还发现这是一个权限问题。我将 MySQL 文件与工作安装(都在 Debian 6 挤压上)进行了比较,并且必须进行以下所有权更改(其中 mydatabase 是您拥有的任何数据库)。

所有权mysql:mysql:

chown mysql:mysql /var/lib/mysql
chown mysql:mysql /var/lib/mysql/ib*
chown mysql:mysql /var/lib/mysql/mydatabase
chown mysql:mysql /var/lib/mysql/mydatabase/*
chown mysql:mysql /var/lib/mysql/mysql/* 

所有权mysql:root:

chown mysql:root /var/lib/mysql/mysql
chown mysql:root /var/run/mysqld 

所有权mysql:adm:

chown mysql:adm /var/log/mysql
chown mysql:adm /var/log/mysql.err
chown mysql:adm /var/log/mysql.log* 

【讨论】:

【参考方案19】:

对我来说 - 这只是 MySQL 需要很长时间才能加载的一个例子。我的一个数据库中有超过 100,000 个表,它最终启动了,但在这种情况下显然需要很长时间。

【讨论】:

【参考方案20】:

你总是可以通过使用--socket选项指定mysql.sock文件的位置来启动mysql服务器

mysql --socket=/var/mysql/mysql.sock 

即使在 my.cnf 文件的不同位置中指定了套接字文件的位置,这也将起作用。

【讨论】:

【参考方案21】:

对于任何解决方案都不起作用的人,请尝试:

cd /etc/mysql

检查 my.cnf 是否存在

nano my.cnf

并确保您只有一个绑定地址,如下所示:

绑定地址 = 127.0.0.1

如果不是,那可能是问题所在,退出 nano 并保存文件。

service mysql start

请注意,如果您没有 nano(它是一个文本编辑器),只需使用 apt-get install nano 安装它,然后按 Ctrl+X 退出,不要忘记说 Y 保存并使用相同的文件)

【讨论】:

不幸的是,这不起作用。这基本上只是说只有本地机器可以访问mysql。没有远程连接。【参考方案22】:
sudo service mysqld start

为我工作,我正在使用 Centos

【讨论】:

【参考方案23】:

我在尝试启动服务器时也遇到了这个问题,这里的很多答案只是说启动服务器不起作用。您可以做的第一件事是执行以下操作以查看是否有任何配置错误:

/usr/sbin/mysqld --verbose --help 1>/dev/null

我确实出现了一个错误:

160816 19:24:33 [Note] /usr/sbin/mysqld (mysqld 5.5.50-0ubuntu0.14.04.1-log) starting as process 9461 ...
160816 19:24:33 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
160816 19:24:33 [Note] Plugin 'FEDERATED' is disabled.
160816 19:24:33 [ERROR] /usr/sbin/mysqld: unknown variable 'innodb-online-alter-log-max-size=4294967296'
160816 19:24:33 [ERROR] Aborting

一个简单的grep -HR "innodb-online-alter-log-max-size" /etc/mysql/ 向我展示了包含违规行的确切文件,因此我从文件中删除了该行。

然后,检查我的/var/log/mysql/error.log 文件:

InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes
InnoDB: than specified in the .cnf file 0 671088640 bytes!
160816 22:46:46 [ERROR] Plugin 'InnoDB' init function returned error.
160816 22:46:46 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
160816 22:46:46 [ERROR] Unknown/unsupported storage engine: InnoDB
160816 22:46:46 [ERROR] Aborting

基于this question,接受的解决方案不起作用,因为我什至无法启动服务器,所以我按照一些 cmets 的说法删除了我的 /var/lib/mysql/ib_logfile0/var/lib/mysql/ib_logfile1 文件。

这允许服务器启动并且我能够连接并执行查询,但是检查我的错误日志文件很快就会被数万行填满,如下所示:

160816 22:52:15  InnoDB: Error: page 1415 log sequence number 82039318708
InnoDB: is in the future! Current system log sequence number 81640793100.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: for more information.

根据here 的建议,为了解决这个问题,我执行了 mysqldump 并恢复了所有数据库(请参阅链接了解其他几个解决方案)。

$ mysqldump -u root -p --allow-keywords --add-drop-database --comments --hex-blob --opt --quote-names --databases db_1 db_2 db_3 db_etc > backup-all-databases.sql
$ mysql -u root -p < backup-all-databases.sql

现在一切似乎都按预期工作。

【讨论】:

检查/var/log/mysql/error.log 对我有帮助。 [ERROR] Can't init tc log 使用以下答案快速修复:dba.stackexchange.com/a/185006/163583【参考方案24】:

添加

--protocol=tcp 

到您的连接中的 pramaters 列表对我有用。

【讨论】:

【参考方案25】:

这对我来说已经足够了

sudo /etc/init.d/mysql restart

【讨论】:

【参考方案26】:

我今天遇到了这个问题。这些答案都没有提供修复。我需要执行以下命令(在此处找到 https://***.com/a/20141146/633107)才能启动我的 mysql 服务:

sudo /etc/init.d/mysql stop
cd /var/lib/mysql/
ls ib_logfile*
mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile1.bak
... etc ...
/etc/init.d/mysql restart

/var/log/mysql/error.log 中的以下错误部分表明了这一点:

140319 11:58:21 InnoDB: Completed initialization of buffer pool
InnoDB: Error: log file ./ib_logfile0 is of different size 0 50331648 bytes
InnoDB: than specified in the .cnf file 0 5242880 bytes!
140319 11:58:21 [ERROR] Plugin 'InnoDB' init function returned error.
140319 11:58:21 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
140319 11:58:21 [ERROR] Unknown/unsupported storage engine: InnoDB
140319 11:58:21 [ERROR] Aborting

我也看到了磁盘已满错误,但仅在没有 sudo 的情况下运行命令时出现。如果权限检查失败,它会报告磁盘已满(即使您的分区还没有接近满)。

【讨论】:

【参考方案27】:

CentOS 7,64 位。全新安装。 就我而言,错误是因为我没有安装正确的 MySQL 服务器和 MySQL 客户端。 使用yum,我删除了mariadb 和mysql-community 版本。我从official MySQL website 下载了客户端和服务器的 rpm 并安装了服务器和客户端。

在安装服务器时,我看到一条消息,指出 MySQL 的 root 帐户的密码存储在一个文件中,我可以使用 sudo cat /root/.mysql_secret 查看该文件。

所以在安装客户端和服务器后,我使用命令sudo service mysql status 检查了 MySQL 是否正常工作(我想我在这样做之前重新启动了),我得到了结果。

MySQL 正在运行 (2601) [OK]

我使用 .mysql_secret 文件中的密码登录 MySQL:mysql -uroot -pdxM01Xfg3DXEPabpf。请注意,dxM01Xfg3DXEPabpf 是 .mysql_secret 文件中提到的密码。

然后在mysql提示符下输入以下命令修改root密码:

mysql&gt; SET PASSWORD FOR 'root'@'localhost' = PASSWORD('somePassword');

从那时起一切正常。

【讨论】:

RHEL6U6 上的情况相同,服务器版本:5.6.23-enterprise-commercial-advanced。【参考方案28】:

这并不能直接回答您的问题,而是其中的一个子集,即使用 PythonAnywhere。在寻找修复程序时,我一直在偶然发现这个问题,所以我在这里添加它,希望它能帮助我遇到的其他人。


PythonAnywhere决定更改数据库连接主机名以提高效率和可靠性,如detailed here:

您应该用于连接到您帐户的官方主机名 MySQL 数据库实例已从 mysql.server 更改为 您的用户名.mysql.pythonanywhere-services.com。这绕过了我们最近开始出现问题的基础设施的一部分 周,它应该比旧的更有效和可靠 方式。

因此,您需要将主机名更新为上面突出显示的值。

【讨论】:

【参考方案29】:

我刚遇到这个问题。经过一天的检查,我终于得到了答案。mysql.sock 文件是在 MariaDB 启动时创建的,在 MariaDB 关闭时被删除。如果 MariaDB 没有运行,它就不会存在。 也许你没有安装 MariaDB。 您可以按照以下说明进行操作: https://www.linode.com/docs/databases/mariadb/how-to-install-mariadb-on-centos-7 最好的

【讨论】:

【参考方案30】:

如果有人在寻找初始化错误

无法连接到数据库“/var/run/mysql/mysql.sock”

在运行 civicrm 和 drupal 时,只需在

中进行以下更改

settings.php 和 civicrm.settings.php

仅在您尝试建立数据库连接的地方

localhost 到 127.0.0.1 #local 安装

【讨论】:

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

mysql问题:没有mysql.sock

macos中mysql怎么安装

Can't connect to local MySQL server through socket '/opt/lampp/var/mysql/mysql.sock'

mysql 5.7 配置文件说明

基于XAMPP的MySQL查询浏览器

mysql 5.7配置项最详细的解释