問題簡述/現象及原因
一台MySQL服務器上,有多個數據庫,由不同用戶使用,相互之間沒有或很少關聯性。典型的實例是虛擬主機,或者有N多個小網站的某些低頻企業應用。
這種環境下,難免有部分應用的質量不高:
出現效率極低的慢查詢 -> 後續請求大量被locked排隊 -> MySQL服務實時連接數達到最大連接數限制 -> 無法建立新連接
so, 所有相關應用全部掛掉
應對方案
為防止上述情況發生,要為MySQL配置max_user_connections參數。該參數作用是設置單個用戶最大連接數限制。具體設置多少,要根據實際情況再裁定。
需要引起注意的是,這個參數是針對所有用戶的限制,所以要考察正常情況下連接數最多的用戶。可以使用下面語句實時查詢各用戶連接數。
select `USER`,COUNT(`USER`) AS CNT from information_schema.PROCESSLIST GROUP BY `USER` ORDER BY CNT DESC;
一個參考數值,將 max_user_connections 設置為正常情況下單用戶最大連接數的3-5倍。
max_user_connections參數可以在MySQL運行時動態設置 set global …. 當然,也要同步寫到my.ini配置參數裡。
方案評估
max_user_connections 是個一刀切的配置參數,好像MySQL不能對每個用戶設置連接數,並發查詢數,io,cpu占用或其它什麼什麼的細粒度參數。或許並非一定有效。
與max_connections參數對比
max_connections 是指整個mysql服務器的最大連接數;
max_user_connections 是指每個MySQL用戶的最大連接數