Définir statement_timeout / lock_timeout par rôle et par base
PostgreSQLSessionsCommande
-- 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;Ce que fait la commande
Rend les paramètres de timeout persistants au niveau du rôle (et éventuellement de la base), afin que chaque charge s'exécute avec ses propres limites sans toucher au réglage global.
Quand l'utiliser
Pour éviter que des requêtes incontrôlées n'épuisent les ressources, que des files de DDL/verrous ne figent l'application, et que des transactions oubliées ne produisent du bloat.
Attention
Les réglages ne s'appliquent qu'aux NOUVELLES sessions ; recyclez les connexions existantes des pools. Les utilisateurs peuvent remplacer la valeur avec SET dans leur session ; ce n'est pas une frontière de sécurité. Ne définissez pas statement_timeout globalement dans postgresql.conf : les tâches de maintenance comme pg_dump, VACUUM et CREATE INDEX seraient aussi annulées. Priorité : rôle+base > rôle > base > postgresql.conf.
Voir aussi
- Terminer un backend (pg_terminate_backend)
- Annuler une requête en cours (pg_cancel_backend)
- Afficher les requêtes actives et bloquantes
- Construire l'arbre de blocage (trouver le bloqueur racine)
- Examiner en détail les attentes de verrous par objet et mode de verrou (pg_locks)
- Trouver les transactions longues et 'idle in transaction'