mysql sock 文件解析及作用讲解
作者:赵帅强 发布时间:2024-01-26 13:15:47
引言
在观察MySQL
本地连接的时候,发现对mysql.sock
是个啥我不明白,于是我提出了一个问题:mysql.sock到底存了什么信息?
根据多方查资料和自我思考,我有了自己的一些认识和结论,但结论并不一定正确,欢迎大家指教。
连接MySQL
连接MySQL
的操作实际上是启动一个连接进程和MySQL
数据库实例进行通信,本质上属于进程间通信,而进程通信的方式有管道、命名管道、命名字、TCP/IP
套接字、UNIX
套接字。MySQL
数据库提供的方式有3种:
TCP/IP
套接字方式命名管道和共享内存(
Windows
平 * 有)UNIX
套接字(UNIX
平 * 有)
TCP/IP
套接字方式是MySQL
数据库在任何平台都提供的连接方式,一般用于客户端和服务端不在同一台服务器上,基于网络的远程连接请求。
笔者使用的是UNIX
服务器,所以不了解Windows
相关的内容,在使用UNIX
域套接字时,一般用于客户端和服务端在同一台服务器上的情况,而该套接字并不是一个网络协议,只是用于同机器连接通讯的载体。
mysql.sock文件
我们可以在配置文件my.cnf
中指定套接字文件的路径:
[mysqld]
socket = /tmp/mysql.sock
也可以在启动时指定socket
文件的路径:
# 以下两种均可
./mysqld_safe --socket=/tmp/mysql.sock
./mysqld_safe -S /tmp/mysql.sock
在启动MySQL
之后我们可以查询socket
文件的路径:
mysql> show variables like 'socket';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| socket | /tmp/mysql.sock |
+---------------+-----------------+
1 row in set (0.00 sec)
mysql.sock文件的作用
这个套接字文件在我们启动MySQL
后会自动在我们指定的路径被创建:
[work@ work]$ ll /tmp | grep mysql.sock
srwxrwxrwx 1 mysql mysql 0 Aug 21 20:49 mysql.sock
可以看到该文件被刚刚创建,并且文件类型's'
代表socket
套接字类型。同时0
代表该文件内容为空。
当我们使用localhost
(mysql
命令 -h
参数的缺省值)连接本地数据库时,因为无法使用TCP/IP
协议监听端口的请求和数据,我们需要使用该socket
文件来进行你启动的连接进程和MySQL
实例进程的进程间通信,即通讯协议的载体。如果我们删除了该文件,当你再次连接本地数据库时会报错:
[root@ work]# mysql -uroot -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
此时,我们新建一个socket
文件,并且修改权限和拥有者,同时再次发起数据库连接是依然会报错,不过是不一样的错误:
# 新建的为mysql.sock,原有的改名为mysql.sock.bak
mv mysql.sock mysql.sock.bak
# 创建新的mysql socket文件
mksock mysql.sock
chown mysql:mysql mysql.sock
chmod 777 mysql.sock
# 展示对比两个mysql.sock
[root@ tmp]# ll -i | grep mysql
85 srwxrwxrwx 1 mysql mysql 0 Apr 18 15:03 mysql.sock.bak
37 srwxrwxrwx 1 mysql mysql 0 Aug 20 20:35 mysql.sock
# 再次发起连接
[root@ tmp]# mysql -uroot -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
可以看出除了inode
不同之外其他的信息全部一样,而且内容都是空的,为什么就不能使用呢?
以下原因为个人推测,实际的原因需要看linux对socket文件的实现,每个socket肯定有属性的不同。
原因是由于mysql.sock
是每一次MySQL
启动之后生成的,该socket
文件会监听创建它的进程,此处即本机的mysqld
进程,用于其与MySQL
实例进程通信,如果你关闭了mysqld
进程,该文件会被自动删除。而你新建的socket
文件只是虚有其表,并没有监听任何的IP
和端口以及进程PID
,所以自然不能与MySQL
实例通信了。所以如果你删掉了这个文件,只能杀死mysqld
进程并重启,因为此时你给MySQL
实例发送关闭信号的通道也没有了(当然此时你可以走TCP/IP
通信的方法)。
为了证明我的猜测,做了一些测试:
保留
mysql.sock
,杀死进程并重启MySQL
,复用该socket
,依然无法通信,证明非仅仅简单监听本地端口。tail -f mysql.sock
,由于socket
只能通过进程间通信使用,所以不能通过open()
方法打开,报错无法打开该文件,因此无法观察到是怎么通过该socket
进行进程间通信的。
数据库运维:mysql.sock错误修复
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
问题根源:mysql.sock
文件找不到了
问题场景:一般为该文件被误删,或者PHP
等后端指定的该socket
文件地址路径不对
解决方案:
1 . 重启
ps -auxf | grep mysql
kill -SIGKILL pid(找到指定的mysql进程pid)
./mysqld_safe
2 . 使用locate mysql.sock
定位,同时重启:./mysqld_safe -S /path/to/mysql.sock
3 . 在php
等配置文件(如php.ini
)中修改指定该socket
的配置地址
pdo_mysql.default_socket = /path/to/mysql.sock
mysql.default_socket = /path/to/mysql.sock
mysqli.default_socket = /path/to/mysql.sock
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
问题根源:mysql.sock
文件无法通信
问题场景:一般为该mysql.sock
文件内容不符合通信的需要
解决方案:跟上面的(2)
错误本质上一样,解决方案也一样
参考资料
MySQL技术内幕 InnoDB存储引擎第2版 1.5节 连接MySQL:
https://www.jb51.net/books/598536.html
mysql.sock文件详解:https://www.jb51.net/article/93285.htm
来源:https://segmentfault.com/a/1190000016098820


猜你喜欢
- 导语泡泡王国 欢乐多多咕噜噜,吹泡泡,七彩泡泡满天飘。大的好像彩气球,小的就像紫葡萄。当泡泡漫天飞舞时,大朋友、小朋友都会情不自禁地被它吸引
- 今天学到了如何使用Python的smtplib库发送邮件,中间也是遇到了各种各样的错误和困难,还好都一一的解决了。下面来谈一谈我的这段经历。
- 要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面是否已存在。在这里使用一个cache存放已
- 一 计算公式:二 实现代码(1)import mathfrom tqdm import tqdmimport timetotal,s,n,t
- 基础理论第一层:卷积层。第二层:卷积层。第三层:全连接层。第四层:输出层。图中原始的手写数字的图片是一张 28×28 的图片,并且是黑白的,
- 客户的一台服务器出现Raid故障,经过我们的努力,数据基本恢复成功,但是其中的一个SQL Server日志文件(扩展名LDF)损坏严重,基本
- 使用scipy.optimize模块的root和fsolve函数进行数值求解线性及非线性方程,下面直接贴上代码,代码很简单from scip
- 如何加点盐(salt)?为了加强MD5的安全性,从而加入了新的算法部分即加盐值,加盐值是随机生成的一组字符串,可以包括随机的大小写字母、数字
- 前言文章包括下几点:考点--操作SQLite数据库:创建SQLite数据库;向表中插入记录;其他数据库操作。面试题:1.面试题一:如何创建S
- 上次我重新修改了UBB的转换后,又很多朋友反映日文显示的时候出错了。我在本地测试了一下,结果出现了 Invalid procedure ca
- 合成微缩效果前言图像中的模糊效果可以强烈影响被拍摄场景的感知,模糊在传达所需的尺寸和距离感方面起着重要作用。合成微缩 (miniature
- 一 domain层介绍说明domain层专注于数据库数据领域开发,我们把数据库相关操作全部写在domain层。model层:数据表字段定义与
- 对于日期的操作可以说是比较常见的case了,日期与格式化字符串互转,日期与时间戳互转,日期的加减操作等,下面主要介绍下常见的需求场景如何实现
- Application Name(应用程序名称):应用程序的名称。如果没有被指定的话,它的值为.NET SqlClient Data Pro
- 环境Laravel 5.4原理在Laravel中,门面为应用服务容器中绑定的类提供了一个“静态”接口
- 目录1. 什么是turtle2. turtle例子3. 其他turtle功能4. 更多的例子5. 总结6. 参考资料1. 什么是turtle
- 德州扑克简要介绍什么是德州扑克德州扑克不知道大家是否玩过,它是起源于美国的得克萨斯州的一种博弈类卡牌游戏,英文名叫做Texas Hold&a
- 1.预备知识python语言,scrapy爬虫基础,json模块,flask后端2.抓取CSDN数据接口使用谷歌抓包工具抓取CSDN搜索引擎
- 安装Python环境ANACONDA是一个Python的发行版本,包含了400多个Python最常用的库,其中就包括了数据分析中需要经常使用
- 引言:在微信小程序里,比如商品展示页面的商品详情会有图片展示,PC端设置的商品详情是PC端的宽度,所以在小程序里图片会显示不全,这时就应该做