导读

作者:魏新平

知数堂第5期MySQL实战班学员,第10期MySQL优化班学员,现任职助教。

现象

当我们用MySQL客户端或者程序(如Java,Python等)连接MySQL后,如果闲置一段时间(就是不执行任何SQL),再次执行SQL的时候就会报失去连接的错误,如:

ERROR2006(HY000): MySQL server has gone away

Lostconnection to MySQL server during query

这是MySQL控制连接数的机制,会自动把一些闲置时间超过配置值的连接kill掉。

闲置时间配置参数

这里涉及的参数有两个,wait_timeout和interactive_timeout。而MySQL的参数又分为GLOBAL级别和SESSION级别,所以严格的讲,会涉及到四个参数。

参数的官方解释:

interactive_timeout: The number of seconds the server waits for activity on an interactive connection before closing it. An interactive client is defined as a client that uses the CLIENT_INTERACTIVE option to mysql_real_connect().

翻译:interactive_timeout控制交互式连接的空闲时间,如果调用mysql的mysql_real_connect()函数的时候,使用了CLIENT_INTERACTIVE参数,该连接就定义为交互式连接。

wait_timeout: The number of seconds the server waits for activity on a noninteractive connection before closing it.

翻译:wait_timeout控制非交互连接的闲置时间。

On thread startup, the session waittimeout value is initialized from the global wait_timeoutvalue or from the global interactive_timeoutvalue, depending on the type of client (as defined by the CLIENT_INTERACTIVE connect option to mysql_real_connect()). See also interactive_timeout.

翻译:在连接建立的时候,session级别的wait_timeout会根据连接的分类来选择是继承global级别的interactive_timeout的值和global级别的wait_timeout的值。

看完官方针对interactive_timeout和wait_timeout的解释,其实会发现写的挺让人难以理解的,没有讲清楚SESSION级别和GLOBAL级别的两个参数是如何控制连接的闲置时间的,而且很难区分什么是交互式连接,什么是非互式连接,只能从源代码层面去区分。

接下来我们平常使用的连接方式来做实验(使用的MySQL版本为Percona的MySQL5.7)。

实验一:

先分别设置GLOBAL级别的interactive_timeout和wait_timeout。

1、重新用MySQL客户端开一个窗口,查看SESSION参数

可以看出SESSION级别的wait_timeout和interactive_timeout都继承了GLOBAL.interactive_timeout的值,也就是说mysql客户端属于交互式连接。

2、用PyMySQL查看参数值(Python3版本)

结果为

{'@@GLOBAL.interactive_timeout':20,'@@GLOBAL.wait_timeout':40,'@@session.interactive_timeout':20,'@@session.wait_timeout':40}

结论:SESSION级别的wait_timeout和interactive_timeout继承了各自的GLOBAL级别的值,也就是说Python的Pymysql连接被定义为非交互式连接。

实验二:

1、MySQL官方客户端

然后用同样的方式去测试剩下的三个参数,发现只有修改SESSION级别的wait_timeout才会有

ERROR 2006(HY000): MySQL server has gone away

错误(请务必在同一个会话当中测试)。

2、Pymysql(Python3)

用另外3个参数来运行上述代码,只有修改session级别wait_timeout才会出现如下错误:

pymysql.err.OperationalError: (2013,'Lost connection to MySQL server during query')

结论:从实验二可以看出,针对已经存在的连接来说,交互式和非交互式连接的闲置时间都是由SESSION级别的wait_timeout控制的。

总结

1、交互式连接和非交互式连接的空闲时间都是由SESSION级别的wait_timeout时间控制的

2、SESSION级别的wait_timeout值是再连接初始化的时候,根据连接的分类来确定是从GLOBAL 级别的interactive_timeout值继承还是GLOBAL级别的wait_timeout值继承

3、SESSION级别的interactive_timeout对连接的闲置时间没有用处

加入知数堂

挑战40万+年薪!

知数堂

叶金荣与吴炳锡联合打造

领跑IT精英培训

行业资深专家强强联合,倾心定制

MySQL实战/MySQL优化/MongoDB/

Python/ SQL优化/Hadoop+ELK

数门精品课程

“阅读原文”可获更多正课试听视频

密码:hg3h

紧随技术发展趋势,定期优化培训教案

融入大量生产案例,贴合企业一线需求

社群陪伴学习,一次报名,可学1年

DBA、开发工程师必修课

上千位学员已华丽转身,薪资翻番,职位提升

改变已悄然发生,你还在等什么?

扫码加入QQ技术交流群

MySQL 8.0|MGR研究院-ZST

(QQ群号:650149401)

mysql定期清理会话_MySQL会话闲置时间控制相关推荐

  1. mysql 锁 会话_MySQL会话锁等待关系原理

    会话依赖关系主要需要理解锁等待相关四张表的关系: 先查询当前会话持有哪些事务的锁和依赖哪些事务的锁,通过这两种锁就可以得到一种图关系. 一:查询当前会话持有的锁: 1.查询当前会话processlis ...

  2. mysql暂停触发器_mysql如何临时禁用触发器

    mysql如何临时禁用触发器 起因 Mysql的触发器,在触发控制上,只能按照对数据的操作方式(Insert,Update,Delete)以及操作前后(before,after)进行触发控制.但是如果 ...

  3. mysql 视图 字典_MySQL深入01-SQL语言-数据字典-服务器变量-数据操作DML-视图

    SQL语言的组成部分 常见分类:DDL:数据定义语言 DCL:数据控制语言,如授权 DML:数据操作语言 其它分类:完整性定义语言: DDL的一部分功能约束 约束:包括主键,外键,唯一键,条件,非空, ...

  4. mysql 缓冲查询_MySQL查询高速缓冲

    可以在SELECT语句中指定查询缓存相关选项: · SQL_CACHE 如果query_cache_type系统变量的值是ON或DEMAND,查询结果被缓存. · SQL_NO_CACHE 查询结果不 ...

  5. [mysql] 变量、处理程序和流程控制

    目录 变量 定义 系统变量 查看.修改 用户变量 会话用户变量 局部变量 对比 定义条件和处理程序 定义条件 处理程序 流程控制 条件判断 IF CASE 循环语句 LOOP WHILE REPEAT ...

  6. mysql 慢查询优化_MySQL 性能优化之慢查询

    性能优化的思路 首先需要使用慢查询功能,去获取所有查询时间比较长的SQL语句 其次使用explain命令去查询由问题的SQL的执行计划(脑补链接:点我直达1,点我直达2) 最后可以使用show pro ...

  7. mysql -a 参数_mysql参数及解释

    key_buffer_size:(global.Dynamic)#*** MyISAM特有的选项.即使你不使用MyISAM表,你仍应该将它设置为8-64M,因为它也被用于内部的临时磁盘表.这个参数是用 ...

  8. mysql事务编号_Mysql事务

    一:mysql事务 1.需求 从orders表中查询最新的销售订单编号,并使用下一个销售订单编号作为新的销售订单编号. 在指定客户的orders表中插入新的销售订单. 将新的销售订单项目插入order ...

  9. mysql 锁定表_MySQL表锁定

    在本教程中,您将学习如何使用MySQL锁来协调会话之间的表访问. MySQL允许客户端会话明确获取表锁,以防止其他会话在特定时间段内访问表.客户端会话只能为自己获取或释放表锁.它不能获取或释放其他会话 ...

最新文章

  1. 告别「灭霸式审稿」,IJCAI-21 的投稿者爽到家!
  2. 芝麻HTTP:TensorFlow基础入门
  3. hihocoder1513 小Hi的烦恼
  4. Python练习题:合并列表和列表排序
  5. 【整理】各种语言的API文档
  6. LeetCode 3:无重复字符的最长子串 思考分析
  7. LeetCode 470. 用 Rand7() 实现 Rand10()(随机概率)
  8. 【剑指offer】面试题50:第一个只出现一次的字符(java)
  9. 版本向量 使用css时正确区分IE版本[转]
  10. mac pro制作iso系统光盘
  11. 店宝宝电脑版_母婴店主干货分享:母婴店利润究竟有多大?
  12. Mysql 时间戳类型使用心得
  13. 单片机(MCU)最强科普(万字总结,值得收藏)
  14. #pragma comment(lib,ws2_32.lib)
  15. python操作腾讯文档_Python操作Excel文档
  16. 融入动画技术的交互应用优秀作业推荐
  17. python系列11:python的游戏引擎
  18. Super expression must either be null or a function错误
  19. 三分钟读懂客户端证书
  20. grpc、https、oauth2等认证专栏实战17:grpc-go自定义认证之base64验证介绍

热门文章

  1. 总计2171个BTC被盗,这个钱包漏洞的受害者越来越多
  2. Varnish——CDN推送平台管理(web界面批量清除缓存)
  3. 使用uniapp开发社区交友网站的项目教程
  4. 《人工智能》机器学习 - 第5章 逻辑回归(二 二元逻辑回归实战)
  5. 什么叫水平,不是看懂了叫水平,也不是会用了就叫水平,更不是懂得更多才叫有水平,而是知道如何做才能做得更好才叫真正有水平?...
  6. kafka分区副本机制
  7. 时间轴-新年倒计时(实操java)
  8. asynctaskdemo(Info)5
  9. CF外挂界令人发指的垃圾外挂!让你接触不为人知的内幕!
  10. [年终总结]愿你永远清澈明朗,眼里有光