当前位置: 首页 > 后端技术 > PHP

mysql.sock文件分析

时间:2023-03-30 00:41:11 PHP

在观察本地MySQL连接的时候,发现自己没看懂mysql.sock是什么东西,于是问了一个问题:mysql.sock存储的是什么信息?基于多方资料和自我思考,我得出了一些理解和结论,但结论不一定正确,欢迎大家指教。连接MySQL的操作实际上是启动一个连接进程与MySQL数据库实例进行通信,本质上是进程间通信,进程通信方式包括管道、命名管道、命名名称、TCP/IP套接字和UNIX插座。捡起。MySQL数据库提供了三种方法:TCP/IPsocketnamedpipeandsharedmemory(Windows平台独有)UNIXsocket(UNIX平台独有)TCP/IPsocket是任何平台上的MySQL数据库两者提供的连接方式一般是用于客户端和服务器不在同一台服务器上的基于网络的远程连接请求。笔者使用的是UNIX服务器,所以对Windows相关的内容不了解。使用UNIX域套接字时,一般在客户端和服务器在同一台服务器上,且套接字不是网络协议的情况下使用,只是与机器连接和通信的载体。mysql.sock文件我们可以在配置文件my.cnf中指定socket文件的路径:[mysqld]socket=/tmp/mysql.sock也可以在启动时指定socket文件的路径:#下面两个都可以./mysqld_safe--socket=/tmp/mysql.sock./mysqld_safe-S/tmp/mysql.sock启动MySQL后,我们可以查询socket文件的路径:mysql>showvariableslike'socket';+---------------+----------------+|变量名|值|+----------------+----------------+|插座|/tmp/mysql.sock|+----------------+------------------+1rowinset(0.00sec)mysql.sock的作用file这个socket文件会在我们启动MySQL后在我们指定的路径下自动创建:[work@work]$ll/tmp|grepmysql.socksrwxrwxrwx1mysqlmysql0Aug2120:49mysql.sock可以看到刚刚创建了文件,文件类型's'代表socket套接字类型。同时,0表示文件内容为空。当我们使用localhost(mysql命令-h参数的默认值)连接本地数据库时,由于TCP/IP协议无法监听端口的请求和数据,所以需要使用这个socket文件进行连接进程与你启动的MySQL实例进程的进程间通信是通信协议的载体。如果我们删除这个文件,再次连接本地数据库会报错:[root@work]#mysql-uroot-pERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/tmp/mysql.sock'(2)此时我们新建一个socket文件,修改权限和owner,同时再次发起数据库连接,还是会报错,但是是不同的错误:#新建的是mysql.sock,原来的改名为mysql.sock.bakmvmysql.sockmysql.sock.bak#新建一个mysqlsocket文件mksockmysql.sockchownmysql:mysqlmysql.sockchmod777mysql.sock#显示并比较两个mysql.sock[root@tmp]#ll-i|grepmysql85srwxrwxrwx1mysqlmysql0Apr1815:03mysql.sock.bak37srwxrwxrwx1mysqlmysql0Aug2020:35mysql.sock#再次发起连接[root@tmp]#mysql-uroot-pERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/tmp/mysql.sock'(111)可以看到除了inode不同,其他信息都是一样的,而且内容是空的,为什么不能是用呢子布吗?以下原因均为个人推测。实际原因取决于Linux对套接字文件的实现。每个套接字必须具有不同的属性。原因是每次启动MySQL时都会生成mysql.sock。套接字文件将监视创建它的进程。这里是本地的mysqld进程,用于与MySQL实例进程进行通信。如果关闭mysqld进程,该文件会自动删除。而你新建的socket文件是假的,没有监听任何IP、端口和进程PID,自然无法和MySQL实例通信。所以如果你删除这个文件,你只能杀掉mysqld进程并重启,因为这时候你给MySQL实例发送关闭信号的通道已经没有了(当然你可以使用TCP/IP通信此时的方法)。为了证明我的猜测,我做了一些测试:保留mysql.sock,杀掉进程重启MySQL,重用socket,还是不能通信,证明不是简单的监听本地端口。tail-fmysql.sock,由于socket只能通过进程间通信使用,无法通过open()方法打开,无法打开文件报错,无法观察inter如何-进程通信是通过套接字进行的。数据库运维:mysql.sock错误修复ERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/tmp/mysql.sock'(2)问题根本原因:mysql.sock文件无法访问发现问题场景:一般文件被误删除,或者PHP等后端指定的socket文件地址路径不正确。解决方法:1、重启ps-auxf|grepmysqlkill-SIGKILLpid(查找指定mysql进程pid)./mysqld_safe2.使用locate定位到mysql.sock,同时重启:./mysqld_safe-S/path/to/mysql.sock3。修改php和其他配置文件(如php.ini)中指定socket的配置地址/to/mysql.sockERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/tmp/mysql.sock'(111)问题根本原因:mysql.sock文件无法通信问题场景:一般,mysql.sock文件内容不满足通信需要解决方法:该错误与上述(2)错误本质相同,解决方法也一样。内幕InnoDB存储引擎版本2第1.5节连接MySQLmysql.sock文件详解:https://blog.csdn.net/kerwin6...

最新推荐
猜你喜欢