mysql sock 文件解析及作用讲解

目录
  • 引言
  • 连接MySQL
  • mysql.sock文件
  • mysql.sock文件的作用
  • 数据库运维:mysql.sock错误修复

引言

在观察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技术内幕 InnoDB存储引擎第2版 1.5节 连接MySQL:

https://www.jb51.net/books/598536.html

mysql.sock文件详解:https://www.jb51.net/article/93285.htm

以上就是mysql sock 文件解析及作用的详细内容,更多关于mysql sock 文件解析的资料请关注我们其它相关文章!

(0)

相关推荐

  • mysql sock文件存储了什么信息

    mysql.sock到底存储了什么东西? mysql.sock作为mysql的套接字一般用于本地连接数据库,在速度上优于TCP/IP连接.一般放置在/tmp/mysql.sock目录下,我们先查看下它的内容: [root@ tmp]# ll -i | grep mysql 85 srwxrwxrwx 1 mysql mysql 0 Apr 18 15:03 mysql.sock 可以看到它的内容大小为0,即没有存储任何的内容,此时我们通过mysql -uroot -p来访问(即默认的-h loc

  • 如何避免mysql启动时错误及sock文件作用分析

    在mysql的启动过程中有时会遇到下述错误 Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 请问mysql.sock 这个文件到底起什么作用? 如何避免发生如此错误? 答案一. 这个mysql.sock应该是mysql的主机和客户机在同一host(物理服务器)上的时候,使用unix domain socket做为通讯协议的载体,它比tcp快.通常遇到这个问题的原因就是你的mysql server没运

  • mysql socket文件作用详解

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,一般在配置部署mysql环境时都会在mysql的my.cnf文件中[mysqld]栈下添加上socket文件的路径,而这样做的好处是如果启用了多实例mysql时,可以通过socket文件来快速的登录mysql对应不同端口下的实例,如在一台有部署2个实例的mysql服务一个是用3306,一个是用3307端口,那么就可以通过2个不同的socket文件快速的登录 mysql -uroot -p --socket=

  • MySQL HandlerSocket插件安装配置教程

    一.HandlerSocket是什么?HandlerSocket是akira higuchi写的一个MySQL的插件.以MySQL Daemon Plugin的形式提供类似NoSQL的网络服务,通过这个插件,你可以直接跟MySQL后端的存储引擎做key-value式的交互,省去了MySQL上层的SQL解释.打开关闭表.创建查询计划等CPU开销. 目前使用MySQL的网站,多半同时使用Memcache作为键值缓存.虽然这样的架构极其流行,有众多成功的案例,但过于依赖Memcache,无形中让Mem

  • 详解MySQL中的pid与socket

    socket文件:当用Unix域套接字方式进行连接时需要的文件. pid文件:MySQL实例的进程ID文件. 1.pid-file介绍 MySQL 中的 pid 文件记录的是当前 mysqld 进程的 pid ,pid 亦即 Process ID .可以通过 pid-file 参数来配置 pid 文件路径及文件名,如果未指定此变量,则 pid 文件默认名为 host_name.pid ,存放的路径默认放在 MySQL 的数据目录. 建议指定 pid 文件名及路径,pid 目录权限要对 mysql

  • 深入解析mysql.sock不见的问题

    之前在网上看过好多关于mysql.sock不见的问题,并没有关注这个东西存在的意义,直到自己的mysql也出现了相同的问题.让人纠结了一把-- 复制代码 代码如下: zhouqian@zhou:~$ mysqlERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 网上好多的解决办法,可是每个人的实际情况不同,我也是把上面所有人的方法实验了一个

  • 解决xampp自启动和mysql.sock问题

    装了ubuntu好长一段时间了,都没去用,国庆的时候折腾了下,配置了一些基本的开发环境,一上手就感觉喜欢上了ubuntu,说不上为什么.为了搞本地的测试php测试环境而装了xampp,安装超简单,但是我发现它没有自启动.解决办法也很简单,通过下面的命令打开启动的资源文件: 复制代码 代码如下: x@zst:~$ cd /etc/init.d x@zst:/etc/init.d$ sudo gedit rc.local 在启动文件里加入一行代码: 复制代码 代码如下: /opt/lampp/lam

  • mysql sock 文件解析及作用讲解

    目录 引言 连接MySQL mysql.sock文件 mysql.sock文件的作用 数据库运维:mysql.sock错误修复 引言 在观察MySQL本地连接的时候,发现对mysql.sock是个啥我不明白,于是我提出了一个问题:mysql.sock到底存了什么信息? 根据多方查资料和自我思考,我有了自己的一些认识和结论,但结论并不一定正确,欢迎大家指教. 连接MySQL 连接MySQL的操作实际上是启动一个连接进程和MySQL数据库实例进行通信,本质上属于进程间通信,而进程通信的方式有管道.命

  • 读取本地json文件,解析json(实例讲解)

    模拟用户登录 # data.json 文件同目录下 [ { "id": 1, "username": "zhangshan", "password": "123qwe", "lock": false }, { "id": 2, "username": "lisi", "password": "123

  • MySQL关于sql_mode解析与设置讲解

    昨晚在往MySQL数据库中插入一组数据时,出错了!数据库无情了给我报了个错误:ERROR 1365(22012):Division by 0:意思是说:你不可以往数据库中插入一个 除数为0的运算的结果.于是乎去谷歌了一番,总算是明白了其中的原因:是因为MySQL的sql_mode 模式限制着一些所谓的'不合法'的操作. 解析 这个sql_mode,简而言之就是:它定义了你MySQL应该支持的sql语法,对数据的校验等等.. 如何查看当前数据库使用的sql_mode: mysql> select

  • ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'

    错误信息: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 出现问题原因: 有可能是 my.cnf 配置文件中设置了 [mysqld] 的参数 socket ,而没有设置[client]的参数socket mysql.sock 文件有什么用: mysql 支持 socket 和 TCP/IP 连接.那么 mysql.sock 这个文件有什么用呢?连接local

  • MySQL数据库主从复制原理及作用分析

    目录 1.数据库主从分类: 2.mysql主从介绍由来 3.主从作用 4.主从复制原理 5.主从复制配置(数据一致时) 5.1主从服务器分别安装mysql5.7 5.2主数据库与从数据库数据一致 5.3在主数据库里创建一个同步账号授权给从数据库使用 5.4在从库上测试连接 5.5配置主数据库 5.6配置从数据库 5.7配置并启动主从复制的功能(mysql02从数据库上) 5.8测试: 主库: 从库: 主库创建数据库clq并且加入数据: 从库中查看: 6.主从配置(数据不一致时) 6.1一般全备主

  • mysql IS NULL使用索引案例讲解

    简介 mysql的sql查询语句中使用is null.is not null.!=对索引并没有任何影响,并不会因为where条件中使用了is null.is not null.!=这些判断条件导致索引失效而全表扫描. mysql官方文档也已经明确说明is null并不会影响索引的使用. MySQL can perform the same optimization on col_name IS NULL that it can use for col_name = constant_value.

  • nginx 集成lua操作mysql的过程解析

    目录 前言 实现思路 ngx_lua模块概念 OpenRestry安装步骤 1.下载OpenRestry 2.解压缩文件 3.进入OpenResty目录执行配置 4. 执行命令:make && make install 5.进入OpenResty的目录配置nginx 6.启动nginx并测试 ngx_lua常用指令 代码实现 lua操作redis lua-resty-redis环境准备 lua-resty-redis常用API ngx_lua操作Mysql lua-resty-mysql

随机推荐