首页 > 代码库 > MySQL线程用完,新连接无法连接的问题笔记!
MySQL线程用完,新连接无法连接的问题笔记!
问题:
MySQL服务器所支持的最大连接数是有上限的,每个连接都会占用一定的内存资源,因此当客户端访问MySQL服务器处理完相应的操作后,就应该断开连接释放内存资源。
如果服务器有大量的闲置连接,这样就会白白的浪费内存,且如果一直在累加而不断开的话,就会达到连接上限,报"too many connections”的错误。可通过命令"show process list”查看,若发现后台有大量的sleep线程,此时就需要调整上述参数了。
一些参数解释:
show variables like ‘%max_connections%‘; --查询当前连接
可以在/etc/my.cnf里面设置数据库的最大连接数
[mysqld]
max_connections = 1000
mysql> show status like ‘Threads%‘;
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 58 |
| Threads_connected | 57 | ###这个数值指的是打开的连接数
| Threads_created | 3676 |
| Threads_running | 4 | ###这个数值指的是激活的连接数,这个数值一般远低于connected数值
+-------------------+-------+
Threads_connected 跟show processlist结果相同,表示当前连接数。准确的来说,Threads_running是代表当前并发数。
引用:http://blog.csdn.net/imxiangzi/article/details/46502423
SHOW FULL PROCESSLIST;
杀死kill + id;
说明各列的含义和用途,
id列:一个标识,你要kill 一个语句的时候很有用。
user列: 显示当前用户,如果不是root,这个命令就只显示你权限范围内的sql语句。
host列:显示这个语句是从哪个ip 的哪个端口上发出的。可用来追踪出问题语句的用户。
db列:显示这个进程目前连接的是哪个数据库。
command列:显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。
time列:此这个状态持续的时间,单位是秒。
state列:显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个sql语句,已查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成。
info列:显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。
常用需要修改的参数:
1、interactive_timeout
2、wait_timeout
1.interactive_timeout
服务器关闭交互式连接前等待活动的秒数。交互式客户端指在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。
参数默认值:28800秒(8小时)
2.wait_timeout
服务器在关闭非交互式连接在一个连接上等待活动的秒数。
参数默认值:28800秒(8小时)
问题:
在my.cnf中单独修改wait_timeout,mysqld重启后仍不生效;(widnows my.ini)
同时修改interactive_timeout和wait_timeout参数,重启服务器后生效。
注意:由于MySQL版本问题,有的时候只需要修改wait_timeout这个值。具体参数需要根据版本查看手册。
本文出自 “renzhiyuan@chinacfsc.com” 博客,谢绝转载!
MySQL线程用完,新连接无法连接的问题笔记!