Too many connections
從字面理解,mysql鏈接數過多。當鏈接數量過多,且來不及釋放時便會出現此錯誤。mysql
查看mysql當前鏈接信息,特別要注意sleep休眠狀態的鏈接。
sql
show full processlist;
Command 狀態:數據庫
- SLEEP
線程正在等待客戶端發送新的請求。
- QUERY
線程正在執行查詢或者正在將結果發送給客戶端。- LOCKED
在MYSQL服務層,該線程正在等待表鎖。在存儲引擎級別實現的鎖,如INNODB的行鎖,並不會體如今線程狀態中。對於MYISAM來講這是一個比較典型的狀態。但在其餘沒有行鎖的引擎中也常常會出現。ANALYZING AND STATISTICS 線程正在收集存儲引擎的統計信息,並生成查詢的執行計劃。- COPYING TO TMP TABLE (ON DISK)
線程正在執行查詢,而且將其結果集都複製到一個臨時文件中,這種狀態通常要麼是在作GROUP BY操做,要麼是文件排序操做,或者是UNION操做。若是這個狀態後面還有ON DISK的標,那表示MYSQL正在將一個內存臨時表放到磁盤上。- SORTING RESULT
線程正在對結果集進行排序。- SENDING DATA
線程可能在多個狀態之間傳送數據,或者生成結果集,或者在向客戶端返回數據。
查看mysql設置的最大鏈接數服務器
show global variables like 'max_connections';
服務器響應的最大鏈接數ide
show global variables like 'max_user_connections';
建議:服務器響應的最大鏈接數值佔服務器上限鏈接數值的比例值在10%以上,若是在10%如下,說明mysql服務器最大鏈接上限值設置太高。性能
max_user_connections/max_connections * 100% >=10%線程
若是最大鏈接數量沒問題,而sleep休眠狀態的鏈接過多,則應該從兩方面注意:code
須要主題:wait_timeout設置過大有弊端,其體現就是MySQL裏大量的SLEEP進程沒法及時釋放,拖累系統性能。若是設置太小,可能會遭遇到「MySQL has gone away」之類的問題。排序
要想從根本上解決sleep過多的問題,需從如下面三點排查:進程
最後快速解決過程
set GLOBAL max_connections = 500; set GLOBAL wait_timeout = 300; set GLOBAL interactive_timeout = 600;