Come eseguire il debug di una query inattiva?


13

Ho una query batch che eseguo quotidianamente sul mio database. Tuttavia, sembra rimanere bloccato allo stato inattivo e sto riscontrando molte difficoltà durante il debug di ciò che sta succedendo.

La query è un'aggregazione su una tabella che viene contemporaneamente inserita, che suppongo sia in qualche modo correlata al problema. (L'aggregazione è sui dati dei giorni precedenti, quindi gli inserimenti non dovrebbero influire sui risultati.)

indizi

  1. Sto eseguendo questo all'interno di uno script Python usando sqlalchemy. Tuttavia, ho impostato il livello di transazione su autocommit, quindi non credo che le cose si stiano avvolgendo all'interno di una transazione. D'altra parte, non vedo la query bloccarsi quando la eseguo manualmente nel terminale sql.

  2. Interrogando pg_stat_activity, la query inizialmente entra nel database come state='active'. Dopo forse 15 secondi, lo stato cambia in 'inattivo' e, inoltre, xact_startè impostato su NULL. La bandiera di attesa non è mai impostata su true.

  3. Prima di capire l'autocommit a livello di transazione per sqlalchemy, sarebbe invece rimasto nello stato 'idle in transaction'piuttosto che 'idle'. E forse si blocca leggermente meno frequentemente da quando ha fatto quel cambiamento?

Mi sento come se non fossi equipaggiato per scavare più a fondo di quello che ho su questo. Qualsiasi feedback, anche spiegando di più su diversi stati e relativi postgres interni senza dare una risposta definitiva, sarebbe molto apprezzato.


2
Se lo stato è inattivo e NON è in attesa, la query è completa ma la connessione al db non è chiusa. inattivo nella transazione, inoltre, significa che la query è completa ma non COMMITè stata emessa alcuna richiesta per terminare la transazione. Sembra che il tuo problema potrebbe essere altrove rispetto al db ..
Joishi Bodio,

Ya, penso che tu abbia ragione. Il problema riguarda il modo in cui Python gestisce la query, non un problema con il database.
Kurt Spindler,

Risposte:


6

La prima cosa che devi separare qui sono le parole query , transazione e connessione .

  1. Indizio: la tua query viene eseguita - è nello stato attivo. Dopodiché la query termina ma la connessione rimane attiva - lo stato inattivo. Non vi è alcuna transazione (è stato eseguito il commit) quindi xact_startè nullo. Quindi devi chiudere la connessione dopo che la query ha esito positivo.

  2. Indizio: prima che l'autocommit fosse sulla query veniva lasciato nel mezzo della transazione, quindi prima dovevi farlo commite poi close connection.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.