Blog JSystems - uwalniamy wiedzę!

Szukaj
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);

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

select * from pg_stat_activity;
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);

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

select pg_cancel_backend(613543);

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.

Baner szkolenia Administracja, replikacja i tuning baz danych PostgreSQL w JSystems, terminy gwarantowane

Szkolenie Administracja, replikacja i tuning baz danych PostgreSQL →

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Do czego służy funkcja pg_cancel_backend w PostgreSQL?
Funkcja pg_cancel_backend przerywa zapytanie wykonywane w innej sesji, nie rozłączając samej sesji. Przydaje się, gdy jakieś zapytanie wisi lub wykonuje się bardzo długo, a chcesz je zatrzymać, zostawiając połączenie aktywne.
Czym różni się pg_cancel_backend od pg_terminate_backend?
pg_cancel_backend przerywa tylko wykonywane zapytanie i pozostawia sesję nietkniętą. pg_terminate_backend idzie dalej i rozłącza całą sesję. Gdy chcesz jedynie zatrzymać jedno zadanie, sięgasz po pg_cancel_backend.
Jak znaleźć identyfikator sesji, którą chcę przerwać?
Identyfikator procesu, czyli pid, znajdziesz w widoku systemowym pg_stat_activity, odpytując go zwykłym poleceniem SELECT. Ten widok pokazuje aktywne sesje wraz z ich pidami, których używasz jako argumentu funkcji przerywającej.
Jaki argument przyjmuje pg_cancel_backend?
Funkcja przyjmuje pid procesu obsługującego sesję, którą chcesz przerwać. Ten pid odczytujesz wcześniej z widoku pg_stat_activity, a następnie przekazujesz go do funkcji, wywołując ją z osobnej, drugiej sesji.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...