Задать statement_timeout / lock_timeout для роли и базы данных
PostgreSQLСессииКоманда
-- Application role: short queries, short lock waits, a limit on forgotten transactions
ALTER ROLE web_app SET statement_timeout = '30s';
ALTER ROLE web_app SET lock_timeout = '5s';
ALTER ROLE web_app SET idle_in_transaction_session_timeout = '10min';
-- Let the reporting role run longer, only in this database
ALTER ROLE report_app IN DATABASE mydb SET statement_timeout = '15min';
-- Show configured role/database settings
SELECT coalesce(r.rolname, '(all)') AS role,
coalesce(d.datname, '(all)') AS database,
s.setconfig
FROM pg_db_role_setting s
LEFT JOIN pg_roles r ON r.oid = s.setrole
LEFT JOIN pg_database d ON d.oid = s.setdatabase
ORDER BY 1, 2;
-- Revert
ALTER ROLE web_app RESET lock_timeout;Что делает
Делает параметры тайм-аутов постоянными на уровне роли (и при необходимости базы данных), чтобы каждая нагрузка работала со своими лимитами, не затрагивая глобальную настройку.
Когда использовать
Чтобы вышедшие из-под контроля запросы не исчерпывали ресурсы, очереди DDL/блокировок не замораживали приложение, а забытые транзакции не создавали раздувание.
Внимание
Настройки применяются только к НОВЫМ сессиям; пересоздайте существующие подключения пула. Пользователи могут переопределить значение через SET в своей сессии; это не граница безопасности. Не задавайте statement_timeout глобально в postgresql.conf: задания обслуживания, такие как pg_dump, VACUUM и CREATE INDEX, тоже будут отменяться. Приоритет: роль+база данных > роль > база данных > postgresql.conf.
Связанные материалы
- Завершить backend (pg_terminate_backend)
- Отменить выполняющийся запрос (pg_cancel_backend)
- Показать активные и блокирующие запросы
- Построить дерево блокировок (найти корневой блокирующий процесс)
- Детально изучить ожидания блокировок по объектам и режимам блокировки (pg_locks)
- Найти долгие транзакции и транзакции в состоянии 'idle in transaction'