MySQL的sleep進程聽起來很嚇人,實際上只是因為它可能導致MySQL服務器響應變慢而被稱為“kill mysql sleep”。當MySQL在查詢時遇到延遲時,會自動啟動一個“sleep”進程來等待,并將此進程保留在服務器中,直到延遲結束。這個進程所需的資源非常少,但如果有很多這樣的進程在服務器上運行,它們可以阻塞MySQL的其他請求并影響服務器性能。
mysql>SHOW PROCESSLIST; +----+------------+-----------+------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------------+-----------+------+---------+------+-------+------------------+ | 1 | system user| | NULL | Connect | 4209 | Sleep | NULL | | 2 | system user| | NULL | Connect | 4210 | Sleep | NULL | | 3 | system user| | NULL | Connect | 4211 | Sleep | NULL | | 4 | system user| | NULL | Connect | 4212 | Sleep | NULL | | 5 | system user| | NULL | Connect | 4070 | Query | SHOW PROCESSLIST | +----+------------+-----------+------+---------+------+-------+------------------+
上述代碼顯示了一個MySQL服務器,其中有四個“sleep”進程。要解決這個問題,可以使用以下代碼,將其殺死:
mysql>SELECT CONCAT('KILL ',id,';') FROM information_schema.processlist WHERE user = 'system user' AND command = 'Sleep' AND time >100; +---------------------+ | CONCAT('KILL ',id,';') | +---------------------+ | KILL 1; | | KILL 2; | | KILL 3; | | KILL 4; | +---------------------+ mysql>SELECT CONCAT('KILL ',id,';') INTO @killquery FROM information_schema.processlist WHERE user = 'system user' AND command = 'Sleep' AND time >100; mysql>PREPARE kill_sleep FROM @killquery; mysql>EXECUTE kill_sleep;
上述代碼將查詢狀態為“Sleep”且已運行超過100秒的所有進程殺死。該命令通過將查詢的ID插入到“KILL”命令中來實現,然后將其準備好,最后執行該命令以殺死該進程。
最后,要注意的是,如果MySQL客戶端連接MySQL服務器并且在執行查詢時關閉,服務器可能會保留此查詢的“Sleep”進程。這時,需要殺死這些進程以釋放服務器資源。