修改MySQL系统内的超时参数来控制连接数量


TCP建立连接的超时,数据报文发送/接收超时等等,mysql在超时上提供了细粒度的控制参数。常用的5种超时的参数:
Variable_name Default Value
connect_timeout 5
interactive_timeout 28800
net_read_timeout 30
net_write_timeout 60
wait_timeout 28800
connect_timeout
这个比较好理解,字面上看意思是连接超时。"The number of seconds that the mysqld server waits for a connect packet before responding with Bad handshake"。
MySQL连接一次连接需求经过6次“握手”方可成功,任意一次“握手”失败都有可能导致连接失败,如下图所示

前三次握手可以简单理解为TCP建立连接所必须的三次握手,MySQL无法控制,更多的受制于不TCP协议的不同实现,后面的三次握手过程超时与connect_timeout有关。
wait_timeout
等待超时,那mysql等什么呢?确切的说是mysql在等用户的请求(query),如果发现一个线程已经sleep的时间超过wait_timeout了那么这个线程将被清理掉,无论是交换模式或者是非交换模式都以此值为准。
注意:wait_timeout是session级别的变量哦,至于session和global变量的区别是什么我不说您也知道。手册上不是明明 说wait_timeout为not interactive模式下的超时么,为什么说无论是交换模式或者非交换模式都以此值为准呢?即使在交互模式下真正起作用的也是wait_timeout而不是interactive_timeout。
那为什么手册上说在交互模式下使用的是interactive_timeout呢,原因如下:
check_connection函数在建立连接初期,如果为交互模式则将interactive_timeout值赋给wait_timeout,骗您误以为交互模式下等待超时为interactive_timeout 代码如下:
if (thd->client_capabilities & CLIENT_INTERACTIVE)
thd->variables.net_wait_timeout=thd->variables.net_interactive_timeout;
interactive_timeout
上面说了那么多,这里就不再多做解释了。我理解mysql之所以多提供一个目的是提供给用户更灵活的设置空间。
net_write_timeoutite_timeout
"The number of seconds to wait for a block to be written to a connection before aborting the write." 等待将一个block发送给客户端的超时,一般在网络条件比较差的时,或者客户端处理每个block耗时比较长时,由于 net_write_timeout导致的连接中断很容易发生。
net_read_timeout
"The number of seconds to wait fprintfor more data from a connection before aborting the read."。Mysql读数据的时的等待超时,可能的原因可能为网络异常或客户端或服务器端忙无法及时发送或接收处理包。
wait_timeout与interactive_timeout
默认值:
wait_timeout = 28800
interactive_timeout = 28800
在操作数据库数据时,经常报"MySQL server has gone away",经查发现是我mysql的wait_timeout、interactive_timeout设置的过短:30s,导致超过这个时长,mysql server会自动断掉这个连接,后续再进行数据库操作就失败从而报出异常了。
查看mysql server超时时间:
msyql> show global variables like '%timeout%';
设置mysql server超时时间(以秒为单位): 最小设置
msyql> set global wait_timeout=7200;
msyql> set global interactive_timeout=7200;
mysql默认是28800,即8小时。
(1)interactive_timeout: 服务器关闭交互式连接前等待活动的秒数。
(2)wait_timeout: 服务器关闭非交互连接之前等待活动的秒数。
两者生效取决于:客户端是交互或者非交互的连接。在交互模式下,interactive_timeout才生效;非交互模式下,wait_timeout生效。
但同时会产生另外一个问题,如果大量连接空连着数据库,会消耗服务器资源和导致其它的连接无法及时响应,所以将这两个超时的参数设定为一个可接受的值才能恰到好处。
Variable_name Default Value
connect_timeout 5
interactive_timeout 28800
net_read_timeout 30
net_write_timeout 60
wait_timeout 28800
connect_timeout
这个比较好理解,字面上看意思是连接超时。"The number of seconds that the mysqld server waits for a connect packet before responding with Bad handshake"。
MySQL连接一次连接需求经过6次“握手”方可成功,任意一次“握手”失败都有可能导致连接失败,如下图所示

前三次握手可以简单理解为TCP建立连接所必须的三次握手,MySQL无法控制,更多的受制于不TCP协议的不同实现,后面的三次握手过程超时与connect_timeout有关。
wait_timeout
等待超时,那mysql等什么呢?确切的说是mysql在等用户的请求(query),如果发现一个线程已经sleep的时间超过wait_timeout了那么这个线程将被清理掉,无论是交换模式或者是非交换模式都以此值为准。
注意:wait_timeout是session级别的变量哦,至于session和global变量的区别是什么我不说您也知道。手册上不是明明 说wait_timeout为not interactive模式下的超时么,为什么说无论是交换模式或者非交换模式都以此值为准呢?即使在交互模式下真正起作用的也是wait_timeout而不是interactive_timeout。
那为什么手册上说在交互模式下使用的是interactive_timeout呢,原因如下:
check_connection函数在建立连接初期,如果为交互模式则将interactive_timeout值赋给wait_timeout,骗您误以为交互模式下等待超时为interactive_timeout 代码如下:
if (thd->client_capabilities & CLIENT_INTERACTIVE)
thd->variables.net_wait_timeout=thd->variables.net_interactive_timeout;
interactive_timeout
上面说了那么多,这里就不再多做解释了。我理解mysql之所以多提供一个目的是提供给用户更灵活的设置空间。
net_write_timeoutite_timeout
"The number of seconds to wait for a block to be written to a connection before aborting the write." 等待将一个block发送给客户端的超时,一般在网络条件比较差的时,或者客户端处理每个block耗时比较长时,由于 net_write_timeout导致的连接中断很容易发生。
net_read_timeout
"The number of seconds to wait fprintfor more data from a connection before aborting the read."。Mysql读数据的时的等待超时,可能的原因可能为网络异常或客户端或服务器端忙无法及时发送或接收处理包。
wait_timeout与interactive_timeout
默认值:
wait_timeout = 28800
interactive_timeout = 28800
在操作数据库数据时,经常报"MySQL server has gone away",经查发现是我mysql的wait_timeout、interactive_timeout设置的过短:30s,导致超过这个时长,mysql server会自动断掉这个连接,后续再进行数据库操作就失败从而报出异常了。
查看mysql server超时时间:
msyql> show global variables like '%timeout%';
设置mysql server超时时间(以秒为单位): 最小设置
msyql> set global wait_timeout=7200;
msyql> set global interactive_timeout=7200;
mysql默认是28800,即8小时。
(1)interactive_timeout: 服务器关闭交互式连接前等待活动的秒数。
(2)wait_timeout: 服务器关闭非交互连接之前等待活动的秒数。
两者生效取决于:客户端是交互或者非交互的连接。在交互模式下,interactive_timeout才生效;非交互模式下,wait_timeout生效。
但同时会产生另外一个问题,如果大量连接空连着数据库,会消耗服务器资源和导致其它的连接无法及时响应,所以将这两个超时的参数设定为一个可接受的值才能恰到好处。