È una funzione PostgreSQL che termina completamente la connessione di un processo, chiudendo la sessione e annullando la transazione in corso.
Accetta come parametro il PID, ovvero l'ID del processo attivo.
Cosa fa questa funzione?
La funzione invia un segnale SIGTERM al processo, che viene terminato immediatamente. A differenza di pg_cancel_backend, la sessione viene chiusa e il client dovrà riconnettersi.
⚠️ Usa il codice con cautela
SELECT pg_terminate_backend(1234)
Qual è la differenza con pg_cancel_backend()?
pg_cancel_backend |
pg_terminate_backend |
|
|---|---|---|
| Cosa fa | Annulla la query in corso | Chiude la connessione |
| La sessione rimane aperta? | ✅ Sì | ❌ No |
| Segnale inviato | SIGINT |
SIGTERM |
| Meno invasivo? | ✅ Sì | ❌ No |
Preferisci sempre pg_cancel_backend come primo tentativo. Ricorri a pg_terminate_backend se la sessione non risponde al cancel.
Caso d'uso con pg_stat_activity
Nella pratica il PID si ricava dalla vista pg_stat_activity. Questo esempio termina tutte le sessioni in stato idle in transaction da più di 10 minuti:
idle in transactionsignifica che la sessione ha aperto una transazione conBEGINoSTART TRANSACTIONma non sta eseguendo nessuna query — sta semplicemente aspettando, con la transazione ancora aperta. Perchè è pericoloso? Finché la transazione resta aperta, la sessione può tenere lock su righe o tabelle che ha modificato, bloccando tutte le altre sessioni che vogliono accedere a quelle stesse risorse.
⚠️ Usa il codice con cautela
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'idle in transaction'
AND now() - state_change > interval '10 minutes';
Note
Richiede il ruolo
pg_signal_backend(o superuser) per agire su sessioni altrui.-- mostra se l'utente corrente ha il ruolo `pg_signal_backend` SELECT rolsuper AS is_superuser, pg_has_role(CURRENT_USER, 'pg_signal_backend', 'MEMBER') AS has_pg_signal_backend FROM pg_roles WHERE rolname = CURRENT_USER;
- La funzione restituisce
truese il segnale è stato inviato con successo,falsese il processo non esiste. - A differenza di
pg_cancel_backend, il terminate è efficace anche su sessioni in statoidle in transaction.