Trouver les transactions longues et 'idle in transaction'
PostgreSQLSessionsCommande
SELECT pid,
usename,
datname,
application_name,
client_addr,
state,
now() - xact_start AS xact_age,
now() - state_change AS in_state_for,
backend_xid,
age(backend_xmin) AS xmin_age,
left(regexp_replace(query, '\s+', ' ', 'g'), 100) AS last_query
FROM pg_stat_activity
WHERE xact_start IS NOT NULL
AND backend_type = 'client backend'
AND pid <> pg_backend_pid()
AND (now() - xact_start > interval '5 minutes' OR state LIKE 'idle in transaction%')
ORDER BY xact_start;Ce que fait la commande
Affiche les sessions dont la transaction ouverte a plus de 5 minutes ou qui restent inactives au sein d'une transaction ; avec l'âge de la transaction, le temps passé dans l'état courant, le XID attribué et l'âge du xmin qu'elles retiennent.
Quand l'utiliser
Lorsque le bloat augmente, que VACUUM signale 'dead row versions cannot be removed yet', pendant des attentes de verrous, ou lorsqu'une fuite du pool de connexions est suspectée.
Attention
Les transactions longues (surtout REPEATABLE READ/SERIALIZABLE ou celles qui gardent des curseurs ouverts) retiennent l'horizon de nettoyage de VACUUM (xmin horizon) via backend_xmin, ce qui provoque du bloat et le vieillissement des XID dans toute la base. 'idle in transaction (aborted)' est une session qui a rencontré une erreur et attend un ROLLBACK. Correction permanente : idle_in_transaction_session_timeout par rôle et des limites de transaction correctes dans l'application.
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)
- Terminer en masse, de façon contrôlée, les longues sessions 'idle in transaction'