Πώς μπορούμε να παρακολουθούμε με ένα report το performance (τύπου Oracle AWR) στη PostgreSQL με το pg_profile extension

- Πώς μπορούμε να παρακολουθούμε με ένα report το performance (τύπου Oracle AWR) στη PostgreSQL με το pg_profile extension - 5 Οκτώβριος 2026
- Πώς ενεργοποιούμε το Object και Session level Auditing σε PostgreSQL - 10 Αύγουστος 2026
- Πώς κάνουμε upgrade PostgreSQL σε νεότερη έκδοση - 23 Σεπτέμβριος 2026
Όταν διαχειριζόμαστε βάσεις δεδομένων PostgreSQL σε περιβάλλοντα παραγωγής, ένα από τα μεγαλύτερα ζητούμενα είναι ο εντοπισμός των queries και των διεργασιών που καταναλώνουν τους περισσότερους πόρους. Παρόλο που η PostgreSQL διαθέτει εξαιρετικά εργαλεία όπως το pg_stat_statements, συχνά χρειαζόμαστε ιστορικά workload reports για να αναλύσουμε τι ακριβώς συνέβη στο σύστημα πριν από μερικές ώρες ή ημέρες.
Σε αυτό το άρθρο θα δούμε πώς μπορούμε να εγκαταστήσουμε και να ρυθμίσουμε το pg_profile, extension, το οποίο λειτουργεί σαν ένα είδος AWR Report της Oracle για τη PostgreSQL, επιτρέποντάς μας να παίρνουμε ιστορικά snapshots και να εξάγουμε αναλυτικά HTML reports.
Τι είναι το pg_profile
Το pg_profile είναι ένα extension ανοιχτού κώδικα το οποίο κρατάει ιστορικό από samples.
Χρησιμοποιώντας το, μπορούμε:
- Να εντοπίσουμε ποια queries έριξαν την απόδοση της βάσης σε δεδομένο χρονικό διάστημα.
- Να παράγουμε έτοιμα HTML reports μεταξύ δύο χρονικών στιγμών (snapshots).
- Να αυτοματοποιήσουμε τη διαδικασία λήψης δειγμάτων.
Η εγκατάσταση
Για να δουλέψει σωστά το extension, θα χρειαστεί να ενεργοποιήσουμε πρώτα τα απαραίτητα extensions βάσης (dblink και pg_stat_statements), πρέπει να βεβαιωθούμε ότι στο postgresql.conf υπάρχει η βιβλιοθήκη pg_stat_statements:
su postgres vi $PGDATA/postgresql.conf
shared_preload_libraries = 'pg_stat_statements'
Κάνουμε restart το service:
sudo systemctl restart postgresql-14
Συνδεόμαστε στη βάση δεδομένων και ενεργοποιούμε τα extentions:
CREATE EXTENSION dblink; CREATE EXTENSION pg_stat_statements; CREATE EXTENSION pg_profile;
Πώς λαμβάνουμε Snapshot και βγάζουμε το Report
Αφού εγκατασταθεί το extension, μπορούμε να τρέξουμε χειροκίνητα τη λήψη ενός δείγματος (snapshot) με την εντολή:
SELECT snapshot();
Αφού περάσει κάποιο χρονικό διάστημα και τρέξουμε ξανά τη συνάρτηση, δημιουργούνται τα διαθέσιμα samples. Μπορούμε να δούμε τη λίστα τους με το παρακάτω query:
SELECT * FROM samples ORDER BY sample_id;

Δημιουργία HTML Report
Για να πάρουμε το report απόδοσης μεταξύ δύο snapshots (π.χ. από το ID 1 στο ID 2), εκτελούμε:
SELECT get_report(1, 2);

Το αποτέλεσμα είναι κώδικας HTML, τον οποίο μπορούμε να αντιγράψουμε, να τον αποθηκεύσουμε σε ένα αρχείο .html και να τον ανοίξουμε στον browser μας για να δούμε αναλυτικά τα στατιστικά της βάσης δεδομένων.

Αυτόματα Snapshots μέσω Cron Job
Επειδή η PostgreSQL δεν διαθέτει εσωτερικό job scheduler, ο επίσημος και πιο αξιόπιστος τρόπος για να αυτοματοποιήσουμε τη λήψη των snapshots είναι μέσω του cron του λειτουργικού συστήματος Linux, ακολουθώντας τη φιλοσοφία του δημιουργού του εργαλείου.
Για να γίνει αυτό ανοίγουμε το crontab του χρήστη postgres στο τερματικό:
sudo crontab -u postgres -e
Προσθέτουμε την παρακάτω γραμμή ώστε να εκτελείται η λήψη snapshot αυτόματα κάθε 1 ώρα:
0 * * * * psql -d db_test -c "SELECT snapshot();"
Snapshot Retention
Ένα κρίσιμο ζήτημα κατά τη συλλογή ιστορικών δεδομένων απόδοσης είναι η αποφυγή της ανεξέλεγκτης αύξησης του μεγέθους της βάσης. Το pg_profile διαθέτει retention policy η οποία ελέγχεται από την παράμετρο max_sample_age ανά server. Ορίζοντας για παράδειγμα το όριο σε 7 ημέρες μέσω της συνάρτησης:
SELECT set_server_max_sample_age('local', 7);
Με αυτό το τρόπο εξασφαλίζουμε ότι τα παλαιότερα snapshots καθαρίζονται αυτόματα από το ίδιο το extension κάθε φορά που εκτελείται η διαδικασία του νέου snapshot. Έτσι διατηρούμε μια σταθερή κατανάλωση αποθηκευτικού χώρου, απολαμβάνοντας ταυτόχρονα το απαραίτητο ιστορικό βάθος για τις αναλύσεις μας χωρίς χειροκίνητες παρεμβάσεις.
Για να δούμε την ρύθμιση του max_sample_age, τρέχουμε το παρακάτω:
SELECT server_id, server_name, connstr, enabled, max_sample_age FROM servers;

Εναλλακτικά μπορούμε να προσθέσουμε και ένα cron job ώστε καθαρίζουμε τα παλιά snapshots και να έχουμε retention 7 ημερών:
0 2 * * * psql -d db_test -c "DELETE FROM samples WHERE sample_time < NOW() - INTERVAL '7 days';"

