Аватар для licoric
1 / 1 / 1
Регистрация: 11.05.2012
Сообщений: 92

Debian, ISP, начал ловить ошибку базы данных "too many connections"

28.02.2025, 11:57. Показов 2194. Ответов 13

Студворк — интернет-сервис помощи студентам
Уж и не знаю в каком разделе тему лучше создать.

Имею сервак, на нем ispmanager (hosting), debian, пет-проекты. Начал ловить ошибку базы данных "too many connections". И из-за этого отваливается весь mysql на сервере (все проекты сидят в своих базах под своими пользователями).

Когда первый раз словил такую приколюху, то начал смотреть htop (подключался через терминал) - видел много одинаковых кроном запущенных файлов. Полез смотреть код - убрал параллельные запуски, добавил отключение от базы, где не было. В общем провел некую ревизию. Все работало неделю и сейчас и снова пошел отвал базы.

Вопрос к опытным гуру. Можно как-то диагностировать, откуда выстрел в ногу идет? Проекты не шибко большие (по нагрузке на базу или пользователей). То есть "коммерческой" посещалки вообще нет.

За сегодня:


За неделю:


Как база ложится, то нагрузка на проц падает до нуля. Ребут помогает - неделю норм было и я думал, что поборол недуг. А сегодня опять все вернулось.
Отключать код частями не вариант - ошибка очень спонтанная как я вижу.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.02.2025, 11:57
Ответы с готовыми решениями:

Начал изучать базы данных в Microsoft SQL Server. вывод таблицы в консоль
У меня есть база данных, есть табличка, где есть строки и столбцы, заполненные информацией. эта табличка отображается только в Майкрософт...

Backup VPS/VDS на Debian via ssh, включая весь софт, базы данных и др
Добрый день, уважаемые. Нужно ваше мнение по одному вопросу, поскольку сам я в линуксах не силен. И так, имеется ВПС с дебиан и...

Ловить ошибку в браузере
Добрый вечер Требуется написать скрипт, который будет автоматически - качать файл исключительно через Хром (другие браузеры не...

13
 Аватар для yoric
130 / 79 / 5
Регистрация: 02.12.2021
Сообщений: 525
28.02.2025, 19:02
А в логах покопаться?
0
Native x86
Эксперт Hardware
 Аватар для quwy
6858 / 3791 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
28.02.2025, 19:33
Bash
1
echo 'show processlist;' | mysql
что показывает?
0
Эксперт по компьютерным сетямЭксперт NIX
 Аватар для Dmitry
13440 / 7534 / 830
Регистрация: 09.09.2009
Сообщений: 29,554
28.02.2025, 20:24
можно попробовать воспользоваться утилитой MySQLTuner и посмотреть, что будет писать в своих рекомендациях
https://github.com/major/MySQLTuner-perl
0
 Аватар для licoric
1 / 1 / 1
Регистрация: 11.05.2012
Сообщений: 92
02.03.2025, 10:15  [ТС]
Цитата Сообщение от yoric Посмотреть сообщение
А в логах покопаться?
не совсем понимаю в каких именно.
В журналах WWW-запросов?
0
 Аватар для yoric
130 / 79 / 5
Регистрация: 02.12.2021
Сообщений: 525
02.03.2025, 19:57
Цитата Сообщение от licoric Посмотреть сообщение
не совсем понимаю в каких именно.
Во всех, конкретно не скажу
0
221 / 133 / 38
Регистрация: 25.07.2021
Сообщений: 539
10.03.2025, 21:28
too many это сколько?
нужно в следующий раз как только пойдут ошибки зайти в базу и посмотреть что за процессы висят.
phpmyadmin если есть, то в нем вкладка "состояние" -> "процессы"
или по ssh запустить mysql и там
Code
1
show processlist;
или
Code
1
show full processlist;
в чем конкретно у вас проблема тут знать никто не может, заходите и смотрите.
вариантов масса.
например если открыт (зачем?) порт наружу, то могут быть попытки брутфорса.
возможно очень долгие тяжелые запросы висят.
возможно скрипты какие-то долгие выполняются и подключаясь к базе не завершают сеансы - так и висит все в ожидании.

ну и глянуть стоит
Code
1
show variables like 'max_connections';
возможно ничего криминального не происходит, а вы недоговариваете как много там всего обращается к базе и нужно банально увеличить лимит количества подключений.

Цитата Сообщение от licoric Посмотреть сообщение
все проекты сидят в своих базах под своими пользователями
и что?
ладно бы вы осилили несколько копий mysql серверов запущенных.
чтоб каждому проекту действительно отдельная база была, полностью независимая от соседних "проектов", со своей памятью, кэшами.
а так ведь база одна на всех и если кто-то/что-то ее положит - базы не будет у всех.
0
 Аватар для licoric
1 / 1 / 1
Регистрация: 11.05.2012
Сообщений: 92
14.03.2025, 21:02  [ТС]
Цитата Сообщение от EvgenUA Посмотреть сообщение
ладно бы вы осилили несколько копий mysql серверов запущенных.
чтоб каждому проекту действительно отдельная база была, полностью независимая от соседних "проектов", со своей памятью, кэшами.
а так ведь база одна на всех и если кто-то/что-то ее положит - базы не будет у всех.
Собственно в это и уперся. Мне чуть ранее казалось, что если ляжет одна база, то ляжет одна база, а не весь сервер. А прилег весь сервис mysql, а не одна база какая-то
Спецом сделал буквально на днях "анализ" запросов. Начало-конец работы скрипта. Может наслоение есть где друг на друга. Пока так. Вновь жду "приход" отвала базы.
0
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,553
Записей в блоге: 4
21.03.2025, 16:27
Цитата Сообщение от EvgenUA Посмотреть сообщение
а так ведь база одна на всех и если кто-то/что-то ее положит - базы не будет у всех.
Базы разные. Сервер MySQL один, который обслуживает эти базы.
0
221 / 133 / 38
Регистрация: 25.07.2021
Сообщений: 539
21.03.2025, 19:02
да, под базой имел в виду именно mysql сервер.
и количество подключений, про которое тут речь идет, оно общее на все базы внутри сервера этого.

ну в общем все решаемо.
1) найти от чего так много подключений висит. это баги скриптов или же норма.
если норма, то:
2) увеличить max_connections
а в идеале и при желании:
3) можно несколько копий именно mysql серверов запустить.
например разделить по проектам или по базам. 1 база = 1 сервер

это кстати одна из причин почему многие считают, что на vps лучше.
там у тебя собственный mysql сервер, а не как на shared'е один общий с соседями.
0
 Аватар для licoric
1 / 1 / 1
Регистрация: 11.05.2012
Сообщений: 92
17.04.2025, 21:44  [ТС]

***Получилось вернутся к этому вопросу))
В таблице полно таких одинаковых строк с одной базой данных.
Я правильно понимаю, что теперь надо искать ошибки в говнокоде и где именно открывается коннект к базе и не закрывается?
Жаль только, что не показывается сам запрос или что-то наподобие источника.
0
221 / 133 / 38
Регистрация: 25.07.2021
Сообщений: 539
18.04.2025, 12:20
Цитата Сообщение от licoric Посмотреть сообщение
Жаль
да уж, печаль вселенская...

однако оно же пишет 'id'.
можно на время включить лог всех запросов. в конфиг добавить:
general_log_file=/путь/mysql_general.log
general_log=1
и перегрузить базу.

через время как накопятся снова спящие - берем id, находим в логе что это был за запрос (очень возможно конечно, что не один, а много разных окажется). и дальше в скриптах находим где такой запрос есть и почему не закрывается.
0
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,553
Записей в блоге: 4
30.04.2025, 10:03
Цитата Сообщение от licoric Посмотреть сообщение
Я правильно понимаю, что теперь надо искать ошибки в говнокоде и где именно открывается коннект к базе и не закрывается?
Соединение идёт от клиента? Клиент самописный? На чём написан? Покажите код пары методов доступа с этого клиента, скорее всего в них забываете закрыть соединение...
Вот пример для C#
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public async Task<List<KS6Detail>> GetKS6DetailsAsync(KS6Header header)
{
    List<KS6Detail> details = new List<KS6Detail>();
    string sqlText = "dbo.spBRKS6SelectDetail";
 
    try
    {
        // Создаём соединение
        using (SqlConnection sqlConnection = new SqlConnection(_connectionString))
        {
            // Создаём команду
            using (SqlCommand sqlCommand = new SqlCommand(sqlText, sqlConnection) { CommandType = CommandType.StoredProcedure })
            {
                SqlParameter pHeaderID = new SqlParameter
                {
                    ParameterName = "@idHeader",
                    Value = header.KS6HeaderID,
                    SqlDbType = SqlDbType.Int,
                    Direction = ParameterDirection.Input
                };
                sqlCommand.Parameters.Add(pHeaderID);
 
                // Открываем соединение
                await sqlCommand.Connection.OpenAsync();
 
                // Выполняем команду
                using (SqlDataReader sqlDataReader = await sqlCommand.ExecuteReaderAsync())
                {
                    if (sqlDataReader.HasRows)
                    {
                        while (await sqlDataReader.ReadAsync())
                        {
                            details.Add(new KS6Detail
                            {
                                KS6DetailID = (int)sqlDataReader["ID_KS6Detail"],
                                KS6HeaderID = (int)sqlDataReader["ID_KS6Header"],
                                CPSHeaderID = (int)sqlDataReader["ID_CPSHeader"],
                                CPSDetailID = (int)sqlDataReader["ID_CPSDetail"],
                                MeasureID = (int)sqlDataReader["ID_Measure"],
                                Measure = (string)sqlDataReader["Measure"],
                                WName = (string)sqlDataReader["WName"],
                                WQuantity = (decimal)sqlDataReader["WQuantity"]
                            });
                        }
                    }
                }
            }
        } // При выходе за эту скобку соединение разрывается и объект уничтожается, т.к. использовалась директива using
 
        return details;
    }
    catch (SqlException sqlEx)
    {
        throw new ApplicationException(string.Format("T-SQL #{0} - {1}", sqlEx.Number, sqlEx.Message), sqlEx);
    }
    catch (Exception ex)
    {
        throw new ApplicationException(ex.Message, ex);
    }
}
0
 Аватар для licoric
1 / 1 / 1
Регистрация: 11.05.2012
Сообщений: 92
02.05.2025, 16:40  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Соединение идёт от клиента? Клиент самописный? На чём написан? Покажите код пары методов доступа с этого клиента, скорее всего в них забываете закрыть соединение...
Вот пример для C#
У меня на PHP проект. Везде, вроде, проверял - коннекты закрываются. Надо посмотреть, может запросы наслаиваются друг на друга как снежный ком. Но на улице у нас тепло, солнце... Надо заставить себя)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.05.2025, 16:40
Помогаю со студенческими работами здесь

Не могу заставить RegexValidator ловить ошибку
Django 3.1.7 class RenderedCssFile(models.Model): css_pattern = r&quot;.*-\d+\.css$&quot; regex_validator =...

Как устранит ошибку базы данных?
Приветствую. В общем использую для локальной разработки Open server. В нем как вы знаете можно устанавливать разные версии php и баз...

Исправить ошибку, C# интерфейс подключенной базы данных
Нужно создать интерфейс моей базы из sql server, таблицы выводятся, запросы тоже, но обновление/удаление/изменение не работает. Помогите...

Не понимаю ошибку при использовании базы данных
Всем привет System.Data.SqlClient.SqlException: 'Login failed for user 'userid'.' Такая ошибка This exception was originally...

Не могу понять ошибку в обновление базы данных
&lt;? include (&quot;bd.php&quot;); $title = stripslashes(trim(htmlspecialchars($_POST,ENT_QUOTES))); $desc =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru