PostgreSQL: Niegrzeczni użytkownicy – kończenie sesji

4-lip-2021

Na każdym systemie są dobrzy admini i źli użytkownicy. Użytkownicy (bo przecież nie admini) mogą uruchomić polecenie, które zablokuje innych użytkowników lub skonsumuje zbyt wiele zasobów. Co w takim przypadku robić?

  1. Zidentyfikuj użytkownika – rozbójnika

Czasami identyfikacja nie jest łatwa, ale jeśli np. źródłem informacji o awarii jest przeciążony procesor, to taką identyfikację można rozpocząć na poziomie OS. Wyszukaj po prostu procesu, który konsumuje dużo CPU. Mająć PID procesu, można odszukać połączenie po stronie PG:

select * from pg_stat_activity where pid=XXX;

Tak dowiesz się między innymi, kiedy rozpoczęło się połączenie, transakcja, ostatnie zapytanie. Zobaczysz stan transakcji (np „idle transaction”, czyli w trakcie transakcji użytkownik poszedł na kawę), aplikację, serwer, nazwę użyszkodnika itp.

2. Spróbuj zakończyć aktualnie wykonywane zadanie

Jeśli przyczyną problemów jest intensywnie pracujące zapytanie, to można spróbować brutalnie je przerwać. Nie spowoduje to rozłączenia użytkownika:

select pg_cancel_backend(XXX);

3. Zamknij połączenie/sesję

Jeśli problem nadal występuje (np. użytkownik już nic nie robi, ale wcześniej założone blokady nadal uniemożliwiają pracę innym użytkownikom), to przerwij sesję zwalniając wszystkie zarezerwowane dla niej zasoby:

select pg_terminate_backend(XXX);

Jeśli tylko użyszkodnik został poprawnie zidentyfikowany w kroku (1), to ostatnie polecenie pomoże. Jeśli nie pomogło, to… no cóż… zabiliśmy kogoś innego przez pomyłkę… sorry

 

Komentarze są wyłączone

Autor: Rafał Kraik