項目中可能會(huì )遇到MySQL: ERROR 1040: Too many connections”的異常情況,造成這種情況的一種原因是訪(fǎng)問(wèn)量過(guò)高,MySQL服務(wù)器抗不住,這個(gè)時(shí)候就要考慮增加從服務(wù)器分散讀壓力;另一種原因就是MySQL配置文件中max_connections值過(guò)小。
首先,首先我們來(lái)看下mysql的最大連接數:
show variables like '%max_connections%';
如果服務(wù)器的并發(fā)連接請求量比較大,建議調高此值,以增加并行連接數量,當然這建立在機器能支撐的情況下,因為如果連接數越多,介于MySQL會(huì )為每個(gè)連接提供連接緩沖區,
就會(huì )開(kāi)銷(xiāo)越多的內存,所以要適當調整該值,不能盲目提高設值。
數值過(guò)小會(huì )經(jīng)常出現ERROR 1040: Too many connections錯誤,可以過(guò)
show global status like 'Max_used_connections';
通配符查看當前狀態(tài)的連接數量,以定奪該值的大小。
以看到服務(wù)器響應的最大連接數為3,遠遠低于mysql服務(wù)器允許的最大連接數值。
對于mysql服務(wù)器最大連接數值的設置范圍比較理想的是:服務(wù)器響應的最大連接數值占服務(wù)器上限連接數值的比例值在10%以上,如果在10%以下,說(shuō)明mysql服務(wù)器最大連接上限值設置過(guò)高.
Max_used_connections / max_connections * 100% = 3/512 *100% ≈ 0.0058%
我們可以看到占比遠低于10%(因為這是本地監控測試服務(wù)器,結果值沒(méi)有太大的參考意義,大家可以根據實(shí)際情況設置連接數的上限值)。
max_used_connections / max_connections * 100% (理想值≈ 85%)
如果max_used_connections跟max_connections相同 那么就是max_connections設置過(guò)低或者超過(guò)服務(wù)器負載上限了,低于10%則設置過(guò)大。
MySQL的max_connections參數用來(lái)設置最大連接(用戶(hù))數。每個(gè)連接MySQL的用戶(hù)均算作一個(gè)連接。
MySQL無(wú)論如何都會(huì )保留一個(gè)用于管理員(SUPER)登錄的連接,用于管理員連接數據庫進(jìn)行維護操作,即使當前連接數已經(jīng)達到了max_connections。因此MySQL的實(shí)際最大可連接數為max_connections+1;
這個(gè)參數實(shí)際起作用的最大值(實(shí)際最大可連接數)為16384,即該參數最大值不能超過(guò)16384,即使超過(guò)也以16384為準;
增加max_connections參數的值,不會(huì )占用太多系統資源。系統資源(CPU、內存)的占用主要取決于查詢(xún)的密度、效率等;
該參數設置過(guò)小的最明顯特征是出現”Too many connections”錯誤;
設置這個(gè)最大連接數值
方法1:
set GLOBAL max_connections=1024; show variables like '%max_connections%';
這種 方式在Mysql重啟后就失效。
方法2:
修改mysql配置文件my.cnf,在[mysqld]段中添加或修改max_connections值: max_connections=512
重啟mysql服務(wù)即可。
總體來(lái)說(shuō),該參數在服務(wù)器資源夠用的情況下應該盡量設置大,以滿(mǎn)足多個(gè)客戶(hù)端同時(shí)連接的需求。否則將會(huì )出現類(lèi)似”Too many connections”的錯誤。