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


385

我在尝试连接mysql时遇到大问题。当我跑步时:

/usr/local/mysql/bin/mysql start

我有以下错误:

Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (38)

我的确mysql.sock/var/mysql目录下。

/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

我已经使用重新启动了Apache sudo /opt/local/apache2/bin/apachectl restart

但是我仍然有错误。

否则,我不知道这是否相关,但是当mysql_config --sockets我得到时

--socket         [/tmp/mysql.sock]

53
MySQL正在运行吗?
大卫

2
这当然可以解释尝试连接到它的错误。正如@Romain所提到的,MySQL的日志中(尝试/var/log/mysql或附近的地方)如何显示它为什么没有运行?尝试启动时会收到错误消息吗?
大卫

5
我遇到了同样的错误,但就我而言,我发现mysql无法启动,因为磁盘已100%充满。/var/log/mysqld.log很有帮助。
yellavon

4
我想,他们问它是否正在运行的原因是因为套接字是在服务启动时创建的。我安装了mysql,但从未启动该服务,因此.sock文件不存在。键入service mysqld start如果您刚安装。hth
changokun

2
下面的shimanyi答案sudo service mysql start救了我
Kiren Siva 2015年

Answers:


218

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

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

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

mysqladmin -u root -p status

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

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

为我解决了


11
在执行上述步骤并重新启动mysqld服务后,它对我有所帮助。
whirlwin 2012年

11
最好将权限设置为755,以便只有目录所有者才能写入该权限。
codewaggle 2012年

2
我的问题实际上只是我的Web应用程序的存储空间不足!经典!
James T Snell 2014年

3
在我的openSUSE 12.3上,my.cnf位于/ etc /中。

我们还应该将权限更改为/var/log/mysqld.log,谢谢
Allahbakash.G 2014年

94

确定要安装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
JaKXz 2014年

2
我已经安装了客户端,我需要的命令是sudo apt-get install mysql-server当时的生活很好
ErichBSchulz 2014年

1
不是输出Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (38) 客户端?是客户端尝试连接失败,对吧?(我认为原始问题需要编辑以阐明这一点)。
msouth 2014年

76

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


它起作用了...但是为什么呢?MySQL 甚至在尝试连接之前都不会解析localhost并获得127.0.0.1响应吗?
Jaime Hablutzel 2014年

3
不,...使用localhost时,您未使用Internet套接字。您正在使用IPC套接字。en.wikipedia.org/wiki/Unix_domain_socket。127.0.0.1是本地环回,这意味着请求不会退出您的计算机,但它将使用TCP / IP,因此速度较慢...
Master Yogurt 2014年

也为我工作。我在ubuntu 14.04,hhvm和nginx上。
Maykonn 2015年

1
谢谢。这对我
有用,

当您通过ssh隧道连接到远程服务器时,这也是必要的
Tamm,2015年

51

我收到以下错误

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修复它。
克里斯·G

30

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


3
sudo service mysql start|restart对于Ubuntu。
Wtower '16

18

为防止出现此问题,必须从命令行正常关闭服务器,而不要关闭服务器电源。

shutdown -h now

这将在关闭计算机电源之前停止正在运行的服务。

在Centos的基础上,遇到此问题时可以再次备份的另一种方法是移动mysql.sock:

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

service mysqld start

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


14

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

尝试使用以下命令:

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

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


强制通过TCP / IP而不是使用套接字进行连接效率不高(并且按照前面的答案,您需要打开服务器中的localhost TCP / IP支持)。从2011年开始,可接受的答案更好:配置服务器,以便可以正确使用套接字。
Quentin

10
-p并不意味着端口,这意味着密码,你迷茫着它-P
昆廷-

这似乎或多或少是早先的答案
Quentin

对我来说,这只是定义正确的主机的问题: mysql -h 127.0.0.1 -u root -p
kghbln

12

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

例如,在Ubuntu上,您应该选中/var/log/syslog。由于许多其他事情也可能会记录到该文件,因此您可能想要使用grepmysql消息,并tail仅查看最新消息。总共看起来可能像这样:

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

不要盲目地更改配置,因为其他人会说“这对我的系统有用”。找出系统实际存在的问题,您将更快地获得更好的结果。


5
+1对于退后一步并指出许多其他答案甚至都没有考虑到的问题-真正地看到应用程序可能报告为问题的方法比盲目地进行并进行可能不会做出的更改要好得多甚至适用...!
SlySven

啊,所以用错了.cnf。这就解释了。现在,我可以停止尝试随机的事情并解决实际的问题。谢谢。
Synetech

11

另一个解决方法是编辑/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]部分,则建议添加
Cris

7

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

sudo服务mysql停止

sudo服务mysql启动

sudo服务apache2停止

sudo服务apache2启动


就我而言,mysql没有运行。我跑完sudo service mysql start后跑去sudo service mysql status确认它没有在跑。
塔斯(Tass)2014年

6

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

 /etc/init.d/mysqld start

所以..愚蠢的错误。


6

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

df -h

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



5
sudo service mysql start

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


systemctl start mariadb.service在Fedora 22或RedHat 7中。之后,可以设置root密码。
JuniorMayhé2015年

5

有很多解决此问题的方法,但是对于我来说,我只需要更正机器/服务器上的日期Ubuntu 16.04 Server)。

i)检查服务器的日期并进行更正。

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

那应该开始。


4

我收到错误消息是因为我正在运行MAMP,而我的.sock文件位于其他位置。我只是在应用程序认为应该指向它实际位置的地方添加了一个符号链接,它就像一个魅力一样工作。


如何在应用程序认为应该指向实际位置的位置添加符号链接?
Gilberto Ibarra 2015年

4

我还发现这是一个权限问题。我将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* 

4

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


3

如果您使用的是AWS(Amazon Web Services)微型版本,则是内存问题。我跑的时候

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):无法通过套接字/ var / run / mysqld / mysqld连接到本地MySQL服务器.sock'(111)“问题。谢谢@ jth_92!
Konaras '16

3

您始终可以通过使用以下--socket选项指定mysql.sock文件的位置来启动mysql服务器

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

即使套接字文件的位置在my.cnf文件中的其他位置中指定,此方法也将起作用。


3

对于那些解决方案不起作用的用户,请尝试:

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。没有远程连接。
斯蒂芬,

3

在尝试启动服务器时,我也遇到了这个问题,所以这里仅说启动服务器的许多答案都行不通。您可以做的第一件事是执行以下命令以查看是否存在任何配置错误:

/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

基于这个问题,接受的解决方案是行不通的,因为我甚至不能获得服务器开始,所以我遵循的一些评论说,并删除了我/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.

根据这里的建议,要解决此问题,我做了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
Juraj.Lorinc

2

新增中

--protocol=tcp 

与您的关系中的实用程序列表对我有用。



2

我今天遇到了这个问题。这些答案均未提供解决方案。我需要执行以下命令(可在此处找到https://stackoverflow.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的命令时出现。如果权限检查失败,它将报告磁盘已满(即使您的分区甚至没有接近满时)。


2

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

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

因此,在安装了客户端和服务器之后,我使用命令检查了MySQL是否正常运行(我认为我在重启之前已经重启),sudo service mysql status并且得到了结果。

正在运行MySQL(2601)[确定]

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

然后在mysql提示符下键入Enter输入以下命令以更改root的密码:

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

从那时起,一切正常。


1
服务器版本为RHEL6U6的情况相同:5.6.23-enterprise-commercial-advanced。
HCD


2

这不是直接回答您的问题,而是它的一部分,即使用PythonAnywhere。在寻找解决方案时,我一直在绊脚石,所以我在这里添加它,希望它对我所处的环境有所帮助。


PythonAnywhere决定更改数据库连接的主机名,以提高效率和可靠性,这里详细

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

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


2

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


1

我有这个套接字错误,它基本上可以归结为MySQL没有运行的事实。如果运行全新安装,请确保安装1)系统软件包和2)面板安装程序(mysql.prefPane)。面板安装程序将允许您进入系统偏好设置并打开MySQL,然后使实例运行。

请注意,在全新安装中,我需要重置计算机以使更改正确生效。重新启动后,我运行了一个新实例,并且能够毫无问题地打开与localhost的连接。

还要注意的是,我显然已经安装了以前的MySQL版本,但是删除了面板,这使得为Mac用户运行的MySQL实例很容易。

此重新安装过程的良好链接:http : //www.coolestguyplanettech.com/how-to-install-php-mysql-apache-on-os-x-10-6/

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.