mysqld.sock应该包含什么,为什么我没有呢?


22

有谁知道为什么/var/run/mysqld/mysqld.sock在我安装(或重新安装)MySQL 5.1时为什么我的套接字文件不在我的计算机上?

现在,当我尝试使用mysqld启动服务器时,出现类似的错误Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect,但是用该名称创建一个空白文件(如ubuntu论坛上所建议的)是不成功的。

在不久前升级到natty之前,我的mysql和postgres都运行良好。我花了几个小时浏览这两个数据库,以弄清楚发生了什么。我可以放弃postgres,但是如果没有mysql的工作副本就无法工作。

最奇怪的部分:我使用Kubuntu,我的理解是KDE使用mysql存储用户权限等。我没有遇到任何奇怪的权限问题;我可以这样表示MySQL(实际上以某种方式工作)吗?

也许这些套接字文件位于natty中的不同位置?重新安装os新鲜会更容易吗?在这一点上,我愿意接受任何建议,以免浪费时间。


您需要先启动mysql服务器,然后再/var/run/mysqld/mysqld.sock创建该文件。就像@Paul所说的那样,您必须删除放置在该位置的所有文件。
Evan Hu

Answers:


18

套接字文件实际上并不包含数据,而是传输数据。它是通过特殊的系统调用/命令创建的一种特殊的,异常的文件类型。它不是普通文件。

就像服务器和客户端可以用来连接和交换请求和数据的管道一样。另外,它仅在本地使用。它的意义仅仅是作为文件系统中一个约定的集合位置。

创建一个普通的旧文件并将其放置在该位置实际上可能会干扰创建它的服务器...,从而阻止本地客户端连接到服务器。

我的建议是删除放置在该位置的所有文件。特殊套接字文件由服务器创建。


1
感谢您对套接字文件的解释,并为措辞不佳的问题感到抱歉:我的原始问题是套接字文件丢失了Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect
-mysql

但是它是如何创建的?因为我还没有呢..:-有什么主意吗?
jpganz18年

您可能有一个mysql客户端,期望该套接字位于该位置,但服务器未在该位置创建套接字(或服务器未在运行)。如果服务器正在运行,请在/ tmp中查找或使用find或定位到找到套接字文件,然后使用-S <套接字文件路径>启动mysql客户端
sed_and_done 2015年

20

当您指定时host=localhost,mysql客户端将尝试使用需要.sock文件的unix命名管道登录mysql服务器。

可以通过指定host = 127.0.0.1。来绕过它。这将使mysql客户端使用TCP连接到服务器。

取自MySQL的文档

mysql --host=127.0.0.1 --port=3306 --user=your_uname --password=your_pass

实际上,这是一个绝妙的(也是非常需要的)答案,因为从历史上看,在我使用过的mysql.sock每个MySQL版本(回到4.0)中,我都没有充分的理由看到这种消失。发生这种情况时,我会像这样登录,但我使用--protocol=tcp而不是--port。当您关闭mysql时,服务会寻找套接字文件。因此,运行service mysql stop将失败。为了解决套接字文件丢失的头痛问题,我运行mysqladmin -h127.0.0.1 --protocol=tcp -uroot -p shutdown。哦,顺便说一句,+ 1!
RolandoMySQLDBA

谢谢。这是我在线上任何地方的第一个答案:)是的。使用TCP的另一种方法是通过指定--protocol = tcp。
sccott

14

套接字是一种特殊的伪文件,用于通过读写进行数据传输,而不是数据存储。

套接字文件在服务启动时创建,在服务终止时删除。文件的位置定义/etc/my.cnf如下:

[mysqld]
socket=/var/run/mysql/mysql.sock

8

就我而言,运行mysqld_safe创建了一个新mysqld.sock文件。

$ cd /etc/init.d/
$ mysqld_safe

您可能不会得到提示,但如果重新启动会话,则mysqld.sock文件将位于某个位置。用找到

$ sudo find / -type s | grep mysqld.sock

2

缺少mysqld.sock,我遇到了同样的问题。我进入了包含mysql的目录,/usr/bin就我而言。然后我发出了命令

mysql mysql --host=localhost --password=whatever --port=3306

双重mysql不是错字,而是mysql是一个在新的MySQL安装中将始终存在的数据库。我不知道--host--password或者--port是需要的,但因为它使用这些参数我包括他们为我工作。MySQL启动后,我进入用户表,设置root密码。一旦MySQL启动,就会创建丢失的套接字文件。自从我奋斗了几天以来,我希望这对某人有帮助。


1

如果您使用的是nginx php-fastcgi,但收到502 Bad Gateway错误,则必须查看nginx配置文件上的虚拟主机配置。您必须设置或更正fastcgi_pass参数。the fastcgi_pass是用于设置nginx和php CGI之间的套接字连接的变量。

另一个问题是二进制启动脚本可能会丢失以下(重要)打开的条目: nano /usr/bin/php-fastcgi

SOCKET=/var/run/php-fastcgi/php-fastcgi.socket
PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid

我的入门脚本/ usr / bin / php-fastcgi的完整内容:

#!/bin/bash

FASTCGI_USER=www-data
FASTCGI_GROUP=www-data
SOCKET=/var/run/php-fastcgi/php-fastcgi.socket
PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid
CHILDREN=6
PHP5=/usr/bin/php5-cgi

/usr/bin/spawn-fcgi -s $SOCKET -P $PIDFILE -C $CHILDREN -u $FASTCGI_USER -g $FASTCGI_GROUP -f $PHP5
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.