PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Termina query sospesa (inattivo nella transazione)

Questa è una risposta generale di Postgres e non specifica per heroku

(La risposta stupida a questa domanda potrebbe essere ... riavvia semplicemente postgresql. Supponendo che non sia desiderabile o non un'opzione ...)

Trova il PID eseguendo questo sql:

SELECT pid , query, * from pg_stat_activity
  WHERE state != 'idle' ORDER BY xact_start;

(La query potrebbe richiedere una riparazione in base alla versione di postgres - eventualmente, seleziona * da pg_stat_activity). Troverai il pid nella prima colonna (a sinistra) ed è probabile che la prima riga (in alto) sia la query che desideri terminare. Presumo che il pid sia 1234 di seguito.

Puoi annullare una query tramite SQL (cioè senza accesso alla shell) purché sia ​​tua o disponga dell'accesso da super utente:

select pg_cancel_backend(1234);

Questa è una richiesta "amichevole" per annullare la query 1234 e, con un po' di fortuna, scomparirà dopo un po'. Alla fine, questo è più efficiente:

select pg_terminate_backend(1234);

Se hai accesso alla shell e permessi di root o postgres puoi farlo anche dalla shell. Per "cancellare" si può fare:

kill -INT 1234

e per "terminare", semplicemente:

kill 1234

NON:

kill -9 1234

... che spesso comporterà l'incendio dell'intero server postgres, quindi puoi anche riavviare postgres. Postgres è piuttosto robusto, quindi i dati non verranno danneggiati, ma consiglierei di non usare "kill -9" in ogni caso :-)

Una "transazione inattiva" di lunga durata spesso significa che la transazione non è stata terminata con un "commit" o un "rollback", il che significa che l'applicazione presenta bug o non è stata progettata correttamente per funzionare con i database transazionali. È opportuno evitare "transazioni inattive" di lunga durata, poiché possono anche causare gravi problemi di prestazioni.