最近接手了公司的一个软件项目,通过打印日志,发现该软件会偶发出现连接MySQL数据库失败的问题。
首先排查是否是网络问题导致的连接失败。对该软件和MySQL的3306端口进行抓包,发现连接数据库失败时并没有出现tcp三次握手失败的情况。并且该软件和MySQL是部署在同一台CentOS服务器上的,所以可以排除掉网络问题导致的连接数据库失败。
然后我们来排查是否是因为连接数的问题导致的连接失败。Navicat里面,点击“命令行界面”
查看MySQL当前连接数,输入:show processlist;
可以看到当前有110条连接,并且有很多连接的状态是Sleep,代表资源未释放。
然后我们再查看MySQL可以同时打开的最大连接数。在命令行界面输入:show variables like 'max_connections';
可以看到该MySQL被设置成最大允许同时打开151个连接。
所以到了这里我们可以推测是因为软件同时打开了过多的连接,导致的偶发连接数据库失败。针对该问题,我检查了接手软件的代码,发现代码存在bug,导致了偶发无法释放数据库连接。然后修改MySQL允许的最大连接数,修改MySQL启动参数文件:vi /etc/my.cnf,在最后一行加入:max_connections=300,这样就把MySQL的最大允许连接数从之前的151改成了300。
重启MySQL让设置生效,重新输入show variables like 'max_connections'; 可以发现最大连接数已经被修改了。
然后经过上述修改后,发现日志再没有打印连接MySQL失败的问题,说明确实是由于连接数的问题导致的连接失败。
参考:《mysql 查询连接数的几种方式》
《Mysql是长连接还是短连接?》
《mysql长连接和短连接的区别 mysql 短连接》
《mysql set global sql_mode重启时被重置》