DBAtlas · Atlas de operações de banco de dados

Definir statement_timeout / lock_timeout por role e banco

PostgreSQLSessões

Comando

-- 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.

Abrir no DBAtlas →

Relacionados