J'utilise Heroku avec l'option Crane Postgres et j'exécutais une requête sur la base de données à partir de ma machine locale lorsque ma machine locale s'est plantée. Si je cours
select * from pg_stat_activity
l'une des entrées a
<IDLE> in transaction
dans la colonne current_query_text.
Par conséquent, je ne peux pas supprimer la table sur laquelle était écrite la requête terminée. J'ai essayé d'utiliser pg_cancel_backend (N) et il renvoie True mais rien ne semble se produire.
Comment puis-je mettre fin à ce processus afin de pouvoir supprimer la table?
postgresql
heroku
Alan
la source
la source
Réponses:
Ceci est une réponse Postgres générale, et non spécifique à heroku
(La réponse simple-stupide à cette question peut être ... il suffit de redémarrer postgresql. En supposant que ce n'est pas souhaitable ou pas une option ...)
Trouvez le PID en exécutant ce sql:
(La requête peut avoir besoin d'être réparée en fonction de la version de postgres - éventuellement, sélectionnez simplement * dans pg_stat_activity). Vous trouverez le pid dans la première colonne (à gauche) et la première ligne (en haut) est probablement la requête que vous souhaitez terminer. Je suppose que le pid est 1234 ci-dessous.
Vous pouvez annuler une requête via SQL (c'est-à-dire sans accès shell) tant qu'elle vous appartient ou que vous disposez d'un accès super utilisateur:
C'est une demande "amicale" pour annuler la requête 1234, et avec un peu de chance, elle disparaîtra après un certain temps. Finalement, c'est plus efficace:
Si vous avez un accès au shell et des autorisations root ou postgres, vous pouvez également le faire depuis le shell. Pour "annuler" on peut faire:
et pour "terminer", il suffit:
NE PAS:
... Cela entraînera souvent un incendie dans tout le serveur postgres, alors vous pouvez aussi redémarrer postgres. Postgres est assez robuste, donc les données ne seront pas corrompues, mais je recommande de ne pas utiliser "kill -9" dans tous les cas :-)
Un «inactif dans la transaction» de longue durée signifie souvent que la transaction n'a pas été terminée par un «commit» ou un «rollback», ce qui signifie que l'application est boguée ou n'est pas correctement conçue pour fonctionner avec des bases de données transactionnelles. Une «inactivité dans la transaction» de longue durée doit être évitée, car elle peut également entraîner des problèmes de performances majeurs.
la source
select version()
. Recevez-vous des messages d'erreur lors de l'utilisationpg_cancel_backend
?Essaye ça:
Pour en savoir plus, cliquez ici . Cela devrait être une solution «plus propre» de ce problème que de tuer processus par système.
la source
Vous pouvez installer le
heroku-pg-extras
module complémentaire et exécuter la commande suivante pour obtenir le PID:Alors faites simplement:
REMARQUE : l'
--force
option peut être utilisée pour émettre pg_terminate_backend qui supprime toute la connexion pour cette requête.Si
heroku pg:locks
ne répertorie rien, essayezheroku pg:ps
.Pour plus d'informations, consultez:
https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall
la source
Nous pouvons utiliser ce qui suit pour y parvenir en une seule requête:
la source
SELECT pid, pg_cancel_backend(pid) FROM pg_stat_activity WHERE state != 'idle' AND (now() - query_start) > interval '5 minutes';