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才会显得非常有价值,因为该环境下的大量同级用户会共享整个系统。