關閉 MySQL 連接時,如果遠程客戶端沒有正確關閉連接,可能會導致 MySQL 服務器出現 CLOSE_WAIT 狀態。關閉客戶端連接后,MySQL 服務器的 TCP 棧將發送 FIN 數據包到客戶端,表示服務器已經斷開連接??蛻舳藨摲祷?ACK 數據包,表示已經收到 FIN 包并且確認斷開連接。
如果客戶端沒有返回 ACK 數據包,而是僵死在某個狀態下,則會導致 MySQL 服務器的 CLOSE_WAIT 狀態出現。此時,MySQL 服務器的連接已經被中止,但是操作系統 TCP 棧中仍有一些連接對象未被刪除。
如果 CLOSE_WAIT 狀態持續時間過長,將會導致大量的操作系統資源被占用,從而降低系統的性能。因此,我們需要解決 CLOSE_WAIT 狀態。
方法一: 使用 mysqladmin 查看當前所有連接的狀態: mysqladmin processlist 其中,狀態欄中的 CLOSE_WAIT 表示當前連接處于 CLOSE_WAIT 狀態。 找到卡住的進程 id,使用 kill 命令殺掉整個進程: kill [進程 id] 方法二: 可以修改 MySQL 的配置文件,在 MySQL 斷開連接時,強制關閉客戶端的連接。需要設置 global max_connections 和 wait_timeout 參數。 max_connections:允許的最大連接數。 wait_timeout:等待時間。 在 MySQL 的配置文件中添加以下內容: [mysqld] max_connections=20 wait_timeout=30 這里將 max_connections 設置為 20,wait_timeout 設置為 30 秒。這樣,當超過 20 個客戶端連接到 MySQL 服務器時,MySQL 服務器將強制關閉等待時間超過 30 秒的連接。