一、問(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è)試
截圖如下:

我們看到如下:
- 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)文件名。