倚楼听风雨
淡看江湖路

如何彻底解决mysql.sock(Can't connect to local MySQL server through)丢失的问题?非网上各种瞎哔哔的解决方式

想必搞MySQL的,在服务器上搞过MySQL的同仁都遇到过这个类似于"Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'(2);"(路径也有可能是"Can't connect to local MySQL server through socket '/temp/mysql.sock'(2);")令人脑瓜子嗡嗡的问题。你可能查了百度无数遍,各路大神都特么不知道都在瞎哔哔一些什么乱码七糟的,什么硬盘满了,什么my.cnf里面的sock文件路径配置的不正确了,还有诸如重启就好了、修改乱七八糟这个那个文件的权限这种完全XX(你懂的)这类的办法。

mysql.sock(Can't connect to local MySQL server through)丢失的问题终极解决方案

甚至你也谷歌了,但是依然治标不治本,老四也被这个问题折磨了半年多了,之前懒得管他,每次遇到这个问题直接重启服务器就好了,但是现在不行了,我发现这破玩意现在越来越猖獗了,索性研究了一下,弄出点稍微有效长久的解决办法,本着分享交流的精神,与诸君共享,由于老四也不是什么大神,解决方式并不一定最好的,但是思路最起码是正确的。废话说完,开始。

一、基本知识回顾:

MySQL客户端连接方式:

我们无论通过什么样的客户端连接MySQL,其实都是与MySQL数据库实例进行通信的一个过程,所以通信方式有很多,包括但不限于以下这些:

  1. 管道
  2. 命名管道
  3. 命名字
  4. TCP/IP
  5. UNIX套接字

二、mysql.sock文件丢失问题的根源

好,前方高能,请注意,问题来了。在MySQL服务器本机上我们连接数据库时,经常会出现mysql.sock不存在的现象,mysql会打印出上面提及到的"Can 't connect to local MySQL server through socket '/temp/mysql.sock'(2);",我告诉你,无论你怎么折腾,你把这个mysql.sock文件设置在无论哪个目录下面都避免不了这个套接字文件会因为各种原因被删除。

注意: 本次探讨的问题仅限于在linux系统MySQL的环境问题处理,不包括windows,windows版本中的MySQL其实没有UNIX套接字这种通信的。

这是为啥呢,老四也不知道为啥,不知道这个套接字文件为什么总被删除,这是为啥呢,老四也不知道为啥,不知道这个套接字文件为什么总被删除。但是我们能知道的就是肯定MySQL数据库出毛病了,所以我们首先一定要找到MySQL崩溃是因为什么。首先我们在服务器中查看MySQL日志(仅限老四遇到的情况,实际情况你遇到的可能跟老四不一样,老四的MySQL使用rpm安装5.6.40版本):

日志不用我多说了,大致的意思就是mysql的InnoDB存储引擎的缓存池需要64MB的内存,但是系统已经没有那么多了给不了,然后MySQL的防御机制就直接crash掉,这个crash并不是MySQL自身杀死自己,MySQL还活着,但是就在这个防御过程中把mysql.sock给删掉了,删掉了他重新尝试创建这个mysql.sock文件但是没能成功,然后就死死地在,那里无法提供服务,随之你的环境就宕机了。

所以,首先这个问题需要我们先手解决,除了你加大你服务器的内存之外,也可以将MySQL的InnoDB设置的小一些。/etc/my.cnf文件里面有一个innodb_buffer_pool_size属性配置,默认是注释掉的,老四的虚拟机上测试1G内存innodb_buffer_pool_size默认会占用128M的内存空间,所以为了防止崩溃你可以打开该注释项,改成64M甚至32M,形如"innodb_buffer_pool_size = 64M"。

接下来再说为什么会有这个套接字文件的原因。mysql.sock的生成就是因为我们指定了localhost作为了我们连接数据库的主机名,MySQL一看你用的是localhost,他就默认使用UNIX套接字文件连接,这个文件就是这个mysql.sock,就不会使用TCP/IP的连接方式了。

按理说,其实我们连接一台数据库服务器,是要跟数据库服务器通信的,一般都是通过TCP/IP连接的,包括企业级开发等。但是我们日常中也大量存在这种案例,项目和MySQL数据库在同一台机器上面,或是开发,或是站长上线的小网站,初期网站建设九尾MySQL单独设置一台独立的服务器或者是直接上MySQL的云服务闲心大多数人也是不愿意牺牲这样的财力的,所以这样的一批人群就总会遇到这种问题。

三、找到根源,避免问题再次发生

前面我们已经找到原因了,但是我们找不到mysql.sock总会莫名其妙的被删除的原因,所以换个思路来解决问题--那就是在MySQL服务器本机上连接MySQL不使用localhost这种UNIX套接字的方式来访问数据库。怎么办呢?如果你的知识丰富,相信你是知道如果在项目中配置MySQL的服务器地址的时候不配置localhost而是配置127.0.0.1的话,后者是用TCP/IP的形式来访问MySQL数据库的,但是,可但是,多半我们这样做的时候其实问题还没有解决,你会发现他走的还是UNIX套接字。

这里我们需要简单的作进一步的处理,在MySQL数据库中的mysql库中有一张user表,这个user表的存储记录是有顺序的,所以当我们只是单纯的设置HOST为127.0.0.1的时候,MySQL会默认读取到他是属于localhost本地连接,然后它就给你转换了,就再一次避开了TCP/IP连接,所以我们要改变数据库中localhost和127.0.0.1的位置,将127.0.0.1放在记录行的前面就好了。如下图:

mysql数据库中配置本地连接localhost非unix套接字连接的解决方案-高老四博客

我已经说的很清楚了,老四亲测这种方式对于项目来说很稳定,那个mysql.sock就让他爱咋咋地吧,再也不用因为它而烦心了。

多说一嘴,其实打开MySQL的skip-name-resolve属性也会达到同样的效果,这个属性要求链接MySQL必须使用域名或者IP地址,禁止你使用localhost做解析,然后他会做DNS反查,但是弊端就是当访问量上来的时候泛解析会影响性能,如果愿意使用这种凡事可以直接在my.cnf中开启此属性即可。

最后附赠一条sql(在linux下使用TCP/IP协议链接MySQL客户端):

这样写,即使你使用localhost他也是用TCP进行通信,不信的你可以在自己的linux服务器中吧mysql.sock删除试一下,照样连接成功!

问题解决了,十分开心,故做此记录,望各位大佬不吝批评指导,共同交流。

更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请赞助盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额,老四这里抱拳了。赞助时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的赞赏钱财也会被用于小站的服务器运维上面,再次抱拳。

赞(21) 给你买杜蕾斯
本站原创文章受自媒体平台原创保护,未经允许不得转载高老四博客 » 如何彻底解决mysql.sock(Can't connect to local MySQL server through)丢失的问题?非网上各种瞎哔哔的解决方式
分享到: 更多 (0)

开始你的表演 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下老四,鼓励我更好的创作

支付宝扫一扫打赏

微信扫一扫打赏