使用Mysql时,如果使用/配置不当,可能会造成连接过多,超过Mysql限制的最大连接数,此时新的连接就无法建立了。
本文记录查看MySQL连接,并关闭不必要连接的方法。
sqlshow processlist;
输出信息一般如下:
Id | User | Host | db | Command | Time | State | Info |
---|---|---|---|---|---|---|---|
5 | event_scheduler | localhost | Daemon | 1144 | Waiting for | next activation | |
294682 | root | 192.168.7.180:53984 | factory | Sleep | 125 | ||
294684 | root | 192.168.7.180:54192 | factory | Sleep | 5 | ||
294685 | root | 192.168.7.180:54210 | factory | Sleep | 125 | ||
353757 | root | 192.168.7.180:38702 | iominterface | Sleep | 5 | ||
364388 | root | 192.168.7.180:34048 | iominterface | Sleep | 5 | ||
364857 | root | 192.168.10.148:57409 | face_recognition | Sleep | 6805 | ||
364858 | root | 192.168.10.148:57426 | face_recognition | Sleep | 6505 | ||
364859 | root | 192.168.10.148:57427 | face_recognition | Sleep | 6505 | ||
364860 | root | 192.168.7.180:43082 | iominterface | Sleep | 5 | ||
364861 | root | 192.168.10.142:53161 | face_recognition | Sleep | 3447 | ||
364862 | root | 192.168.10.142:53221 | face_recognition | Sleep | 3447 | ||
364918 | root | 192.168.7.180:48004 | iominterface | Sleep | 5 | ||
364933 | root | 192.168.10.148:60690 | face_recognition | Sleep | 6505 | ||
365051 | root | 192.168.10.136:60726 | face_recognition | Sleep | 2461 | ||
365052 | root | 192.168.10.136:60727 | face_recognition | Sleep | 2461 | ||
365803 | root | 192.168.10.148:58923 | face_recognition | Sleep | 1741 | ||
365804 | root | 192.168.10.148:58924 | face_recognition | Sleep | 1741 | ||
365805 | root | 192.168.10.148:58925 | face_recognition | Sleep | 1751 | ||
365806 | root | 192.168.10.148:58980 | face_recognition | Sleep | 943 | ||
365807 | root | 192.168.10.148:59003 | face_recognition | Sleep | 943 |
其中id列在主动关闭连接时需要使用;Host列是客户端的地址;db列为连接到的数据库;State为当前连接状态。
又是由于某些原因,可能导致出现大量的Sleep连接,从而使连接数超过最大连接,此时新连接就服务建立了,会报错Too many Connection
,此时需要检查哪些是不必的sleep连接,手动将其关闭即可。
比如上面表中,如果认为来自192.168.10.148
连接face_recognition
库的连接是不必要的,就可以找到其对应的id,使用以下sql关闭连接即可:
sql-- kill id;
kill 364933;
其中364933
就是通过上一步查询到的id列的值。
出现连接数过多,超出最大连接数时,通过上面的方法可以关闭不必要的连接,但这只是临时解决问题,要想尽量避免连接数过多的问题,应该分析什么原因并解决,一般有两种原因:
Mysql数据库可以设置最大连接数,当连接数超出该设置值时,才会出现
Too many Connection
报错。如果该数据库实际使用的连接就是很多,超过了设置的最大连接数,此时应该修改MySQL的配置,增大最大连接数。
sqlshow variables like '%max_connections%';
此种方式算是临时性修改,当MySQL重启后,该配置将失效,需要运行命令重新设置。
sqlset GLOBAL max_connections = 200;
此种方式需要修改MySQL配置文件后重启MySQL服务才能生效。
在my.cnf
配置文件中增加以下配置:
[mysqld] max_connections = 1000
连接没有及时关闭,一般是由于MySQL设置的超时时间过长导致,默认的超时时间是
28800
,即8小时。此时建议将超时时间设置的小一些。
sqlSHOW VARIABLES LIKE "%timeout%";
sqlset GLOBAL wait_timeout = 600;
与上面修改最大连接数同理,也可以通过配置文件设置:
[mysqld] wait_timeout = 600
PS:超时类型有很多,根据情况选择使用即可。
本文作者:DingDangDog
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!