1、缘由:
my.ini 中设定的并发链接数太少或者系统繁忙致使链接数被占满。
链接数超过了 MySQL 设置的值,与 max_connections 和 wait_timeout 都有关。
wait_timeout 的值越大,链接的空闲等待就越长,这样就会形成当前链接数越大。mysql
2、解决方式:
打开 MYSQL 安装目录打开 my.ini 找到 max_connections 默认是 100, 通常设置到500~1000比较合适,重启 MySQL。sql
显示哪些线程正在运行
show full processlist;服务器
Command状态描述:
1. SLEEP
线程正在等待客户端发送新的请求。并发
2. QUERY
线程正在执行查询或者正在将结果发送给客户端。
3. LOCKED
在MYSQL服务层,该线程正在等待表锁。在存储引擎级别实现的锁,如INNODB的行锁,并不会体如今线程状态中。 对于MYISAM来讲这是一个比较典型的状态。但在其余没有行锁的引擎中也常常会出现。 性能
4. ANALYZING AND STATISTICS
线程正在收集存储引擎的统计信息, 并生成查询的执行计划。spa
5. COPYING TO TMP TABLE (ON DISK)
线程正在执行查询, 而且将其结果集都复制到一个临时文件中, 这种状态通常要么是在作GROUP BY操做,要么是文件排序操做, 或者是UNION操做。 若是这个状态后面还有ON DISK的标 , 那表示MYSQL正在将一个内存临时表放到磁盘上。线程
6. SORTING RESULT
线程正在对结果集进行排序。blog
7. SENDING DATA
线程可能在多个状态之间传送数据,或者生成结果集,或者在向客户端返回数据。排序
3、链接数设置多少是合理的?
查看mysql的最大链接数:
show variables like '%max_connections%';进程
查看服务器响应的最大链接数:
show global status like 'Max_used_connections';
服务器响应的最大链接数为3,远低于mysql服务器容许的最大链接数值
对于mysql服务器最大链接数值的设置范围比较理想的是:服务器响应的最大链接数值占服务器上限链接数值的比例值在10%以上,若是在10%如下,说明mysql服务器最大链接上限值设置太高。
Max_used_connections / max_connections * 100% = 3/512 *100% ≈ 0.6%
4、wait_timeout
wait_timeout — 指的是mysql在关闭一个非交互的链接以前所要等待的秒数
若是你没有修改过MySQL的配置,wait_timeout的初始值是28800
wait_timeout 过大有弊端,其体现就是MySQL里大量的SLEEP进程没法及时释放,拖累系统性能,不过也不能把这个指设置的太小,不然你可能会遭遇到“MySQL has gone away”之类的问题
show global variables like 'wait_timeout'; #查看
set global wait_timeout=100; #设置
5、interactive_time
指的是mysql在关闭一个交互的链接以前所要等待的秒数
set global interactive_timeout=300;
mysql终端查看timeout的设置
show global variables like '%timeout%';
6、总结
MySQL服务器所支持的最大链接数是有上限的,由于每一个链接的创建都会消耗内存,所以客户端在链接到MySQL Server处理完相应的操做后,应该断开链接并释放占用的内存。
若是MySQL Server有大量的闲置链接,不只会白白消耗内存,并且若是链接一直在累加而不断开,最终确定会达到MySQL Server的链接上限数,这会报'too many connections'的错误。
对于wait_timeout的值设定,应该根据系统的运行状况来判断。在系统运行一段时间后,能够经过show processlist命令查看当前系统的链接状态,若是发现有大量的sleep状态的链接进程,则说明该参数设置的过大,能够进行适当的调整小些。