Mysql Too many connections解決方案

Too many connections
從字面理解,mysql鏈接數過多。當鏈接數量過多,且來不及釋放時便會出現此錯誤。mysql

查看mysql當前鏈接信息,特別要注意sleep休眠狀態的鏈接。
sql

show full processlist;

Command 狀態:數據庫

  • SLEEP
    線程正在等待客戶端發送新的請求。
    1. 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

  • 1。 wait_timeout 空閒等待超時時間
  • 2。 interactive_timeout 交互超時時間(經過mysql客戶端鏈接數據庫是交互式鏈接)

須要主題:wait_timeout設置過大有弊端,其體現就是MySQL裏大量的SLEEP進程沒法及時釋放,拖累系統性能。若是設置太小,可能會遭遇到「MySQL has gone away」之類的問題。排序

要想從根本上解決sleep過多的問題,需從如下面三點排查:進程

  • 1。程序鏈接mysql,不使用持久連接。即便用mysqli_connect而不是pconnect。
  • 2。程序執行結束,主動顯式調用mysqli_close來釋放鏈接資源。
  • 3。解決程序中的SQL慢查詢語句。

最後快速解決過程

set GLOBAL max_connections = 500;
set GLOBAL wait_timeout = 300;
set GLOBAL interactive_timeout = 600;
相關文章
相關標籤/搜索