MySQL小技巧:如何判断一个连接是交互式还是非交互式

作者简介:高鹏,笔名八怪。《深入理解MySQL主从原理》图书作者,同时运营个人公众号“MySQL学习”,持续分享遇到的有趣case以及代码解析!

一、问题来源

今天有个朋友问我如果判断MySQL连接是交互式还是非交互式,我翻了一下没翻到,我们先来看看什么是交互式和非交互式吧。我们知道MySQL连接有交互式和非交互式,比如典型的mysql客户端就是交互式的,而程序连接一般为非交互式。那么如何知道到底是mysql客户端的连接还是程序的连接呢。我们单从show processlist中好像并不能看出来。我也稍微找了一下似乎没有找到更好的视图。

但是我认为这个还是比较有用,通常kill的时候我们需要判定这个连接到底是程序的连接还是mysql客户端的连接(当然可以通过IP等判断),当然如果为mysql客户端的连接通常为DBA的维护连接。当然这个地方稍微修改代码下应该就可以了,但是现有当前情况下如何判断呢?下面我们来想想如何变通的得到结果。

二、如果变通的判断

我觉得只能从我们现有的2个参数interactive_timeout和wait_timeout来判定了,这里有个小知识。对于任何连接来讲都是wait_timeout生效的(poll API的timeout参数实现)。interactive_timeout就是在连接的时候判断,如果是交互式连接就用interactive_timeout替换掉wait_timeout,那么我们可以知道如下:

  • 交互式连接interactive_timeout == wait_timeout
  • 非交互式interactive_timeout 和 wait_timeout没有关系

我们就利用这一点,默认的两个参数都是28800,我们就修改参数interactive_timeout为28700,wait_timeout保持默认28800这也不会影响什么。

然后我们利用performance_schema.variables_by_thread来观察会话级别的参数,如下:

  • 如果会话参数中interactive_timeout == wait_timeout且为28700 那么为交互式
  • 如果会话参数中interactive_timeout != wait_timeout一个为28800一个为28700 则为非交互式

如下语句可以判断

select b.processlist_id,a.VARIABLE_NAME,a.VARIABLE_VALUE,b.name from   performance_schema.variables_by_thread a ,performance_schema.threads  b   where a.THREAD_ID=b.THREAD_ID and VARIABLE_NAME in('wait_timeout','interactive_timeout');