DEV Community

Andrzej Klusiewicz
Andrzej Klusiewicz

Posted on

PostgreSQL: jak anulowac zawieszone zapytanie przez pg_cancel_backend

Zawieszone zapytanie potrafi zablokowac cala baze produkcyjna - pg_cancel_backend to pierwsze narzedzie ratunkowe administratora PostgreSQL. Pokazujemy jak go bezpiecznie uzyc.

Z tego artykułu dowiesz się:

  • jak przerwać wykonywanie zapytania SQL w innej sesji bez przerywania tej sesji.

Jeśli w jakiejś sesji “wisi” zapytanie lub wykonuje się długo i chcielibyśmy to zadanie przerwać, stosujemy funkcję pg_cancel_backend(pid).
Różni się ona od pg_terminate_backend tym, że pg_terminate_backend rozłącza całą sesję, a pg_cancel_backend przerywa tylko wykonywane w ramach wskazanej sesji zapytanie nie rozłączając sesji.

W pierwszej kolejności podłączam sesję z pomocą psql i przygotowuję sobie tabelę do której będę wrzucał dużo danych. To właśnie wrzucanie danych będzie długo trwało i zostanie przerwane.


psql
create table big(x integer);
Enter fullscreen mode Exit fullscreen mode

Następnie - z osobnej sesji - namierzam sesję w słowniku pg_stat_activity:


select * from pg_stat_activity;
Enter fullscreen mode Exit fullscreen mode

PostgreSQL: ilustracja poglądowa

Nasza sesja ma pid 613543. Wracam do pierwszej sesji i uruchamiam teraz masowe ładowanie danych do tabeli big:


insert into big - select generate_series(1,10000000);
Enter fullscreen mode Exit fullscreen mode

W trakcie ładowania w pierwszej sesji wykonuję z drugiej sesji z użyciem pida pierwszej sesji:

select pg_cancel_backend(613543);
Enter fullscreen mode Exit fullscreen mode

Po wywołaniu tej komendy, ładowanie w pierwszej sesji zostaje przerwane z komunikatem:

PostgreSQL: ilustracja poglądowa (2)

Sesja trwa nadal, przerwane zostało tylko ładowanie danych.

Top comments (0)