首页 > 代码库 > 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线程用完,新连接无法连接的问题笔记!