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;

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:

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

Komentarze (0)

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

Brak komentarzy...