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 相关文章推荐
JDBC连接的六步实例代码(与mysql连接)
May 12 MySQL
正确使用MySQL INSERT INTO语句
May 26 MySQL
mysql 带多个条件的查询方式
Jun 05 MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 MySQL
彻底解决MySQL使用中文乱码的方法
Jan 22 MySQL
MySQL Server层四个日志的实现
Mar 31 MySQL
Innodb存储引擎中的后台线程详解
Apr 03 MySQL
MySQL时区造成时差问题
Apr 13 MySQL
使用Mysql计算地址的经纬度距离和实时位置信息
Apr 29 MySQL
关于mysql中string和number的转换问题
Jun 14 MySQL
MySQL慢查询中的commit慢和binlog中慢事务的区别
Jun 16 MySQL
delete in子查询不走索引问题分析
Jul 07 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
关于PHP模板Smarty的初级使用方法以及心得分享
2013/06/21 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
构造函数+原型模式构造js自定义对象(最通用)
2014/05/12 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
jquery实现简单的瀑布流布局
2016/12/11 Javascript
用JavaScript和jQuery实现瀑布流
2017/03/19 Javascript
Vue中img的src属性绑定与static文件夹实例
2017/05/18 Javascript
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
javaScript实现复选框全选反选事件详解
2020/11/20 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
js中位数不足自动补位扩展padLeft、padRight实现代码
2020/04/06 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
浅谈Django REST Framework限速
2017/12/12 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
Pytorch中实现只导入部分模型参数的方式
2020/01/02 Python
python生成任意频率正弦波方式
2020/02/25 Python
python 基于wx实现音乐播放
2020/11/24 Python
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
安全大检查实施方案
2014/02/22 职场文书
文明社区申报材料
2014/08/21 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
创业计划书之服装
2019/10/07 职场文书
关于Redis的主从复制及哨兵问题
2022/06/16 Redis