預防MySQL宕機:合理設置MySQL最大用戶連接數

本文的原文地址在此:http://www.percona.com/blog/2014/07/29/prevent-mysql-downtime-set-max_user_connections/,以下是譯文。

-----------------------------------------------------------這是一條分割線-----------------------------------------------------------

July 29, 2014 byPeter Zaitsev

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纔會顯得非常有價值,因爲該環境下的大量同級用戶會共享整個系統。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章