mysql sock 文件解析及作用讲解


Posted in MySQL onJuly 15, 2022

引言

在观察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代表该文件内容为空。

当我们使用localhostmysql命令 -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 sock 文件解析及作用的详细内容,更多关于mysql sock 文件解析的资料请关注三水点靠木其它相关文章!


Tags in this post...

MySQL 相关文章推荐
详解Mysql 函数调用优化
Apr 07 MySQL
MySQL 表空间碎片的概念及相关问题解决
May 07 MySQL
MySQL 重写查询语句的三种策略
May 10 MySQL
MYSQL数据库使用UTF-8中文编码乱码的解决办法
May 26 MySQL
MySQL千万级数据表的优化实战记录
Aug 04 MySQL
mysql timestamp比较查询遇到的坑及解决
Nov 27 MySQL
深入讲解数据库中Decimal类型的使用以及实现方法
Feb 15 MySQL
MySQL中B树索引和B+树索引的区别详解
Mar 03 MySQL
mysql insert 存在即不插入语法说明
Mar 25 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
Apr 26 MySQL
MySQL中EXPLAIN语句及用法
May 20 MySQL
mysqldump进行数据备份详解
Jul 15 #MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
Jul 15 #MySQL
MySQL事务的隔离级别详情
Jul 15 #MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 #MySQL
MySQL的意向共享锁、意向排它锁和死锁
Jul 15 #MySQL
Mysql数据库group by原理详解
delete in子查询不走索引问题分析
Jul 07 #MySQL
You might like
真正面向对象编程:PHP5.01发布
2006/10/09 PHP
php date与gmdate的获取日期的区别
2010/02/08 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
2015/11/05 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
新页面打开实际尺寸的图片
2006/08/25 Javascript
十分钟打造AutoComplete自动完成效果代码
2009/12/26 Javascript
JQuery 插件制作实践 xMarquee插件V1.0
2010/04/02 Javascript
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
JavaScript常用正则函数用法示例
2017/01/23 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
JS使用百度地图API自动获取地址和经纬度操作示例
2019/04/16 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
[02:46]2014DOTA2国际邀请赛 选手为你解读比赛MVP充满梦想
2014/07/09 DOTA
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
python实现批量图片格式转换
2020/06/16 Python
Django打印出在数据库中执行的语句问题
2019/07/25 Python
关于ResNeXt网络的pytorch实现
2020/01/14 Python
Django获取model中的字段名和字段的verbose_name方式
2020/05/19 Python
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
几个人围成一圈的问题
2013/09/26 面试题
如何开启linux的ssh服务
2013/06/03 面试题
实习生的自我评价
2014/01/08 职场文书
工商管理自荐书
2014/07/06 职场文书
就业协议书范本
2014/10/08 职场文书
公积金具结保证书
2015/05/11 职场文书
2015年党总支工作总结
2015/05/25 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书
MySQL优化及索引解析
2022/03/17 MySQL