Как исправить: mysql_connect (): слишком много соединений - PullRequest
12 голосов
/ 08 апреля 2009

Я получаю следующую ошибку:

mysql_connect(): Too many connections

Он полностью закрыл мой сайт, который непрерывно работает в течение нескольких лет.

Примечание. У меня общий хостинг с GoDaddy.

Как мне это исправить?

ТАКЖЕ: есть ли способ закрыть все соединения и перезапустить, когда вы пользуетесь планом общего хостинга?

Ответы [ 5 ]

15 голосов
/ 30 октября 2013

Это технический ответ

Вы получите эту ошибку «слишком много подключений» при подключении к mysql, когда сервер mysql достиг своего программного настраиваемого искусственного ограничения максимального числа одновременных клиентских подключений.

Итак, правильный способ исправить это:

  1. напрямую подключитесь к серверу mySQL (через localhost) и выполните запрос: SET GLOBAL max_connections = 1024; для изменения предела соединения во время выполнения (без простоя).
  2. сделайте ваше изменение постоянным и отредактируйте файл /etc/mysql/my.cnf (или аналогичный) и добавьте строку max_connections = 1024; в раздел [mysqld]; затем перезапустите, если вы не смогли сделать живое изменение.

Выбранный предел 1024 был чисто субъективным; используйте любой предел, который вы хотите. Вы также можете проверить свой текущий лимит с помощью запроса SHOW VARIABLES LIKE "max_connections";. Имейте в виду, что эти ограничения существуют для хорошего использования, чтобы предотвратить ненужную перегрузку вашей базы данных. Поэтому всегда выбирайте разумные ограничения.

Однако для выполнения этих шагов вам необходим прямой доступ к серверу базы данных mySQL.

Как вы сказали, вы используете Godaddy (я их не очень много знаю), у вас нет возможности связаться с вашим поставщиком услуг (т.е. Godaddy). Тем не менее, они будут также видеть это в своих журналах.

Возможные первопричины

Это, конечно, означает, что слишком много клиентов пытаются подключиться к серверу mySQL в одно и то же время - в соответствии с указанным ограничением искусственного программного обеспечения для каждой конфигурации.

10 голосов
/ 08 апреля 2009

Скорее всего, вы были объектом атаки DDoS.

Люди на этом форуме жалуются на одно и то же с точно таким же провайдером.

Ответ таков:

VB сказал мне, что это была атака DOS - вот их сообщение:

Это не «подвиг». Это DoS-атака (отказ в обслуживании). К сожалению, мы ничего не можем с этим поделать. С атаками DoS можно бороться только на уровне сервера или маршрутизатора, и это является обязанностью вашего хоста. Вместо этого они решили пойти легким путем и приостановить действие вашего аккаунта.

Если вы не можете заставить их воспринимать это всерьез, тогда вам следует искать другого хоста. Извините за плохие новости.

Возможный обходной путь может быть следующим: если ваше соединение завершается неудачно с mysql_connect(): Too many connections, вы не выходите, а вместо этого sleep() в течение полсекунды и пытаетесь подключиться снова, и выходите только тогда, когда 10 попытка не удалась.

Это не решение, это обходной путь.

Это, конечно, задержит загрузку вашей страницы, но это лучше, чем уродливое too many connections сообщение.

Вы также можете использовать некоторый метод, который разделяет ботов и браузеры.

Например, установить соленый SHA1 cookie, перенаправить на ту же страницу, а затем проверить этот cookie и подключиться к MySQL, только если пользовательский агент прошел тест.

3 голосов
/ 08 апреля 2009

Вы закрываете соединение, когда закончите с ними? Вы используете какой-то тип пула соединений? Похоже, вы открываете связи, а не закрываете их.

РЕДАКТИРОВАТЬ: Quassnoi уже ответил. В случае, если это DDoS, и вы используете виртуальный хостинг, вам может потребоваться просто связаться с вашим хостом и поработать с ним. К сожалению, это риск, когда у вас нет контроля над всей вашей системой.

1 голос
/ 08 апреля 2009

Рассмотрите возможность использования mysql_pconnect (). Ваш хост может добавить какое-то регулирование для соединений. Как максимум 100 за 20 минут или что-то странное.

0 голосов
/ 29 ноября 2016

Другая причина, которая может вызвать эту ошибку, - это если в базе данных не хватает места. У меня недавно это произошло, и проблема была не в подключениях, а в дисковом пространстве. Надеюсь, это поможет кому-то еще!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...