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、页面程序等)一直占用。
除了timeout,其实还有无尽的connection drop。这都是db保护自己的方式,应用程序需要考虑容纳这些情况。和数据库打交道的时候,timeout和connection drop应该被看做是正常情况下会时常发生的事情。
这种情况不仅仅出现在mysql上,大多数数据库都是这种情况。
@Eric:
Timeout除了网络问题之外,很多都是db主动断开了连接。确实是db保护自己有限资源的方法。
@Eric:
Timeout除了网络问题之外,很多都是db主动断开了连接。确实是db保护自己有限资源的方法。
@Eric:
Timeout除了网络问题之外,很多都是db主动断开了连接。确实是db保护自己有限资源的方法。
留言显示是不是不正常呢? 看下面人的回复只有引用,没有自己的言语。
本来在找锁等待的资料,无意中看到这篇概述,很有用。
oracle中有类似于wait_timeout,interactive_timeout这样的参数吗?之前遇到过这样的问题,应用程序已经断开连接(意外中止,但有事务未提交),但Oracle好像却未释放这样的连接,事务所修改的记录一直被锁定。
oracle的设置在profile里面。可以自己定义哟。有好多参数的
不太明白net_read_timeout。我理解是比如向数据库发送一条select语句,等待数据返回的时间,不过不是这样,我做了过测试,把net_read_timeout设置为1,即1秒,然后运行一个花费很长时间,数据量很大的查询,也能正常取得结果集。可否具体讲解下net_read_time这个配置?
mysql5.5 的my.ini配置文件中找不到timeout设置项,自己添加吗?
@webcgo
我们可以看到,在更改表结构的时候,会lock表.那么一些insert的语句被locked了,等待了net_read_timeout 时间后,会看到主动断开