Que dois-je faire lorsque pg_cancel_backend ne fonctionne pas?

8

Si j'ai une requête Postgres de longue durée et que "kill [pid]" normal ne fonctionne pas et que pg_cancel_backend ne fonctionne pas, que dois-je faire?


la source

Réponses:

8

Vous ne devez jamais tuer -9 aucun processus postgres à moins que votre objectif ne soit de forcer la totalité du serveur. Vous pouvez tuer tout processus qui ne répond pas à un appel pg_cancel_backend () à partir du shell avec

kill <pid>

c'est-à-dire pas -9. Notez que j'ai vu à quelques reprises où même cela n'a pas fonctionné en raison du blocage du processus en attente dans une boucle de données sur une connexion réseau. Si je me souviens bien, tuer le processus client s'est occupé de cela.

mage2k
la source
8

http://www.postgresql.org/docs/current/static/server-shutdown.html

pg_cancel_backend équivaut à envoyer SIGINT au processus.
pg_terminate_backend également pour SIGTERM, mais si pg_cancel_backend ne fonctionne pas, je ne vois pas pourquoi pg_terminate_backend le ferait.

Si vous avez essayé ces options, vous pouvez essayer SIGQUIT. Les documents disent: " Ceci n'est recommandé qu'en cas d'urgence. "

(Si vous détestez vos données et espérez qu'elles meurent, vous pouvez utiliser SIGKILL. Mais je ne le ferais pas.)

Vous pouvez utiliser killdirectement ou pg_ctl kill.

Bribles
la source
+1 PostgreSQL utilise un processus par connexion, vous pouvez donc tuer un processus sans grand risque d'affecter d'autres connexions. Je ne sais pas s'il y a une chance de corruption de données, mais j'en doute vraiment.
David Pashley
J'ai pensé que l'envoi de kill -9 à un processus postgres était désastreux, car cela pourrait mettre la base de données en mode de récupération, ce qui pourrait la mettre hors service pendant plusieurs minutes.
1
stackoverflow.com/questions/920956/… Il semble que je me trompe.
Bribles
Ce lien concerne l'envoi de kill -9 au serveur . Je parle du pid d'une seule requête. Ou est-ce la même chose?
2
@Bribles veuillez ajouter un avertissement à votre message! SIGQUIT causera des PROBLÈMES GRAVES s'il est essayé. Je viens de le faire et cela a causé beaucoup de problèmes - J'aimerais pouvoir remonter dans le temps et m'empêcher de frapper cette touche Entrée!
ADTC
3

si vous avez un Postgres récent, vous pouvez essayer à la pg_terminate_backendplace.

Vitaly Kushner
la source
1

bribles a raison dans sa déclaration ci-dessus ...

SI vous essayez sur SHUTDOWNle serveur, pour moi cependant:

J'essaie simplement de supprimer les bases de données / schémas retirés, qui ont toujours une connexion persistante qu'ils ne lâcheront pas.

Donc, pour répondre à votre question,

Si j'ai une requête Postgres de longue durée ...

pg_cancel_backend ne fonctionne pas ...

que devrais-je faire?

NON LIÉ à l'arrêt du serveur en aucune façon.

J'ai également vu ce comportement de pg_cancel_backend()ne pas fonctionner. Et je voulais partager ma solution de travail.

Je n'ai pas vu de problème jusqu'à présent, avec aucune sorte de "perte" de données.

Encore une fois, je n'essaie pas non plus de supprimer les Activerequêtes.

- Je suis connecté en tant qu'UTILISATEUR "A" avec une session ou un PID de 777777.

- Et va essayer de forcer la déconnexion d'une autre session de l'UTILISATEUR "A" ouvert comme 123456789

- Qui est une connexion en sommeil, et c'est pourquoi je recherche également idledans mes requêtes ci-dessous.

SELECT * 
FROM pg_stat_activity 
WHERE pid = 123456789 
      AND STATE = 'idle';

- Tentative 1

SELECT pg_cancel_backend(pid) 
FROM pg_stat_activity 
WHERE pid = 123456789 
      AND STATE = 'idle';

- Assez intéressant, le résultat indique que l'annulation est VRAIE mais existe toujours.

SELECT * 
FROM pg_stat_activity 
WHERE pid = 123456789 
      AND STATE = 'idle';

- Tentative 2

SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE pid = 123456789 
      AND STATE = 'idle';

- Et maintenant ça n'existe pas ..

SELECT * 
FROM pg_stat_activity 
WHERE pid = 123456789 
      AND STATE = 'idle';

- REMARQUE: J'ai essayé d'utiliser des pid # ridicules pour empêcher les gens de copier-coller et de ruiner leur vie.

- REMARQUE: Par défaut, postgres vous permettra UNIQUEMENT de tuer les processus en cours d'exécution sous VOTRE connexion à USER,

- NOTE: mais vous le saviez déjà.

J'espère que cela t'aides. =)

~ Jay

JayRizzo
la source