Definir statement_timeout / lock_timeout por rol y base de datos
PostgreSQLSesionesComando
-- 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;Qué hace
Hace persistentes los parámetros de timeout a nivel de rol (y opcionalmente de base de datos), de modo que cada carga de trabajo se ejecute con sus propios límites sin tocar el ajuste global.
Cuándo usarlo
Para evitar que consultas desbocadas agoten los recursos, que las colas de DDL/bloqueos congelen la aplicación y que las transacciones olvidadas generen bloat.
Precaución
Los ajustes solo se aplican a las sesiones NUEVAS; recicle las conexiones existentes del pool. Los usuarios pueden sobrescribir el valor con SET en su sesión; no es una barrera de seguridad. No defina statement_timeout globalmente en postgresql.conf: también se cancelarían jobs de mantenimiento como pg_dump, VACUUM y CREATE INDEX. Precedencia: rol+base de datos > rol > base de datos > postgresql.conf.
Relacionado
- Terminar un backend (pg_terminate_backend)
- Cancelar una consulta en ejecución (pg_cancel_backend)
- Mostrar consultas activas y bloqueantes
- Construir el árbol de bloqueos (encontrar el bloqueador raíz)
- Inspeccionar en detalle las esperas de bloqueo por objeto y modo de bloqueo (pg_locks)
- Encontrar transacciones de larga duración e 'idle in transaction'