mysql5.7版本中,先查看超时设置参数,我们这里只关注需要的超时参数,并不是全都讲解
show variables like '%timeout%';

参数解释
connect_timeout
connect_timeout指的是连接过程中握手的超时时间,在5.0.52以后默认为10秒,之前版本默认是5秒。
mysql的基本原理应该是有个监听线程循环接收请求,当有请求来时,创建线程(或者从线程池中取)来处理这
请求。由于mysql连接采用TCP协议,那么之前势必是需要进行TCP三次握手的。
TCP三次握手成功之后,客户端进入阻塞,等待服务端的消息。服务端这个时候会创建一个线程(或者从线程池中取一个线程)来处理请求,主要验证部分包括host和用户名密码验证。host验证我们比较熟悉,因为在用grant命令授权用户的时候是有指定host的。
用户名密码认证则是服务端先生成一个随机数发送给客户端,客户端用该随机数和密码进行多次sha1加密后发送给服务端验证。如果通过,整个连接握手过程完成
have_statement_timeout
是否开启语句执行超时,YES 开启,NO关闭
net_read_timeout 和 net_write_timeout
net_read_timeout
mysql服务端从客户端读取(接收)数据时,服务端等待客户端响应的超时时间,当服务端正在从客户端读取
数据时,net_read_timeout控制何时超时。
对于这个参数,session和global级别并没有什么特别,session级别只对当前连接生效,global级别只对新
的连接生效。默认值是30S。
net_write_timeout
mysql服务端向客户端写(发送)数据时,服务端等待客户端响应的超时时间,当服务端正在写数据到客户端
时,net_write_timeout控制何时超时。
对于这个参数,session和global级别并没有什么特别,session级别只对当前连接生效,global级别只对新
的连接生效,默认值是60S。
interactive_timeout & wait_timeout
还是先看官方文档,从文档上来看wait_timeout和interactive_timeout都是指不活跃的连接超时时间,
连接线程启动的时候wait_timeout会根据是交互模式还是非交互模式被设置为这两个值中的一个。
如果我们运行mysql -uroot -p命令登陆到mysql,wait_timeout就会被设置为interactive_timeout的值。
如果我们在wait_timeout时间内没有进行任何操作,那么再次操作的时候就会提示超时,
这是mysql client会重新连接。
handshake流程讲解
- 在TCP三次握手的基础之上,简历MySQL通讯协议的连接,这个连接建立过程受connect_timeout参数控制

在MySQL通讯协议建立连接之后,此时客户端连接的超时受wait_timeout和interactive_timeout参数控制
建立连接后无交互:
MySQL server —wait_timeout— Client
建立连接交互后:
MySQL server —interactive_timeout— Client
在如果客户端有数据包传输,那么这个数据包的传输超时由net_read_timeout和net_write_timeout参数控制

总结:
如果是java 或其他程序使用jdbc等方式连接mysql 则关注 connect_timeout,wait_timeout
如果是客户端 使用 mysq -u -root -p 方式建立连接的则要关注connect_timeout 和interactive_timeout
另外所有连接有读写的都要关注net_read_timeout 和net_write_timeout 超时时间
3234

被折叠的 条评论
为什么被折叠?



