DEV Community

Andrzej Klusiewicz
Andrzej Klusiewicz

Posted on

Rozlaczanie sesji w PostgreSQL komenda pg_terminate_backend - kompletny przewodnik

Czasem samo anulowanie zapytania nie wystarczy i trzeba zerwac cala sesje do PostgreSQL - do tego sluzy pg_terminate_backend. Pokazujemy kiedy i jak go stosowac bezpiecznie.

Z tego artykułu dowiesz się:

  • jak określić identyfikator PID niechcianej sesji,- jak natychmiast rozłączyć niechcianą sesję,- jak uniemożliwić użytkownikowi ponowne podłączenie się.

Aby rozłączyć sesję użytkownika, będziemy potrzebowali jego PID. Wartość tę znajdziemy dzięki słownikowi "pg_stat_activity". Zobaczymy w nim listę wszystkich sesji (w tym wewnętrznych sesji PostgreSQL) wraz z informacją typu ip użytkownika, czy używanego przez niego programu. Na potrzeby przykładu tworzymy użytkownika "problemowy":

create user problemowy;
Enter fullscreen mode Exit fullscreen mode

Następnie podpinamy się jako ten użytkownik z pomocą "psql" i sprawdzamy aktualny czas:

psql -U problemowy -d postgres
select current_timestamp;
Enter fullscreen mode Exit fullscreen mode

PostgreSQL: ilustracja poglądowa

Chcemy teraz tę sesję "ubić". Wyszukujemy dane na temat sesji tego użytkownika w "pg_stat_activity":

select * from pg_stat_activity where usename='problemowy';
Enter fullscreen mode Exit fullscreen mode

PostgreSQL: ilustracja poglądowa (2)

Potrzebna nam wartość znajduje się w kolumnie "pid". Wartość z tej kolumny przekazujemy jako argument dla funkcji "pg_terminate_backend", by przerwać sesję:

select pg_terminate_backend(917507);
Enter fullscreen mode Exit fullscreen mode

Po przerwaniu sesji wracamy ponownie do połączenia użytkownika "problemowy" i ponownie usiłujemy sprawdzić czas:

PostgreSQL: ilustracja poglądowa (3)

Sesję udało się przerwać, choć jak widzimy, psql podłączył się od razu ponownie. Jeśli chcemy, możemy ubić sesję i natychmiast zablokować możliwość ponownego zalogowania się:

select pg_terminate_backend(917592);
alter user problemowy nologin;
Enter fullscreen mode Exit fullscreen mode

Po takiej operacji automatyczna próba ponownego połączenia się nie przechodzi:

PostgreSQL: ilustracja poglądowa (4)

Top comments (0)