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

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

Όπως έχουμε δει σε αντίστοιχα άρθρα για τον 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 θα επιστρέψει τα αποτελέσματα όπως παρακάτω:

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

Μοιράσου το

Αφήστε μία απάντηση