Comment déboguer une requête inactive?

13

J'ai une requête batch que j'exécute quotidiennement sur ma base de données. Cependant, il semble rester bloqué à l'état inactif, et j'ai beaucoup de difficulté à déboguer ce qui se passe.

La requête est une agrégation sur une table qui est simultanément insérée, ce qui, je suppose, est en quelque sorte lié au problème. (L'agrégation est basée sur les données des jours précédents, donc les insertions ne devraient pas affecter les résultats.)

Des indices

  1. J'exécute cela dans un script python en utilisant sqlalchemy. Cependant, j'ai défini le niveau de transaction sur l'autocommit, donc je ne pense pas que les choses soient enveloppées dans une transaction. D'un autre côté, je ne vois pas la requête se bloquer lorsque je l'exécute manuellement dans le terminal SQL.

  2. En interrogeant pg_stat_activity, la requête vient initialement dans la base de données en tant que state='active'. Après peut-être 15 secondes, l'état passe à `` inactif '' et en outre, le xact_startest défini sur NULL. L'indicateur d'attente n'est jamais défini sur true.

  3. Avant de comprendre la validation automatique au niveau de la transaction pour sqlalchemy, elle se bloquait plutôt dans l'état 'idle in transaction'plutôt que 'idle'. Et il se bloque peut-être un peu moins fréquemment depuis ce changement?

Je sens que je ne suis pas équipé pour creuser plus profondément que je ne l'ai fait à ce sujet. Tout commentaire, même en expliquant davantage sur les différents états et les internes postgres pertinents sans donner de réponse définitive, serait grandement apprécié.

Kurt Spindler
la source
2
Si l'état est inactif et qu'il n'attend PAS, la requête est terminée mais la connexion à la base de données n'est pas fermée. inactif dans la transaction, signifie également que la requête est terminée, mais aucune COMMITn'a été émise pour mettre fin à la transaction. Il semble que votre problème soit ailleurs que dans la base de données ..
Joishi Bodio
Ya, je pense que tu as raison. Le problème est dans la façon dont Python gère la requête, pas un problème avec la base de données.
Kurt Spindler

Réponses:

6

La première chose que vous devez séparer ici sont les mots requête , transaction et connexion .

  1. Indice: votre requête est exécutée - elle est à l'état actif. Après cela, la requête se termine mais la connexion reste activée - l'état inactif. Il n'y a pas de transaction (elle a été validée) donc le xact_startest nul. Vous devez donc fermer la connexion une fois la requête réussie.

  2. Indice: Avant que l'autocommit ne soit activé, la requête a été laissée au milieu de la transaction, vous devez donc d'abord commitet ensuite close connection.

Simo Kivistö
la source