DBAtlas · Атлас эксплуатации баз данных

Задать 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.

Открыть в DBAtlas →

Связанные материалы