La réponse de voretaq7 couvre les points clés, y compris la bonne façon de terminer les backends, mais je voudrais ajouter un peu plus d'explications.
kill -9
(c.-à-d. SIGKILL
) ne devrait jamais, jamais, jamais être votre premier choix par défaut . Cela devrait être votre dernier recours lorsque le processus ne répond pas à ses demandes d'arrêt normales et qu'un SIGTERM
( kill -15
) n'a eu aucun effet. C'est vrai pour Pg et à peu près tout le reste.
kill -9
ne donne aucune chance au processus tué de faire un nettoyage.
En ce qui concerne PostgreSQL, Pg voit un sauvegardé qui se termine par kill -9
un crash sauvegardé . Il sait que le backend a peut-être corrompu la mémoire partagée - parce que vous auriez pu l'interrompre à mi-chemin en écrivant une page dans shm ou en en modifiant un, par exemple - donc il termine et redémarre tous les autres backends quand il remarque qu'un backend a soudainement disparu et est sorti avec un code d'erreur non nul.
Vous verrez cela signalé dans les journaux.
Si cela ne semble pas faire de mal, c'est parce que Pg redémarre tout après le crash et que votre application se rétablit proprement des connexions perdues. Cela n'en fait pas une bonne idée. Si rien d'autre n'est bloqué, les tests backend sont moins bien testés que les parties de Pg fonctionnant normalement et sont beaucoup plus compliqués / variés, donc les chances d'un bug qui se cache dans la gestion et la récupération des crashs backend sont plus élevées.
BTW, si vous kill -9
le postmaster puis supprimez postmaster.pid
et redémarrez sans vous assurer que chaque postgres
backend a disparu, de très mauvaises choses peuvent se produire . Cela peut facilement se produire si vous avez accidentellement tué le maître de poste au lieu d'un serveur principal, vu que la base de données était en panne, essayé de la redémarrer, supprimé le fichier .pid "périmé" lorsque le redémarrage a échoué et essayé de la redémarrer à nouveau. C'est l'une des raisons pour lesquelles vous devriez éviter de faire signe kill -9
à Pg et ne pas supprimer postmaster.pid
.
Une démonstration:
Pour voir exactement ce qui se passe lorsque vous êtes kill -9
un backend, essayez ces étapes simples. Ouvrez deux terminaux, ouvrez psql dans chacun et à chaque exécution SELECT pg_backend_pid();
. Dans un autre terminal, l' kill -9
un des PID. Maintenant, exécutez SELECT pg_backend_pid();
à nouveau dans les deux sessions psql. Remarquez comment ils ont tous deux perdu leurs connexions?
Session 1, que nous avons tuée:
$ psql regress
psql (9.1.4)
Type "help" for help.
regress=# select pg_backend_pid();
pg_backend_pid
----------------
6357
(1 row)
[kill -9 of session one happens at this point]
regress=# select pg_backend_pid();
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
regress=# select pg_backend_pid();
pg_backend_pid
----------------
6463
(1 row)
Session 2, qui portait sur les dommages collatéraux:
$ psql regress
psql (9.1.4)
Type "help" for help.
regress=# select pg_backend_pid();
pg_backend_pid
----------------
6283
(1 row)
[kill -9 of session one happens at this point]
regress=# select pg_backend_pid();
WARNING: terminating connection because of crash of another server process
DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
HINT: In a moment you should be able to reconnect to the database and repeat your command.
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
regress=# select pg_backend_pid();
pg_backend_pid
----------------
6464
(1 row)
Vous voyez comment les deux sessions ont été interrompues? C'est pourquoi vous n'avez pas de kill -9
backend.
pg_terminate_backend
, pas avec un redémarrage de la pile du serveur, pas avec quoi que ce soit, vous pouvez le tuer comme vous le souhaitez, mais assurez-vous d'avoir une sauvegarde de travail de votre base de données. Vous pouvez le faire de deux manières: vous pouvez utiliserpg_basebackup
ou similaire (ou simplementrsync
etpg_start\stop_backup
) pour sauvegarder votre répertoire de données (tester les sauvegardes avant de continuer!), Ou vous pouvez utiliserpg_dump[all]
pour récupérer vos données. C'est seulement alors que vous devriez envisagerkill -9
, ou un redémarrage, ou autre chose.postmaster.pid
. Déjà.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 les backends Postgres comme ça - des choses TERRIBLES peuvent se produire (même avec toutes les améliorations de stabilité qui ont été apportées depuis les jours 7.x) qui peuvent détruire toute votre base de données, et votre développeur a tout à fait raison de mâcher vous pour faire cela.
Il y a, en fait, une manière bénie et approuvée de le faire à partir de Postgres - C'est même dans le manuel de Postgres bien que SO post fasse un meilleur travail pour l'expliquer ...
SELECT pg_cancel_backend(pid)
Envoie un
SIGINT
signal cancel ( ) au backend spécifié, ce qui annule la requête en cours d'exécution.select pg_terminate_backend(pid)
Envoie un
SIGTERM
signal terminate ( ) au backend spécifié, ce qui annule la requête et abandonne le backend (abandon de sa connexion).Les ID de backend peuvent être obtenus à partir de la
pg_stat_activity
table (oups
)la source
kill -9
n'est pas différent de mettre soudainement le système hors tension en ce qui concerne le processus tué: Pg est très tolérant aux plantages de backend (comme akill -9
) et il ne devrait jamais y avoir de corruption de données. Il y aura corruption si vous tuez le postmaster , supprimez postmaster.pid et redémarrez-le sans tuer également chaque backend en premier. Cela va détruire votre base de données, mais prend beaucoup plus qu'un simplekill -9
à un back - end.kill -9
ne donne pas le temps au maître de poste de tuer les backends, c'est pourquoi c'est dangereux.postmaster.pid
.Tuer un processus client PostgreSQL devrait être correct. Tuer un processus de démon PostgreSQL pourrait vous faire gronder.
Étant donné que les démons SQL disposent également de contrôles de processus internes, la méthode préférée consiste à essayer d'utiliser ce canal en premier.
Voir Arrêter (longtemps) l'exécution d'une requête SQL dans PostgreSQL ... à partir de StackOverflow.
la source
kill -9
ne devrait jamais être votre choix par défaut de toute façon, c'est un dernier recours. Envoyez unSIGTERM
aveckill -TERM
ou en clairkill
et si le destinataire ne répond pas après un certain temps, alors seulement vous devriez considérerkill -KILL
(kill -9
).