PostgreSQL: FATAL: sorry, too many clients already
Все места для подключений к базе заняты. Сколько их, задаёт настройка max_connections, по умолчанию — 100, если позволяют настройки системы. Места занимает сайт или программа, которая открывает подключения и не закрывает их. Найдите, кто занял места, и освободите их.
Содержание 10
Как выглядит ошибка
FATAL: sorry, too many clients alreadyПохожее сообщение:
FATAL: remaining connection slots are reserved for roles with the SUPERUSER attributeОно значит, что свободных мест для обычных пользователей не осталось. Несколько последних мест база держит для суперпользователей, по умолчанию — 3. Поэтому администратор postgres ещё может войти и разобраться.
Шаг 1. Войдите администратором
Команды вводятся на сервере с базой: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне.
sudo -u postgres psqlКоманда открывает psql — программу для работы с базой — от имени администратора базы postgres. Если система спросит пароль, введите пароль своего пользователя на сервере, а не пароль базы. Символы при вводе не видны — наберите пароль и нажмите Enter. Строка ввода сменится на postgres=#: теперь можно вводить команды для базы. Каждая команда SQL заканчивается точкой с запятой. Выйти — \q.
Если вход не проходит с той же ошибкой, заняты и запасные места — освободите их перезапуском.
Шаг 2. Посмотрите, кто занял подключения
Сколько всего мест:
SHOW max_connections;Кто их занял — запрос сгруппирует подключения по пользователю, базе и состоянию:
SELECT usename, datname, state, count(*)
FROM pg_stat_activity
WHERE backend_type = 'client backend'
GROUP BY usename, datname, state
ORDER BY count(*) DESC;Строка backend_type = 'client backend' оставляет только подключения программ и людей, без служебных процессов базы. Что значит состояние в столбце state:
| Состояние | Что значит |
|---|---|
active | подключение выполняет запрос |
idle | подключение открыто и ждёт новой команды |
idle in transaction | внутри начатой транзакции, но запрос сейчас не выполняется |
Если больше всего подключений у одного пользователя в состоянии idle, места держит программа, которая работает от этого пользователя: открывает подключения и не закрывает их.
Шаг 3. Освободите подключения
Перезапустите программу, которая заняла места: при перезапуске она закроет свои подключения. Для сайта на PHP перезапустите PHP-FPM, в Ubuntu 26.04 — php8.5-fpm:
sudo systemctl restart php8.3-fpmЕсли программу перезапускать нельзя, завершите её простаивающие подключения прямо из базы. Вместо ivan — пользователь из шага 2:
SELECT pg_terminate_backend(pid) FROM pg_stat_activity
WHERE usename = 'ivan' AND state = 'idle';Запрос завершит только подключения в состоянии idle — те, что сейчас ничего не делают. Если они быстро набираются снова, причина в программе: ищите в её настройках число подключений к базе.
Если администратор тоже не входит
Перезапустите PostgreSQL — все подключения закроются. На время перезапуска сайт не сможет работать с базой.
sudo systemctl restart postgresqlСразу после перезапуска войдите администратором и выполните шаг 2, пока места снова не заняты.
Нужно ли поднимать max_connections
Поднимайте предел, только если подключения нужны: сайт действительно обслуживает много посетителей одновременно. Для каждого подключения база запускает отдельный процесс, поэтому лишние места расходуют память сервера. Программа, которая не закрывает подключения, займёт и новые места.
Посмотрите текущую строку в файле настроек:
grep '^max_connections' /etc/postgresql/16/main/postgresql.confОткройте файл в редакторе nano командой sudo nano /etc/postgresql/16/main/postgresql.conf, найдите строку, которая начинается с max_connections, и поменяйте число. Сохраните файл: Ctrl+O, Enter, выход — Ctrl+X. Настройка применяется только при перезапуске:
sudo systemctl restart postgresqlПроверьте командой SHOW max_connections; из sudo -u postgres psql. В примерах — PostgreSQL 16 из Ubuntu 24.04. В Ubuntu 26.04 ставится PostgreSQL 18: в путях и командах вместо 16 подставьте 18.
Если ошибка too many connections for role
FATAL: too many connections for role "ivan"У пользователя базы свой предел подключений, его задают словами CONNECTION LIMIT. Поднимите предел или снимите его: -1 — без ограничения.
ALTER ROLE ivan CONNECTION LIMIT -1;Похожая ошибка too many connections for database "shop" — предел у самой базы. Снимается так же:
ALTER DATABASE shop CONNECTION LIMIT -1;Если предел поставили намеренно, лучше найти, кто держит подключения, — шаг 2.
Ошибки рядом
| Что видите | Что делать |
|---|---|
connection to server at … failed: Connection refused | база не принимает подключения |
FATAL: password authentication failed for user | не подошёл пароль |
FATAL: role "ivan" does not exist | такого пользователя в базе нет |
Источники
- Исходный код PostgreSQL 16: proc.c — текст sorry, too many clients already.
- Исходный код PostgreSQL 16: postinit.c — тексты remaining connection slots are reserved и too many connections for database.
- Исходный код PostgreSQL 16: miscinit.c — тексты role does not exist, is not permitted to log in и too many connections for role.
- PostgreSQL 16: Connections and Authentication — listen_addresses, port, max_connections и superuser_reserved_connections; все меняются только перезапуском.
- PostgreSQL 16: The Cumulative Statistics System — представление pg_stat_activity: пользователь, база и состояние каждого подключения.
- PostgreSQL 16: System Administration Functions — pg_terminate_backend завершает подключение по номеру процесса.
- PostgreSQL 16: Architectural Fundamentals — для каждого подключения сервер базы запускает отдельный процесс.
- PostgreSQL 16: ALTER ROLE — LOGIN, CONNECTION LIMIT и VALID UNTIL 'infinity': пароль без срока.
- PostgreSQL 16: ALTER DATABASE — CONNECTION LIMIT: предел подключений к базе.
Сверено 14 октября 2026 года.
Что почитать дальше
- Ошибки PostgreSQLвсе разборы ошибок базы.
- Как установить PostgreSQL на Ubuntuустановка и где лежат настройки.
- Сервер для базы данныхкогда базе нужен отдельный VPS.