DBAtlas · Atlas für Datenbankbetrieb

statement_timeout / lock_timeout je Rolle und Datenbank setzen

PostgreSQLSessions

Befehl

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

Was es tut

Macht Timeout-Parameter auf Ebene der Rolle (und optional der Datenbank) dauerhaft, sodass jede Workload mit eigenen Limits läuft, ohne die globale Einstellung anzufassen.

Wann einsetzen

Damit ausufernde Abfragen keine Ressourcen erschöpfen, DDL-/Sperr-Warteschlangen die Anwendung nicht einfrieren und vergessene Transaktionen keinen Bloat erzeugen.

Vorsicht

Einstellungen gelten nur für NEUE Sessions; bestehende Pool-Verbindungen recyceln. Benutzer können den Wert in ihrer Session mit SET überschreiben; dies ist keine Sicherheitsgrenze. Setze statement_timeout nicht global in postgresql.conf: Wartungsjobs wie pg_dump, VACUUM und CREATE INDEX werden sonst ebenfalls abgebrochen. Vorrang: Rolle+Datenbank > Rolle > Datenbank > postgresql.conf.

In DBAtlas öffnen →

Verwandte Einträge