Ошибка 1040 что это такое

Время на прочтение
4 мин

Количество просмотров 16K

И снова ERROR 1040…

Техподдержка получает много жалоб на эту печально известную ошибку: ERROR 1040: Too many connections — слишком много соединений. Проблема очевидна: приложение или пользователи создают больше соединений, чем допускает сервер, то есть текущее число соединений превышает значение переменной max_connections.

Ситуация уже сама по себе проблема для конечных пользователей, но если еще при этом у вас нет доступа к серверу для диагностики и исправления причины, все становится совсем плохо. Обычно приходится завершать экземпляр и перезапускать его, чтобы восстановить.

Root-пользователь тоже не может подключиться! Почему?!

В правильно настроенной среде пользователь с привилегией SUPER сможет получить доступ к экземпляру и диагностировать причину ошибки 1040, из-за которой не хватает соединений. Это описано в руководстве:

mysqld разрешает max_connections + 1 клиентских соединений. Дополнительное соединение зарезервировано для аккаунтов с привилегиями SUPER. Когда эти привилегии предоставляются администраторам, а не обычным пользователям (которым они и не нужны), администратор, у которого есть еще и привилегия PROCESS, может подключиться к серверу и использовать SHOW PROCESSLIST, чтобы диагностировать проблемы, даже если подключено максимальное число клиентов без привилегий.

Но куча людей дают привилегии SUPER своим пользователям приложения или скрипта — из-за требований приложения (опасно!) или незнания последствий, а потом зарезервированное соединение занимает обычный пользователь, а административный пользователь (обычно root) не может подключиться.

Как гарантировать доступ к экземпляру

Можно использовать хорошо известный хак с GDB, который советовал Ауримас лет 100 назад для ошибки 1040, но теперь есть решения получше. Правда сначала их надо включить.
С Percona Server 5.5.29 и выше и MySQL 8.0.14 и выше можно настроить еще один порт с дополнительным числом соединений. Приложение не будет использовать эти интерфейсы. Они только для администраторов баз данных и агентов мониторинга и проверки работоспособности (см. примечание ниже).

Настройка Percona Server

Начиная с Percona Server 5.5.29 можно просто добавить extra_port в my.cnf, и при следующем перезапуске порт будет доступен и будет ожидать данные по тому же bind_address, что и обычные соединения. Если не настроить переменную extra_port, дополнительного порта по умолчанию не будет.

Еще можно определить extra_max_connections, чтобы задать количество подключений, которое будет обрабатывать этот порт. Количество по умолчанию — 1.

Для примера я занял все подключения к порту обычных пользователей у экземпляра, где уже настроил extra_port и extra_max_connections в my.cnf:

результат

Кстати, extra_port удален в Percona Server 8.0.14 и выше, поскольку в MySQL Community реализован admin_port с теми же функциями. Так что отредактируйте my.cnf при апгрейде до Percona Server 8.0.14 или выше, если вы уже определили extra_port.

Как я уже сказал, для этого нужен MySQL 8.0.14, где применен WorkLog 12138.

Чтобы включить админский интерфейс, нужно определить admin_addres, который должен быть единственным и уникальным (без подстановочных символов) IPv4, IPv6, IPv4-сопоставленным адресом или именем хоста, по которому админский интерфейс будет ожидать передачи данных. Если эта переменная не определена, интерфейс не включен.

Еще можно определить порт, но это не обязательно. По умолчанию это порт 33062. Если этот порт свободен, это значение не нужно настраивать. Если настраиваете, то поместите обе переменные в раздел [mysqld] в my.cnf.

Наконец, можно настроить create_admin_listener_thread (отключено по умолчанию), который создает отдельный поток для обработки входящих соединений. Это может пригодиться в некоторых ситуациях.

Еще одно различие — в документации Oracle сказано, что:

Число административных соединений не ограничено.

(А у нас значение по умолчанию — 1). Не уверен, что это значит, но я бы был осторожен, чтобы случайно не установить 1 млн соединений. Они, конечно, не ограничены, но ресурсы-то все равно потребляют.

Использование для мониторинга и проверок работоспособности

Удобно, что не только люди могут использовать дополнительный интерфейс или порт в экстренной ситуации, когда мы достигли max_connections. К нему может подключиться система мониторинга и проверки работоспособности прокси/балансировщика нагрузки/обнаружения сервисов.

Скрипты мониторинга смогут извлекать данные для диаграмм, чтобы потом вы разобрались, откуда столько соединений. А скрипты проверки работоспособности будут докладывать об ухудшившемся состоянии сервера, и определенный код может указывать, что соединений много, но сервер справляется (то есть может разобраться сам и лучше чуть дольше подождать до отработки отказа).

Обязательно устанавливайте только по одному соединению за раз для мониторинга и проверки работоспособности, чтобы не забивать extra_max_connections в Percona Server и не создать миллион потоков в MySQL. То есть скрипты не должны подключаться снова, если предыдущий запрос или подключение к базе данных еще активны.

Вот тот же пример, но с MySQL.

Для Percona Server 8.0.14 и выше процесс будет тем же, что и для MySQL Community.

Помогите! Мне нужно войти, но все порты заняты!

Если это та самая причина, по которой вы читаете этот пост, используйте безумный хак с GDB (без обид, Ауримас, просто выглядит рисково :-D) или завершите экземпляр. К счастью, экземпляр почти всегда можно аккуратно завершить с помощью SIGTERM (-15) вместо SIGKILL (-9). Так сервер выполнит чистую остановку, и у потоков будет шанс нормально завершить работу. Просто следуйте инструкциям:

1) Получите PID:

marcos.albe in ~/ pgrep -x mysqld;
650

2) Отправьте SIGTERM в этот PID:

marcos.albe in ~/ kill -15 650;

3) Следите в журнале ошибок, как выполняется завершение работы. Это будет выглядеть примерно так:

2019-07-11T13:43:28.421244Z 0 [Note] Giving 0 client threads a chance to die gracefully
2019-07-11T13:43:28.521238Z 0 [Note] Shutting down slave threads
2019-07-11T13:43:28.521272Z 0 [Note] Forcefully disconnecting 0 remaining clients

Это означает начало процесса завершения работы. Экземпляр будет завершен, когда вы увидите подобную строку:

2019-07-11T13:43:31.292836Z 0 [Note] /opt/percona_server/5.7.26/bin/mysqld: Shutdown complete

Error 1040 Too many connections — ошибка, которая возникает при превышении максимального количества возможных подключений к серверу баз данных со стороны скриптов сайта.

Устраняется, как правило, увеличением лимита в конфигурации сервера.

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

mysql -u USERNAME -p

Enter password:

ERROR 1040 (08004): Too many connections

От имени суперпользователя подключиться удастся в случае если сайт работает не от root.

mysql -u root -p

Лимит существует для пользователя, если сайт работает от root (что именно из-за этого является плохой практикой) и появилась такая ошибка — требуется перезапуск службы MySQL через systemctl restart mysql.

Если удалось зайти в консоль MySQL проверяем актуальное значение директивы max_user_connection. В данном случае нас интересует прежде всего оно.

show status like ‘%connected%’;

+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 151 |
+-------------------+-------+
1 row in set (0.01 sec)

А также действующий лимит

show global variables like ‘%connections%’;

+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| max_connections | 151 |
| max_user_connections | 0 |
+----------------------+-------+
2 rows in set (0.00 sec)

Лимит достигнут, скрипты при этом продолжают делать запросы. Исправить ситуацию можно добавив в /etc/mysql/my.cnf такую строку

max_user_connection=500

Параметр может задавать не только в /etc/mysql/my.cnf, но и в любом файле, который подключается в /etc/mysql/my.cnf. Главное блок, в который добавляются настройки, он должен определяться директивой [mysqld].

Пример приведен на скриншоте

Error 1040 Too many connections

Затем перезапустив MySQL

systemctl restart mysql

Без перезапуска того же результата можно добиться установив новое значение глобальной переменной, от имени root в консоли MySQL это делается таким образом:

set global max_connections = 500;

Значение будет в силе пока работает процесс MySQL — до следующего перезапуска. Установку глобальной переменной в консоли можно использовать как временное решение. На постоянно изменить значение можно только в конфигурационном файле с последующим перезапуском службы.

Лимит теперь увеличен и сайт должен вновь стать доступен.

Часто причиной является большая активность аудитории и длительные запросы на изменение данных. Они протекают с блокировками, если используются таблицы типа MyISAM получить значительное улучшение можно конвертировав их в InnoDB.

Читайте также про оптимизацию настроек MySQL.

Иногда пользователи программного обеспечения сталкиваются с одной странной и сложной в решении проблемой, при которой на экране появляется уведомление, содержащее в себе пояснение – “Mysql error 1040: Too many connections”. Причин у данной неисправности не так много, поэтому выявить ее источник, а также разобраться с ней на данный момент не составит никакого труда.

Причины возникновения ошибки

Привести к появлению проблемы может несколько процессов и вещей, среди которых:

  • недостаточно места на хостинге;
  • превышение допустимого количества подключений, разрешенных одному пользователю;
  • количество inode уже превышено;
  • атака на систему с нескольких устройств (DDoS).

Способы решения

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

    При недостатке места можно очистить кэш или же полностью удалить все копии, которые не нужны. Если не хочется что-то удалять, то можно и приобрести необходимое пространство, а также сменить тариф.
    Если же все нормально, то значит проблема кроется в другом месте.

  2. Обратиться за помощью в техподдержку.
    Воспользоваться проверкой нагрузки, которая влияет на работу сервера, можно при помощи панели управления, имея root-доступ.

    Для того чтобы получить этот доступ, необходимо сперва сделать скриншот всего экрана, после чего отправить его в техподдержку. Специалисты в кратчайшие сроки ответят и без каких-либо осложнений помогут избавиться от неисправности.

  3. Настройка при помощи MySQL Community.
    Сперва необходимо открыть интерфейс админа, а сделать это можно только после того, как будет определен admin_addres (он попросту обязан быть единственным и, конечно же, уникальным, а также сопоставленным адресу хоста).

В некоторых случаях можно и заняться определение порта, который по умолчанию – 33062. Настраивать ничего не нужно, если он свободен, но если все-таки это придется делать, то необходимо ввести две переменные в [mysqld] в my.cnf.

После этих проделанных манипуляций можно и приступать к основной настройке create_admin_listener_thread (по умолчанию является отключенным). Благодаря этой настройке сформируется отдельный поток, обрабатывающий входящие соединения. Это поможет избавиться от ошибки.

Сегодня появилась первый раз ошибка 1040:

Error #1040

Too many connections

Please contact server administrator

С чем это связано и как ее решить? Сайт не работает ((

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

14 ответов

  • популярные
  • новые


  • 4

    Ошибка говорит о том, что сервер баз данных на вашем хостинге перегружен. Если используете сторонний хостинг — по этому поводу следует обратиться в службу поддержки хостинга. Если хостинг наш — имеет смысл написать индивидуальный запрос в службу технической поддержки из вашего Центра заказчика:
    webasyst.ru/my/



  • 3

    Периодически повторяется данная ошибка #1040, хостер nic.ru Недлю назад отписали:

    Наши специалисты предприняли все возможные меры, чтобы снизить период недоступности сервисов.
    В настоящее время все сервисы и оборудование хостинга функционируют в штатном режиме.

    Сейчас снова повторяется.. Началось 2 недели назад.



    • +1

      Добрый день! 

      Подскажите как удалось решить проблему ошибка #1040 с хостером nic.ru?

      Последнее время нас достала данная проблема.

      Спасибо



  • 3

    Аналогичная ситуация. Началось примерно пару месяцев назад. Иногда появляется когда админка просто открыта. Хостер уверяет, что с его стороны проблем нет. Хостинг Beget. Подскажите, смог ли кто разобраться с данной проблемой?



    • +1

      1040 в переводе на человеческий — слишком много подключений к базе данных, хостер лукавит



      • +2

        У хостера заявлен лимит в 50. Но почему тогда возникает ошибка и в состоянии простоя просто при открытой админке? И почему несколько лет до этого работало всё нормально %( 

        Если предположить, что это проблема хостера, то есть ли какой способ выявить это и доказать им? Ошибка всегда не предсказуемая, появляется в любой момент и снова всё Ок.



    • +1

      У нас сегодня началось тоже самое и хостинг тот же Beget



  • 1

    Периодически повторяется данная ошибка #1040, хостер nic.ru. 

    Отчего зависит не понятно. Проявляться начала примерно 2 месяца назад. Обращения в хостер nic.ru ни к чему не привели. Типа слишком много подключений к базе данных.

    Главное проявление ее совсем не логично. Может появиться ночью часа в 2, когда нет пользователей. И в тоже время сайт может работать прекрасно во время максимальной нагрузки.

    Может есть какое-то решение. 

    Подскажите. 

    Спасибо!



  • 1

    Здравствуйте,такая же проблема.Кто нибудь нашел решение?



    • +1

      Не решение нужно искать, а нормального хостинга, пользуюсь https://timeweb.com/ru/ — и ни разу не было таких проблем



      • +1

        Вам везет)) Я уже 2 месяца по ночам такое ловлю. Хостер Timeweb ложится все ок)



    • +1

      перейти на нормальный хостинг VDS



      • +1

        и на нормально такое бывает переодически



        • +1

          нет не бывает, т.к. это настраиваемый параметр вашего конфига сервера. Поставьте с запасом.

Добавить ответ

This issue occurs mostly when the maximum allowed concurrent connections to MySQL has exceeded.
The max connections allowed is stored in the gloobal variable max_connections.
You can check it by show global variables like max_connections; in MySQL

You can fix it by the following steps:

Step1:

Login to MySQL and run this command: SET GLOBAL max_connections = 100;

Now login to MySQL, the too many connection error fixed. This method does not require server restart.

Step2:

Using the above step1 you can resolve ths issue but max_connections will roll back to its default value when mysql is restarted.

In order to make the max_connection value permanent, update the my.cnf file.

Stop the MySQL server: Service mysql stop

Edit the configuration file my.cnf: vi /etc/mysql/my.cnf

Find the variable max_connections under mysqld section.

[mysql]

max_connections = 300

Set into higher value and save the file.

Start the server: Service mysql start

Note:
Before increasing the max_connections variable value, make sure that, the server has adequate memory for new requests and connections.

MySQL pre-allocate memory for each connections and de-allocate only when the connection get closed. When new connections are querying, system should have enough resources such memory, network and computation power to satisfy the user requests.

Also, you should consider increasing the open tables limit in MySQL server to accommodate the additional request. And finally. it is very important to close the connections which are completed transaction on the server.

Возможно, вам также будет интересно:

  • Ошибка 1040 too many connections
  • Ошибка 104 сбербанк что означает
  • Ошибка 104 сбербанк при переводе
  • Ошибка 104 сбербанк в банкомате
  • Ошибка 104 сбербанк банкомат что значит

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии