Πώς βρίσκουμε ποια queries τρέχουν αυτή τη στιγμή σε PostgreSQL βάση δεδομένων

Τελευταίες δημοσιεύσεις από Stratos Matzouranis (Προβολή όλων)
- Πώς βρίσκουμε ποια queries τρέχουν αυτή τη στιγμή σε PostgreSQL βάση δεδομένων - 9 Νοέμβριος 2026
- Τι είναι η TimescaleDB (Tiger Data) και πώς διαχειριζόμαστε Time-Series δεδομένα στη PostgreSQL - 2 Νοέμβριος 2026
- Πώς κάνουμε χρήση του pgvector στην PostgreSQL για AI και Vector Search - 26 Οκτώβριος 2026
Όπως έχουμε δει σε αντίστοιχα άρθρα για τον SQL Server και Oracle Database, η παρακολούθηση των ενεργών queries σε πραγματικό χρόνο είναι βασικό εργαλείο στα χέρια ενός DBA για τον εντοπισμό bottlenecks, long-running queries και blocking sessions. Στην PostgreSQL αυτό γίνεται με το ενσωματωμένο view pg_stat_activity.
Μέσα από αυτό το query μπορούμε να δούμε τα παρακάτω:
db_name: Εμφανίζει τη βάση δεδομένων στην οποία συνδέεται και εκτελείται η διεργασία.session_id(pid): Προσδιορίζει μοναδικά το backend process της σύνδεσης.login_name: Το όνομα χρήστη (username) με το οποίο έχει πραγματοποιηθεί η σύνδεση στη βάση.host_ip: Η διεύθυνση IP του πελάτη (client) από τον οποίο προέρχεται η σύνδεση.program_name: Η εφαρμογή ή το εργαλείο που χρησιμοποιείται για τη σύνδεση (π.χ. pgAdmin, εφαρμογή παραγωγής).state: Η τρέχουσα κατάσταση της διεργασίας (π.χ. active, idle in transaction).elapsed_time_secs: Πόσα δευτερόλεπτα τρέχει το τρέχον query.blocking_session_ids: Επιστρέφει ποια PIDs κρατούν locks και μπλοκάρουν το συγκεκριμένο session (αντίστοιχο τουblocking_session_idστον SQL Server).wait_event_type&wait_event: Μας δείχνουν επακριβώς την αιτία αναμονής (π.χ. I/O, Lock, Client).query: Το πλήρες κείμενο του SQL query που εκτελείται από τη διεργασία εκείνη τη στιγμή.cancel_cmd&kill_cmd: Παράγουν αυτόματα έτοιμες εντολές SQL (pg_cancel_backendγια ασφαλή διακοπή μόνο του query ήpg_terminate_backendγια ολικό κλείσιμο του session/connection) ώστε να μπορούμε να επέμβουμε άμεσα σε περίπτωση προβλήματος.
Το Query
Το μόνο που έχουμε να κάνουμε είναι να τρέξουμε το παρακάτω select query:
SELECT
current_database() AS db_name,
pid AS session_id,
usename AS login_name,
client_addr AS host_ip,
application_name AS program_name,
state,
ROUND(EXTRACT(EPOCH FROM (clock_timestamp() - query_start))::numeric, 2) AS elapsed_time_secs,
pg_blocking_pids(pid) AS blocking_session_ids,
wait_event_type,
wait_event,
format('SELECT pg_cancel_backend(%s);', pid) AS cancel_cmd,
format('SELECT pg_terminate_backend(%s);', pid) AS kill_cmd
FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND state <> 'idle'
ORDER BY elapsed_time_secs DESC;
Το αποτέλεσμα
Τρέχοντας το query θα επιστρέψει τα αποτελέσματα όπως παρακάτω:


