'max_user_connections'设置为200 - 仍然出错

时间:2012-02-22 04:43:33

标签: mysql error-handling overloading

这是mysql错误: 连接失败:用户'db2498'已超出'max_user_connections'资源(当前值:200)。

我设置了my.cnf:

[mysqld]
max_connections = 500
max_user_connections = 200

我也将mysql中的max_user_connections设置为200。我在大约10-20分钟内有1400人访问该网站。每次保持平均14秒,我收到了大约1400条消息。

我正在使用PHP / Mysql。这是数据库类:

class DB{

public function __construct(){
    $this->conn = new mysqli($this->host,$this->user,$this->pass,$this->db);
    /* check connection */      
}
public function selectSomething(){
    /* select data & return */
}
public function __destruct()
{
$this->conn->close();
} 
}

这就是我所说的:

$conn = new DB();
$result = $conn->selectSomething();
/* do something */

$result = $conn->selectSomething();
/* do something */

$result = $conn->selectSomething();
/* do something */

用户在网站上的平均时间为14秒。为什么我收到此错误?这是破坏吗?我是否将数据库包装器设置错误?我迷路了,技术支持没什么帮助。

1 个答案:

答案 0 :(得分:3)

至于你的“最大连接”问题,它可能是三件事之一:

1)服务器已经有太多的开放连接。 MySQL服务器只能在拒绝允许之前处理特定数量的打开连接,并且此限制在服务器的所有用户之间共享。它通常设置得相当高,虽然很容易通过大量连接来有效地使用MySQL服务器(但见下文)

2)您的用户帐户每小时允许的连接数量有限 - 该小时内的任何其他连接都将被拒绝。这是基于每个用户设置的。

3)您的用户帐户具有有限数量的允许打开连接 - 任何进一步的连接都将被拒绝。这是基于每个用户设置的。

读取连接尝试时返回的错误消息始终很重要,因为在大多数情况下,这将确定失败的确切原因。

如果您的帐户具有最大连接数限制(方案#3),则错误将是: 代码:

ERROR 1226 (42000): User 'mysqldba' has exceeded the 'max_user_connections' resource (current value: 1) 

其中'mysqldba'将是您的用户名,'当前值'是此用户允许的最大打开连接数。

如果您的帐户具有每小时限制的最大连接数(方案#2),则错误将是: 代码:

ERROR 1226 (42000): User 'mysqldba' has exceeded the 'max_connections_per_hour' resource (current value: 1) 

再次,“mysqldba”将是您的用户名,“当前值”是此用户允许的每小时最大连接数。

如果您收到错误消息(代码1040)表示整个MySQL服务器已用完连接插槽 - 这就是我上面提到的DoS场景。

你能做些什么?根据您的说法,您在此服务器上没有超级用户权限,除了向负责该服务器的SysAdmin投诉之外什么都没有。它们可能会增加允许的最大连接数,这可以短期解决问题,但如果使用服务器的其他人正在创建一个愚蠢的数据库连接数,则插槽将再次填满。他们可能应该做的是同时强制执行每用户最大开放连接限制 - 这将阻止重度用户堵塞服务器。在像你这样的共享服务器情况下,这将是最有意义的 - “高级用户”将/应该拥有自己的服务器,或者可以/应该支付以增加其最大开放连接。