X

Mysql error 1040: Too many connections

Что означает ошибка Mysql error 1040: Too many connections? Это ошибка означает, что в данный момент исчерпан лимит на подключение к БД.
Появляется обычно там, где либо слишком сложные запросы (которые долго выполняются), либо там где много одновременных подключений. Ну, например, от 100 пользователей инициирован одновременный запрос к БД, как например в моем варианте. Ясно, что такое в реальном использовании делать нельзя, но для сбора статистики, мне это было нужно. Итак, как же быть?

А все очень просто:

Вариант А
В случае медленных запросов, оптимизируем их, добавляем индексы и т.д.

Вариант Б
Одновременные соединения. В этом случае распределяем их на разное время запуска, чтобы они были выполнены не в одинаковое время. Т.е. убрать вот такие варианты:

    $otime = date('i');
    while ( true ) {
    if ( $otime != date('i') ) { mysql_query('SELECT 1'); $otime = date('i'); }
    }

А может быть оптимизация кода Вам не подойдет, тогда можно увеличить кол-во одновременных подключений. Это делается в файле конфигурации mysql, а именно /etc/my.cnf, вот в этой строчке:

max_connections = 250

Стандартное значение после установки 100. После внесения изменений, нужно рестартануть демона mysqld, делается это командой:

/etc/init.d/mysqld restart

и теперь можно проверить, все ли ок, sql запросом:

SHOW VARIABLES LIKE 'max_connections'

Вот и всё. Не забывайте делать резервные копии перед внесением изменений в конфигурационные файлы!

Категории: MySQL Базы данных

Комментарии (6)

  • скажите что это значет..Error MySQL: Too many connections

    • MySQL - это программа с которой общаются через "соединения". Можешь представить себе это как окошки касс на вокзале, в которые стоят очереди людей. Так вот, когда много посетителей, заняты все соединения, (или в нашем примере, людей стало столько, что все не влезают в здание касс), MySQL пишет именно эту ошибку. Чтобы её избежать, надо увеличить максимальное кол-во соединений в настройках MySQL (увеличить кол-во окошек в кассах, чтобы обслуживать большей людей) или разобраться почему запросы выполняются так медленно (оптимизировать работу кассиров, чтобы пропускать больше народу в единицу времени). Думаю, теперь, должно быть яснее :)

  • Еще бывает просто место кончается. И MySQL выдает такую ошибку

    • Не сталкивался с такой ошибкой, в случаях когда заканчивается место. Однако, если это действительно так, то можно в этом убедиться, посмотрев лог mysql-а. В случаях нехватки места, там точно будут ошибки, которые будут сообщать об этом. Для Debian и Ubuntu лог можно глянуть тут:

      # tail /var/log/mysql/errors.log

  • а может эта ошибка вылезать в случае dDOS атаки?

    • Да, может. Но это очень легко проверить. Можно зайти например в phpMyAdmin или через саму консоль mysql, посмотреть список текущих процессов. Соотвественно, в случае DDOS-а мы увидим, очень много процессов в очереди. Дальше я обычно действую так, в точку входа (например index.php) я пишу просто скрипт который записывает ip всех текущих посетителей, построчно в файл:
      file_put_contents('ip.list', $_SERVER['REMOTE_ADDR'] , FILE_APPEND | LOCK_EX);
      оставляю так на 5 минут. Дальше отключаю запись в файл и смотрю какие ip-шники чаще всего дергают сайт. И дальше им можно отдать 503 ошибку или отправить на кешированные данные (на самом деле я записываю в файл не просто ip, а сериализированный массив, у которого ip является ключом, а значением является кол-во обращений, но этот код побольше, сюда пихать не буду). Только тут надо быть осторожным: можно забанить поисковики, если много инфы, особенно динамической, а сервер слабый. Поэтому, если ip-шник с которого "идет аттака" один или пара, то стоит посмотреть на кого он зарегистрирован через whois. И в случае если он зарегистрирован на Google, то не надо его банить, а следует добавить сайт в Google.Webmaster и ограничить там скорость сканирования или воспользоваться директивой Crwl-Delay в robots.txt.