預防MySQL宕機:合理設定MySQL最大使用者連線數
-----------------------------------------------------------這是一條分割線-----------------------------------------------------------
MySQL宕機的原因之一是使用者連線數耗盡。你見過這個錯誤嗎:“ERROR 1040 (00000): Too many connections.”如果你用過很長時間的MySQL,一定遇見過這個錯誤。這是一個讓人很不爽的錯誤,而且有可能導致MySQL徹底宕掉。transient errors with successful transactions mixed with failingones as well as only some processes stopping to run properly causing variouskinds of effects if not monitored properly.(這句話看不懂)
造成連線數耗盡的原因有很多,最常見的原因是Web/App伺服器對於連線數沒有限制或連線洩漏,導致產生了太多連線。
我見過的最普遍的解決辦法是簡單的增大最大連線數,使MySQL不會出現耗盡連線數的情況。但這種做法會造成資源利用的問題——大量的連線數必然需要大量的記憶體,這會導致MySQL被交換(swap)或被OOM killer程序殺掉,或者效能變得非常差。
其實面對這個錯誤(Too many connections.)有更好的解決辦法:給不同的程式分配不同的賬戶,並對每個賬戶設定不同的最大連線數。
mysql > GRANT USAGE ON *.* TO ‘batchjob1’@’localhost’ -> WITH MAX_USER_CONNECTIONS 10; |
這個源自MySQL 5.0版本的語句有很多好處:
安全:給子賬戶只分配必要的許可權,可以使你的程式在遇見開發錯誤和入侵者時,顯得更安全。
阻止連線數耗盡:如果程式有會耗盡連線數的bug,也只會使系統的一部分受到影響,而其他的應用程式依然可以正常地使用資料庫。
過載保護:連線數會限制併發查詢的數量。過大的併發量也是導致宕機的常見原因,限制連線數可以降低程式併發查詢帶來的壓力。
在我看來,僅僅只設定my.cnf/my.ini中max_user_connection的值是很粗糙的解決方式,最好根據不同程式的實際情況分配不同的賬戶和連線數。只有在多租戶的環境,max_user_connection才會顯得非常有價值,因為該環境下的大量同級使用者會共享整個系統。