#Что означает ошибка
SQLSTATE 53300 означает, что подключений к PostgreSQL стало больше допустимого количества для новой сессии. Веб-приложение может накапливать соединения из-за утечки, большого числа процессов или отсутствия пула. Увеличивать max_connections наугад нельзя: каждая сессия расходует память, а изменение обычно требует перезапуска сервера.
#Как различить причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Приложение не возвращает подключения в пулКод создаёт новое соединение для каждого запроса и не освобождает его. | Число сессий по одному application_name растёт и почти не уменьшается. | Исправить управление жизненным циклом подключения и использовать ограниченный пул. |
| Слишком много работников приложенияКаждый PHP-FPM/Node.js/другой процесс держит собственный пул. | После увеличения числа работников резко растут соединения на стороне СУБД. | Ограничить суммарный размер пулов и сравнить его с лимитом PostgreSQL. |
| Долгие и незавершённые транзакцииСессии долго остаются idle in transaction или заняты запросом. | pg_stat_activity показывает возрастные транзакции и состояние idle in transaction. | Найти запрос/код и обеспечить COMMIT или ROLLBACK на соответствующей ветке. |
#Пошаговая диагностика и устранение
- Снимите симптом, не создавая новые подключенияЗапишите полную ошибку
too many connections, SQLSTATE 53300 и примерное время возникновения из журнала приложения. Проверьте, происходит ли она только под нагрузкой или постоянно. Не запускайте стресс-тест: он может отнять последние доступные сеансы. Если администратор может подключиться через зарезервированный доступ, дальнейшие проверки выполняет он. - Попробуйте обычный мониторинг только при доступном подключенииВ уже открытом psql или pgAdmin подключитесь к нужной базе и выполните
SELECT current_database(), version(); SHOW max_connections;. Если новая сессия не создаётся, не пытайтесь многократно войти под разными пользователями — попросите администратора использовать штатный служебный доступ. Этот шаг не требует перезапуска. - Определите, кто занимает подключенияПри наличии прав выполните запрос к pg_stat_activity, группирующий сессии по datname, usename, application_name и state. Сравните группы с настройками веб-приложения и числом его процессов. Если вы видите только свои сессии или часть полей скрыта, попросите администратора дать агрегированные показатели — не меняйте права пользователям ради диагностики.
- Найдите незавершённые транзакцииИспользуйте запрос на чтение с фильтром
state = 'idle in transaction'из блока команд. Просмотрите возраст и application_name. Наличие старой транзакции не означает, что её разрешено прерывать: она может удерживать важные изменения. Найдите соответствующий обработчик приложения и причину отсутствующего COMMIT/ROLLBACK. - Сверьте суммарное количество подключений в приложенииОткройте конфигурацию используемого драйвера или пула и число одновременно работающих процессов (например, настройки PHP-FPM, Node.js cluster, системы очередей). Рассчитайте верхнюю оценку: процессы × максимальный размер пула, плюс фоновые задания и служебные сессии. Если оценка существенно больше лимита, уменьшайте пул или число работников после проверки производительности.
- Исправьте повторное открытие соединенийВ коде найдите место, где соединение создаётся при каждом HTTP-запросе. Для драйвера с пулом используйте один управляемый пул на процесс и освобождение клиента в
finallyпо официальной документации драйвера. Если есть утечка, проверьте каждую ветку исключения. Перезапустите только тестовый экземпляр приложения и сравните число соединений до и после серии запросов. - Не завершайте неизвестные сессии без согласованияЕсли проблема уже влияет на рабочий сайт и требуется срочное действие, сначала покажите администратору диагностические группы и журналы. Не используйте безусловное
pg_terminate_backendпо всем pid: оно прерывает транзакции и пользовательские операции. Администратор может адресно завершить доказанно зависшую сессию после проверки владельца и последствий, либо штатно уменьшить нагрузку. - Меняйте лимит только после оценки ресурсовЕсли исправленный пул всё равно исчерпывает доступные подключения, администратор планирует параметр max_connections вместе с памятью, резервами служебных подключений и окном перезапуска. До изменения сохраните конфигурацию и резервную копию, после — проверьте
SHOW max_connections;и доступность приложения. Если вмешательство ухудшило состояние, верните прежний параметр и согласованно перезапустите сервер. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Воспроизведение и проверка только в отдельной тестовой базе
SELECT current_setting('max_connections') AS configured_max, count(*) FILTER (WHERE backend_type='client backend') AS client_sessions FROM pg_stat_activity;#Как убедиться в исправлении и что делать дальше
После исправления повторите привычную нагрузку на тестовой среде, отслеживая client_sessions в течение нескольких минут: число должно стабилизироваться ниже допустимого уровня, а 53300 исчезнуть из журнала. Если ошибки продолжаются, передайте администратору график подключений, размеры пулов, число процессов и настройки резервов; повторное повышение лимита без диагностики не считать решением.