Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

PostgreSQL: Arret d'urgence des requètes

3 réponses
Avatar
Etienne
salut.

j'aimerai écrire une commande pour stopper dans l'urgence toute une
série de requete avant qu'un serveur de s'éffondre

j'identifie les requètes qui prennent un certains temps grace a cette
commande

SELECT procpid, now() - xact_start FROM pg_stat_activity WHERE
EXTRACT(epoch FROM now() - xact_start) > 10;

et je peux killer un process avec celle-ci

SELECT pg_cancel_backend(pid);

Mais je n'arrive pas a combiner les deux un truc genre

SELECT pg_cancel_backend(SELECT procpid FROM pg_stat_activity WHERE
EXTRACT(epoch FROM now() - xact_start) > 10);

Comment pourrais-je faire ca?

Merci
Etienne

3 réponses

Avatar
Sebastien Lardiere
On 03/14/2011 10:35 AM, Etienne wrote:
salut.




Bonjour,


j'aimerai écrire une commande pour stopper dans l'urgence toute une
série de requete avant qu'un serveur de s'éffondre

j'identifie les requètes qui prennent un certains temps grace a cette
commande

SELECT procpid, now() - xact_start FROM pg_stat_activity WHERE
EXTRACT(epoch FROM now() - xact_start) > 10;

et je peux killer un process avec celle-ci

SELECT pg_cancel_backend(pid);

Mais je n'arrive pas a combiner les deux un truc genre

SELECT pg_cancel_backend(SELECT procpid FROM pg_stat_activity WHERE
EXTRACT(epoch FROM now() - xact_start) > 10);

Comment pourrais-je faire ca?




Tout simplement :

SELECT
pg_cancel_backend(procpid)
FROM pg_stat_activity
WHERE EXTRACT(epoch FROM now() - xact_start) > 10
;


Et dans les versions >= 8.4, on peut aussi faire :

SELECT
pg_terminate_backend(procpid)
FROM pg_stat_activity
WHERE EXTRACT(epoch FROM now() - xact_start) > 10
;


Ce ne sont que des signaux envoyés aux backends, on peut faire la même
chose avec la commande kill : pg_cancel_backend() envoie un SIGINT et
pg_terminate_backend() un SIGTERM.


--
Sébastien
Avatar
Etienne
Le 14/03/2011 11:33, Sebastien Lardiere a écrit :
SELECT
pg_terminate_backend(procpid)
FROM pg_stat_activity
WHERE EXTRACT(epoch FROM now() - xact_start)> 10
;



Super Merci.
Juste pour être bien sur, cela arrête t-il proprement les requêtes où
existe t-il un risque pour que la base de données soit corrompue?

Ce ne sont que des signaux envoyés aux backends, on peut faire la même
chose avec la commande kill : pg_cancel_backend() envoie un SIGINT et
pg_terminate_backend() un SIGTERM.



Ah ouai, c'est pas trop bon ca.

Moi ce que je cherche ce serait plutôt un truc pour arrêter un requête
"proprement"
S'il s'agit d'un select, pas de problème.
Mais s'il s'agit d'une écriture et surtout d'une transaction, j'aimerai
être sûr que l'opération ne nuit pas a l'intégrité de la base.

Normalement ces commandes ne sont pas vouées à être utilisées. Mais bon
si un jour je dois le faire, j'aimerai autant être sûr que cela ne va
pas nuire aux données de la base.

Etienne
Avatar
Sebastien Lardiere
On 03/14/2011 12:09 PM, Etienne wrote:
Le 14/03/2011 11:33, Sebastien Lardiere a écrit :
SELECT
pg_terminate_backend(procpid)
FROM pg_stat_activity
WHERE EXTRACT(epoch FROM now() - xact_start)> 10
;



Super Merci.
Juste pour être bien sur, cela arrête t-il proprement les requêtes où
existe t-il un risque pour que la base de données soit corrompue?

Ce ne sont que des signaux envoyés aux backends, on peut faire la même
chose avec la commande kill : pg_cancel_backend() envoie un SIGINT et
pg_terminate_backend() un SIGTERM.



Ah ouai, c'est pas trop bon ca.

Moi ce que je cherche ce serait plutôt un truc pour arrêter un requête
"proprement"
S'il s'agit d'un select, pas de problème.
Mais s'il s'agit d'une écriture et surtout d'une transaction, j'aimerai
être sûr que l'opération ne nuit pas a l'intégrité de la base.

Normalement ces commandes ne sont pas vouées à être utilisées. Mais bon
si un jour je dois le faire, j'aimerai autant être sûr que cela ne va
pas nuire aux données de la base.




Je vais faire un raccourci, mais, en gros, ces signaux sont envoyés par
le noyau au processus pour lui demander de s'arrêter. Le processus
décide donc tout seul comment il doit s’arrêter ; et dans le cas de
PostgreSQL, c'est sûr et donc toutà fait utilisable.

Par contre, le signal SIGKILL ne permet pas un arrêt "propre" du process
; Il est donc à éviter !

--
Sébastien