作者:戴岳兵

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 的 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 点退出函数。由上面的分析可知,MySQL 文档对于该参数的描述已经过时,现在的 MYSQL_OPT_READ_TIMEOUT 并不会出现三倍超时的问题。而 Bug #31163 中的处理结果也是将文档中该参数的描述更新为实际读取超时时间是设定时间的三倍。也许是 MySQL 的维护者们在后续版本更新时忘记更新文档吧。

MySQL read-c_技术分享 | MySQL C API 参数 MYSQL_OPT_READ_TIMEOUT 的一些行为分析相关推荐

  1. mysql 客户端_技术分享 | MySQL 客户端连不上(1045 错误)原因全解析

    作者:Carlos Tutte.Marcos Albe 翻译:管长龙 在我们学习 MySQL 或从事 MySQL DBA 工作期间,时常会遇到:"我尝试连接到 MySQL 并且收到1045 ...

  2. socket timeout是什么引起的_MySQL C API 参数 MYSQL_OPT_READ_TIMEOUT 的一些行为分析

    作者:戴岳兵 MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客户端中用来设置读取超时时间的参数.在 MySQL 的官方文档中,该参数的描述是这样的: MYSQL_OPT_R ...

  3. pt5 mysql预处理_技术分享 | MySQL 监控利器之 Pt-Stalk

    一.概述 之前在社区发了一篇[有效解决 MySQL 行锁等待超时问题]文档,主要介绍了下行锁超时的监控方法,下方评论中有人提到了 pt-stalk 工具也可以监控行锁超时,因为个人没怎么用过这个工具, ...

  4. mysql semi join_技术分享 | MySQL 子查询优化

    作者:胡呈清 爱可生 DBA 团队成员,擅长故障分析.性能优化,个人博客:https://www.jianshu.com/u/a95...,欢迎讨论. 本文来源:原创投稿 *爱可生开源社区出品,原创内 ...

  5. mysql优化说出九条_技术分享 | MySQL 优化:为什么 SQL 走索引还那么慢?

    原标题:技术分享 | MySQL 优化:为什么 SQL 走索引还那么慢? 背景 2019-01-11 9:00-10:00 一个 MySQL 数据库把 CPU 打满了. 硬件配置:256G 内存,48 ...

  6. mysql数据库压缩备份_MySQL数据库之mysql数据库备份命令分享(mysql压缩数据库备份)...

    本文主要向大家介绍了MySQL数据库之mysql数据库备份命令分享(mysql压缩数据库备份) ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 备份MySQL数据库的命令 复制代 ...

  7. 技术分享|MySQL caching_sha2_password认证异常问题分析

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 0. 导读 相同的账号.密码,手动客户端连接可以成功,通过MySQL Conne ...

  8. ACMUG活动回顾 | MySQL创始人见面会技术分享会圆满结束

    9月2日,MySQL.MariaDB创始人Monty见面会&技术分享会在杭州圆满落幕.此次会议由ACMUG与沃趣科技携手,邀请数据库领域大神Monty与多位技术专家齐聚一堂,就未来数据库发展趋 ...

  9. 技术分享 | MySQL中MGR中SECONDARY节点磁盘满,导致mysqld进程被OOM Killed

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 在MGR测试中,人为制造磁盘满问题后,节点被oom killed 问题描述 在对 ...

最新文章

  1. android微博客户端下载,iBeebo微博客户端
  2. Tweet信息搜集工具tinfoleak
  3. 梯度消失问题学习资料整理
  4. python恶搞代码-搞笑的程序猿:看看你是哪种Python程序员
  5. Mybatis最入门---代码自动生成(generatorConfig.xml配置)
  6. 开放下载!阿里云《深入浅出Kubernetes.pdf》
  7. 阮一峰react demo代码研究的学习笔记 - React demo1 debug - how is jsx converted to js
  8. revit java 接口_如何使用Revit API获取axis属性?
  9. 工作131:根据请求返回报错
  10. Android 系统(230)---OTA 软件包工具
  11. javapythonc就业人数比例_P100 统计各年龄段的人数
  12. IE9兼容性视图与IE9标准视图
  13. 操作系统(02326)第1章:操作系统概论
  14. python画立体温度分布图_Origin绘制3D立体温度分布图的方法
  15. 审计小trick结合
  16. 计算机应用基础考试制作表格,计算机应用基础考试---Excel电子表格公式与函数...
  17. 分别用雅可比(Jacobi)迭代法和高斯—塞德尔(Gauss—Seidel)迭代法求解线性方程组
  18. macbook pro m1 在 EXCEL 中安装 Excel2Latex
  19. 微信小程序 | 一文总结全部营销抽奖功能
  20. gvim使用基本技巧汇总

热门文章

  1. 是什么样的骚操作让应用上线节省90%的时间 1
  2. 儿童节,5岁宝宝写给程序员爸爸的一封信!萌翻了!
  3. 新功能:阿里云负载均衡支持HTTP/2、WSS协议
  4. 玛莎拉蒂“跨界”腾讯车联打造车载互联系统,新Ghibli “触电新生”
  5. 那些你不知道的 LVS 秘密!
  6. 是时候展现真正的技术了!4道程序员智力题你能对几道| IT巨能唠
  7. 使用云原生buildpacks将你的代码转换成Docker Image | 技术头条
  8. 虚拟化精华问答 | 如何为虚拟机分配任务?
  9. 网站免费空间和服务器的区别,网站空间和服务器的区别
  10. bert 多义词_自然语言处理:Bert及其他