Mysql: Too Many Connection 错误解决
## 简介 使用Mysql时,如果使用/配置不当,可能会造成连接过多,超过Mysql限制的最大连接数
渲染中...
## 简介 使用Mysql时,如果使用/配置不当,可能会造成连接过多,超过Mysql限制的最大连接数,此时新的连接就无法建立了。 本文记录查看MySQL连接,并关闭不必要连接的方法。 <!-- more --> ## 相关操作 - 查看连接 ```sql show 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列的值。 ## 拓展 出现连接数过多,超出最大连接数时,通过上面的方法可以关闭不必要的连接,但这只是临时解决问题,要想尽量避免连接数过多的问题,应该分析什么原因并解决,一般有两种原因: 1. 最大连接数太小 2. 连接没有及时关闭 ### 最大连接数太小 > Mysql数据库可以设置最大连接数,当连接数超出该设置值时,才会出现`Too many Connection`报错。如果该数据库实际使用的连接就是很多,超过了设置的最大连接数,此时应该修改MySQL的配置,增大最大连接数。 - 查看最大连接数设置 ```sql show variables like '%max_connections%'; ``` - 命令修改最大连接数 > 此种方式算是临时性修改,当MySQL重启后,该配置将失效,需要运行命令重新设置。 ```sql set GLOBAL max_connections = 200; ``` - 配置修改最大连接数 > 此种方式需要修改MySQL配置文件后重启MySQL服务才能生效。 在`my.cnf`配置文件中增加以下配置: ``` [mysqld] max_connections = 1000 ``` ### 连接没有及时关闭 > 连接没有及时关闭,一般是由于MySQL设置的超时时间过长导致,默认的超时时间是`28800`,即8小时。此时建议将超时时间设置的小一些。 - 查看超时时间相关配置 ```sql SHOW VARIABLES LIKE "%timeout%"; ``` - 修改超时时间 ```sql set GLOBAL wait_timeout = 600; ``` 与上面修改最大连接数同理,也可以通过配置文件设置: ``` [mysqld] wait_timeout = 600 ``` PS:超时类型有很多,根据情况选择使用即可。
END
评论
登录后查看和发表评论
前往登录