Home > 数据库 > MySQL Timeout解析

MySQL Timeout解析

“And God said, Let there be network: and there was timeout”
在使用MySQL的过程中,你是否遇到了众多让人百思不得其解的Timeout?
那么这些Timeout之后,到底是代码问题,还是不为人知的匠心独具?
本期Out-man,讲述咱们MySQL DBA自己的Timeout。

先看一下比较常见的Timeout参数和相关解释:
connect_timeout
The number of seconds that the mysqld server waits for a connect packet before responding with Bad handshake.
interactive_timeout
The number of seconds the server waits for activity on an interactive connection before closing it.
wait_timeout
The number of seconds the server waits for activity on a noninteractive connection before closing it.
net_read_timeout
The number of seconds to wait for more data from a connection before aborting the read.
net_write_timeout
The number of seconds to wait for a block to be written to a connection before aborting the write.

从以上解释可以看出,connect_timeout在获取连接阶段(authenticate)起作用,interactive_timeout和wait_timeout在连接空闲阶段(sleep)起作用,而net_read_timeout和net_write_timeout则是在连接繁忙阶段(query)起作用。

获取MySQL连接是多次握手的结果,除了用户名和密码的匹配校验外,还有IP->HOST->DNS->IP验证,任何一步都可能因为网络问题导致线程阻塞。为了防止线程浪费在不必要的校验等待上,超过connect_timeout的连接请求将会被拒绝。

即使没有网络问题,也不能允许客户端一直占用连接。对于保持sleep状态超过了wait_timeout(或interactive_timeout,取决于CLIENT_INTERACTIVE标志)的客户端,MySQL会主动断开连接。

即使连接没有处于sleep状态,即客户端忙于计算或者存储数据,MySQL也选择了有条件的等待。在数据包的分发过程中,客户端可能来不及响应(发送、接收、或者处理数据包太慢)。为了保证连接不被浪费在无尽的等待中,MySQL也会选择有条件(net_read_timeout和net_write_timeout)地主动断开连接。

这么多Timeout足以证明MySQL是多么乐于断开连接。而乐于断开连接的背后,主要是为了防止服务端共享资源被某客户端(mysql、mysqldump、页面程序等)一直占用。

  1. February 10th, 2010 at 14:25 | #1

    除了timeout,其实还有无尽的connection drop。这都是db保护自己的方式,应用程序需要考虑容纳这些情况。和数据库打交道的时候,timeout和connection drop应该被看做是正常情况下会时常发生的事情。
    这种情况不仅仅出现在mysql上,大多数数据库都是这种情况。

  2. February 11th, 2010 at 21:38 | #2

    @Eric:
    Timeout除了网络问题之外,很多都是db主动断开了连接。确实是db保护自己有限资源的方法。

  3. June 3rd, 2010 at 10:40 | #3

    @Eric:
    Timeout除了网络问题之外,很多都是db主动断开了连接。确实是db保护自己有限资源的方法。

  4. June 19th, 2010 at 21:36 | #4

    @Eric:
    Timeout除了网络问题之外,很多都是db主动断开了连接。确实是db保护自己有限资源的方法。

  5. August 1st, 2010 at 17:18 | #5

    留言显示是不是不正常呢? 看下面人的回复只有引用,没有自己的言语。

  6. August 27th, 2010 at 11:03 | #6

    本来在找锁等待的资料,无意中看到这篇概述,很有用。
    oracle中有类似于wait_timeout,interactive_timeout这样的参数吗?之前遇到过这样的问题,应用程序已经断开连接(意外中止,但有事务未提交),但Oracle好像却未释放这样的连接,事务所修改的记录一直被锁定。

  7. 收到
    September 11th, 2010 at 20:46 | #7

    oracle的设置在profile里面。可以自己定义哟。有好多参数的

  8. webcgo
    March 18th, 2011 at 16:47 | #8

    不太明白net_read_timeout。我理解是比如向数据库发送一条select语句,等待数据返回的时间,不过不是这样,我做了过测试,把net_read_timeout设置为1,即1秒,然后运行一个花费很长时间,数据量很大的查询,也能正常取得结果集。可否具体讲解下net_read_time这个配置?

  9. May 9th, 2011 at 17:20 | #9

    mysql5.5 的my.ini配置文件中找不到timeout设置项,自己添加吗?

  10. gary
    June 25th, 2011 at 13:09 | #10

    @webcgo
    我们可以看到,在更改表结构的时候,会lock表.那么一些insert的语句被locked了,等待了net_read_timeout 时间后,会看到主动断开

  1. January 27th, 2011 at 16:31 | #1