MySQL小技巧:如何判斷一個(gè)連接是交互式還是非交互式

一、問(wèn)題來(lái)源

今天有個(gè)朋友問(wèn)我如果判斷MySQL連接是交互式還是非交互式,我翻了一下沒(méi)翻到,我們先來(lái)看看什么是交互式和非交互式吧。
我們知道MySQL連接有交互式和非交互式,比如典型的mysql客戶端就是交互式的,而程序連接一般為非交互式。那么如何知道到底是mysql客戶端的連接還是程序的連接呢。我們單從show processlist中好像并不能看出來(lái)。我也稍微找了一下似乎沒(méi)有找到更好的視圖說(shuō)明。
但是我認(rèn)為這個(gè)還是比較有用,通常kill的時(shí)候我們需要判定這個(gè)連接到底是程序的連接還是mysql客戶端的連接(當(dāng)然可以通過(guò)IP等判斷),當(dāng)然如果為mysql客戶端的連接通常為DBA的維護(hù)連接。當(dāng)然這個(gè)地方稍微修改代碼下應(yīng)該就可以了,但是現(xiàn)有當(dāng)前情況下如何判斷呢?下面我們來(lái)想想如何變通的得到結(jié)果。

二、如果變通判斷

我覺(jué)得只能從我們現(xiàn)有的2個(gè)參數(shù)interactive_timeout和wait_timeout來(lái)判定了,這里有個(gè)小知識(shí)。對(duì)于任何連接來(lái)講都是wait_timeout生效的(poll API的timeout參數(shù)實(shí)現(xiàn))。interactive_timeout就是在連接的時(shí)候判斷,如果是交互式連接就用interactive_timeout替換掉wait_timeout,那么我們可以知道如下:

  • 交互式連接interactive_timeout == wait_timeout
  • 非交互式interactive_timeout 和 wait_timeout沒(méi)有關(guān)系

我們就利用這一點(diǎn),默認(rèn)的兩個(gè)參數(shù)都是28800,我們就修改參數(shù)interactive_timeout為28700,wait_timeout保持默認(rèn)28800這也不會(huì)影響什么。

然后我們利用performance_schema.variables_by_thread來(lái)觀察會(huì)話級(jí)別的參數(shù),如下:

  • 如果會(huì)話參數(shù)中interactive_timeout == wait_timeout且為28700 那么為交互式
  • 如果會(huì)話參數(shù)中interactive_timeout != wait_timeout一個(gè)為28800一個(gè)為28700 則為非交互式

如下語(yǔ)句可以判斷

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');

當(dāng)然這個(gè)結(jié)果你也可以在封裝一層后直接判斷出是交互式還是非交互式連接。

三、測(cè)試

截圖如下:


image.png

我們看到如下:

  • session 2:為交互式,因?yàn)閮蓚€(gè)參數(shù)均為28700,這是我本地的mysql客戶端的連接
  • session 3:為非交互式,因?yàn)閮蓚€(gè)參數(shù)一個(gè)為28800一個(gè)為28700,這是dump線程
  • session 4,5:為非交互式,因?yàn)閮蓚€(gè)參數(shù)一個(gè)為28800一個(gè)為28700,這是我用pymysql連接的
  • session 6:為交互式,因?yàn)閮蓚€(gè)參數(shù)均為28700,這是我mysql客戶端遠(yuǎn)端鏈接的

四、其他分享

最后分享最近看到一個(gè)有意思的東西,我們知道C通過(guò)gcc編譯后得到的二進(jìn)制可執(zhí)行文件在linux默認(rèn)叫做a.out,為什么叫a.out,不叫b.out呢?原來(lái)這是有歷史的如下:

極客時(shí)間《深入C語(yǔ)言和程序運(yùn)行原理》筆記
“a.out”全名叫做“Assembler Output”,是Unix誕生早期的可執(zhí)行文件的格式。這個(gè)名稱來(lái)源于 Unix 系統(tǒng)作者 Ken Thompson 最早為 PDP-7 微型計(jì)算機(jī)編寫(xiě)的匯編器的默認(rèn)輸出文件名。至今,這個(gè)名稱還是某些編譯器(比如 GCC)在創(chuàng)建可執(zhí)行文件時(shí)的默認(rèn)文件名。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容