MySQL數(shù)據(jù)庫(kù)是目前Web應(yīng)用中使用最廣泛的關(guān)系型數(shù)據(jù)庫(kù)之一,但是在使用MySQL過程中,我們可能會(huì)遇到某些問題。其中,一個(gè)比較常見的問題是數(shù)據(jù)庫(kù)中大量的time_wait自連接。
time_wait是TCP連接的一種狀態(tài),在MySQL中,這種狀態(tài)的連接通常是由于長(zhǎng)時(shí)間處于idle狀態(tài)而導(dǎo)致的。而time_wait自連接就是在MySQL中的一個(gè)客戶端連接由于未能被正確的關(guān)閉,留下了大量的time_wait連接,最終導(dǎo)致整個(gè)MySQL服務(wù)不穩(wěn)定。
//示例代碼 $ mysql -h192.168.1.1 -uroot -p Welcome to the MySQL monitor... mysql>status; -------------- mysql Ver 14.14 Distrib 5.7.21, for Win64 (x86_64) Connection id: 1 Current database: Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.7.21 MySQL Community Server (GPL) Protocol version: 10 Connection: 192.168.1.1 via TCP/IP Server characterset: utf8mb4 Db characterset: utf8mb4 Client characterset: cp936 Conn. characterset: cp936 TCP port: 3306 Uptime: 6 hours 42 min 41 sec Threads: 6 Questions: 12205414 Slow queries: 0 Opens: 720 Flush tables: 1 Open tables: 139 Queries per second avg: 48.007 --------------
如果你遇到了這種情況。你可以嘗試通過KILL命令,手動(dòng)殺掉這些time_wait連接。但即使是這種情況,也需要謹(jǐn)慎操作,因?yàn)镸ySQL在關(guān)閉TCP連接時(shí)并不會(huì)立刻終止該連接,而是留出一定的時(shí)間供該連接進(jìn)行必要的收尾工作。
推薦的方法是,先確認(rèn)該連接已經(jīng)失效,再關(guān)閉TCP連接。可以通過檢查該連接的狀態(tài)、是否還有活動(dòng)請(qǐng)求、以及是否有大量待發(fā)送的數(shù)據(jù)包等方式來判斷該連接是否已經(jīng)失效。