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...