这是 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) 服务器已经有太多打开的连接。 MySQL 服务器只能处理特定数量的打开连接,然后拒绝允许更多连接,并且该限制由服务器的所有用户共享。它通常设置得相当高,尽管有人很容易通过建立大量连接来有效地对 MySQL 服务器进行 DoS(但见下文)
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 场景。
你能做些什么呢?根据您所说,您在此服务器上没有 super 用户权限,因此除了向负责该服务器的系统管理员投诉之外,什么也没有。他们可能会增加允许的最大连接数,这可以在短期内解决问题,但如果使用服务器的其他人创建了愚蠢数量的数据库连接,则插槽将再次填满。他们可能应该做的是还强制执行每个用户的最大打开连接限制 - 这将阻止大量用户堵塞服务器。在像您这样的共享服务器情况下,这最有意义 - “高级用户”将/应该拥有自己的服务器,或者可以/应该付费以增加其最大开放连接数。
关于mysql - “max_user_connections”设置为 200 - 仍然出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9389201/