Jak wyżej, coś w bazie mieli a my nie chcemy czekać aż się skończy i pojawi w logu wtylko chcemy podejrzeć teraz. To tak:
1. W postgresql.conf ustawiamy stats_command_string = true
2. Restart bazy (pg_ctl reload mi nie pomógł, ale akurat testowałem na starej wersji 7.4)
3. I tyle ;]. Teraz pare SQLi żeby wyciągnąć interesujące nas dane:
Podstawowa:
select * from pg_stat_activity;
Pokazuje wszystko co się aktualnie dzieje w bazie. Ale jeżeli chcemy wyciągnąć tylko długo działające to np.
select *, (now() - query_start) as time from pg_stat_activity where now()-query_start > time '00:00:10'
pokaże te działające dłużej niż 10 sekund. można nawet się pokusić o jakiś prosty skrypt logujący co się dzieje.
PGPASSWORD=some_pass /usr/bin/psql -h 1.2.3.4 -p5404 -U backup postgres -c "select now(), *, (now() - query_start) as time from pg_stat_activity where now()-query_start > time '00:00:10';" -A -t
a potem to wysłać albo do pliku albo przez mail do admina


2 ResponsesLeave a comment ?
I co ważne dostajemy też PID procesu odpowiedzialnego za to zapytanie. W krytycznych sytuacjach można killnąć ten proces bez szkody dla całej bazy – cofnie się tylko jedna transakcja.
Gorzej gdy zatka bazę na tyle że nie będzie się można dostać do tabeli, ale to mi sie na szczęście nie zdarzylo. Ale wtedy zawsze można killnąć z top