web-dev-qa-db-fra.com

Tuer -9 un processus postgres

A Postgres Sélectionnez la requête hors de contrôle sur notre serveur DB et a commencé à manger des tonnes de mémoire et d'échange jusqu'à ce que le serveur a manqué de mémoire. J'ai trouvé le processus particulier via ps aux | grep postgres et couru kill -9 pid. Cela a tué le processus et la mémoire libérée comme prévu. Le reste des requêtes du système et des postgres ne semblait pas non affectée. Ce serveur exécute Postgres 9.1.3 sur SLES 9 SP4.

Cependant, l'un de nos développeurs m'a mâché pour avoir tué un processus postgres avec kill -9, disant que cela dépendra tout le service Postgres. En réalité, ce n'est pas. Je l'ai fait avant une poignée de fois et je n'ai vu aucun effet secondaire négatif.

Avec cela dit, et après une lecture supplémentaire, il ressemble à kill pid Sans les drapeaux est le moyen privilégié de tuer un processus de Postgres en fuite, mais par d'autres utilisateurs de la communauté des postgres, cela ressemble également à Postgrese a "obtenu mieux" au fil des ans, de sorte que kill -9 Sur un processus de requête/thread individuel n'est plus une peine de mort.

Quelqu'un peut-il éclairer de la manière appropriée de tuer un processus de Postgres roulant ainsi que de la désastreuse (ou bénigne) utilisant kill -9 est avec des postgres ces jours-ci? Merci pour l'aperçu.

25
Banjer

I found the particular process via ps aux | grep postgres and ran kill -9 pid.
NON! MAUVAIS! Éloignez-vous du backend!

Sérieusement - ne tuez pas que les backends postgres comme ça - des choses terribles peuvent arriver (même avec toutes les améliorations de stabilité qui ont été faites depuis les 7.x jours) qui peuvent détruire toute votre DB et votre développeur est tout à fait de mâcher vous sortir pour faire cela.

En fait, il y a, en fait, n moyen béni et approuvé de le faire à l'intérieur des postgres - c'est même dans le manuel des postgres bien que cela SO = Post fait un meilleur travail d'explication ...

SELECT pg_cancel_backend(pid)
Envoie un signal d'annulation (SIGINT) sur le backend spécifié, qui annule la requête en cours d'exécution.

select pg_terminate_backend(pid)
[.____] Envoie une terminaison (SIGTERM) signal sur le backend spécifié, qui annule la requête et abandonne le backend (déposant sa connexion).

Les identifiants backend peuvent être obtenus à partir de la table pg_stat_activity (Ou ps)

29
voretaq7

Tuer un processus client PostgreSQL devrait être bien. Tuer un processus de démon postgreSQL pourrait vous faire gronder.

Étant donné que les démons SQL ont également des contrôles de processus internes, la manière préférée est d'essayer d'utiliser ce canal en premier.

Voir Stop (long) Query SQL dans PostgreSQL ... de Stackoverflow.

8
Jeff Ferland