'max_user_connections' установлен на 200 - все еще получаю ошибку - PullRequest
2 голосов
/ 22 февраля 2012

Вот ошибка mysql: Ошибка подключения: пользователь 'db2498' превысил ресурс 'max_user_connections' (текущее значение: 200).

Я установил my.cnf:

[mysqld]
max_connections = 500
max_user_connections = 200

Я также установил max_user_connections в mysql для пользователя на 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 Ответ

3 голосов
/ 22 февраля 2012

Что касается проблемы с «максимальными подключениями», это может быть одна из трех вещей:

1) На сервере уже слишком много открытых подключений.Сервер MySQL может обрабатывать только определенное количество открытых соединений, прежде чем отказывать в разрешении, и это ограничение является общим для всех пользователей сервера.Обычно он установлен достаточно высоким, хотя для кого-то легко сделать эффективную DoS-сервер 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, ответственного за этот сервер.Они могут увеличить максимально допустимое количество подключений, что может решить проблему в краткосрочной перспективе, но если кто-то еще, использующий сервер, создает глупое число подключений к базе данных, слоты просто снова заполнятся.Что они, вероятно, должны сделать, так это также установить максимальный лимит открытого соединения для каждого пользователя - это предотвратит засорение сервера активными пользователями.В ситуации с общими серверами, подобной вашей, это имеет смысл: «опытные пользователи» будут / должны иметь свой собственный сервер или могут / должны платить за увеличение своих максимально открытых соединений.

...