Definir statement_timeout / lock_timeout por role e banco
PostgreSQLSessõesComando
-- 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;O que faz
Torna os parâmetros de timeout persistentes em nível de role (e opcionalmente de banco), para que cada carga rode com seus próprios limites sem mexer na configuração global.
Quando usar
Para evitar que consultas desgovernadas esgotem recursos, que filas de DDL/lock congelem a aplicação e que transações esquecidas gerem bloat.
Atenção
As configurações valem apenas para NOVAS sessões; recicle as conexões existentes do pool. Os usuários podem sobrepor o valor com SET na própria sessão; isso não é uma barreira de segurança. Não defina statement_timeout globalmente no postgresql.conf: jobs de manutenção como pg_dump, VACUUM e CREATE INDEX também são cancelados. Precedência: role+banco > role > banco > postgresql.conf.
Relacionados
- Encerrar um backend (pg_terminate_backend)
- Cancelar uma consulta em execução (pg_cancel_backend)
- Mostrar consultas ativas e bloqueadoras
- Montar a árvore de bloqueios (encontrar o bloqueador raiz)
- Inspecionar em detalhe as esperas de lock por objeto e modo de lock (pg_locks)
- Encontrar transações longas e 'idle in transaction'