mysql超时时间怎么改 mysql设置执行sql超时时间

mysql可以自定义超时吗connect_timeout:连接响应超时时间 。服务器端在这个时间内如未连接成功 , 则会返回连接失败 。
wait_timeout:连接空闲超时时间 。与服务器端无交互状态的连接 , 直到被服务器端强制关闭而等待的时间 。可以认为是服务器端连接空闲的时间,空闲超过这个时间将自动关闭 。
interactive_timeout :连接空闲超时时间 。与服务器端无交互状态的连接,直到被服务器端强制关闭而等待的时间 。
interactive_timeout和wait_timeoutu意义虽然相同,但是有使用对象有本质的区别 。interactive_timeout针对交互式连接(比如通过mysql客户端连接数据库),wait_timeout针对非交互式连接(比如一般在PHP中使用PDO连接数据库,当然你可以设置CLIENT_INTERACTIVE选项来改变) 。所谓的交互式连接,即在mysql_real_connect()函数中使用了CLIENT_INTERACTIVE选项 。
net_read_timeout :数据读取超时时间 。在终止读之前 , 从一个连接获得数据而等待的时间秒数;当服务正在从客户端读取数据时,net_read_timeout控制何时超时 。即客户端执行数据读取,等待多少秒仍未执行成功时自动断开连接 。
net_write_timeout:数据库写超时时间 。和net_read_timeout意义类似,在终止写之前,等待多少秒把block写到连接;当服务正在写数据到客户端时,net_write_timeout控制何时超时 。
slave-net-timeout:从库延后同步的时间,当slave认为连接master的连接有问题时,就等待N秒,然后断开连接,重新连接master
slave-net-timeout在主从同步时从库上起作用;connect_timeout:在获取连接阶段起作用;interactive_timeout和wait_timeout:在连接空闲阶段起作用;net_read_timeout和net_write_timeout:则是在连接执行时起作用 。
mysql怎么设置超时时间MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客户端中用来设置读取超时时间的参数 。在 MySQL 的官方文档中 , 该参数的描述是这样的:
MYSQL_OPT_READ_TIMEOUT (argument type: unsigned int *)The timeout in seconds for each attempt to read from the server. There are retries if necessary, so the total effective timeout value is three times the option value. You can set the value so that a lost connection can be detected earlier than the TCP/IPClose_Wait_Timeout value of 10 minutes.
也就是说在需要的时候,实际的超时时间会是设定值的 3 倍 。但是实际测试后发现实际的超时时间和设置的超时时间一致 。
而具体什么时候发生三倍超时,在文档中没有找到 。所以对 MySQL 5.7.20 的源码进行了一些分析 。
使用 GDB 调试代码找了实际与 mysql server 通信的代码,如下:
请点击输入图片描述
其中 vio_read() 函数中,使用 recv 和 poll 来读取报文和做读取超时 。net_should_retry() 函数只有在发生 EINTR 时才会返回 true 。从这段代码来看是符合测试结果的,并没有对读取进行三次重试 。只有在读取操作被系统中断打断时才会重试,但是这个重试并没有次数限制 。
【mysql超时时间怎么改 mysql设置执行sql超时时间】从上面代码的分析可以看出,代码的逻辑和文档的描述不符 。于是在一顿搜索后,找到了一个 MySQL 的 BUG(Bug #31163) 。该 BUG 报告了在 MySQL 5.0 中,MySQL c api 读取的实际超时时间是设置的三倍 , 与现有文档描述相符 。于是对 MySQL 5.0.96 的代码又进行分析 。
同样使用 GDB 找到了通信部分的代码 。这次找到了重试三次的代码,如下:
请点击输入图片描述
这个版本的 MySQL api 的读写超时是直接使用的 setsockopt 设置的 。第一次循环,在 A 点发生了第一次超时(虽然注释写的非阻塞 , 但是客户端的连接始终是阻塞模式的) 。然后在 B 点将该 socket 设置为阻塞模式,C 点这里重置 retry 次数 。由于设置了 alarm 第二次以后的循环会直接进入 D 点的这个分支 , 并且判断循环次数 。作为客户端时net-retry_count 始终是 1 , 所以重试了两次,共计进行了 3 次 vioread 后从 E 点退出函数 。

推荐阅读