Πώς μπορούμε να λαμβάνουμε email κάθε φορά που ξεπερνάει ένα όριο η μνήμη PGA σε βάση δεδομένων της Oracle
- Πώς συλλέγουμε to actual execution plan από τα queries με χρήση Extended Event και πως διαβάζουμε τα δεδομένα του - 2 Δεκέμβριος 2024
- Πώς βρίσκουμε τι δικαιώματα έχει ένας χρήστης σε βάση δεδομένων της Oracle - 1 Νοέμβριος 2024
- Πώς ενεργοποιούμε το Unified Auditing σε Oracle Database - 7 Οκτώβριος 2024
Όταν σε μία βάση δεδομένων της Oracle γίνεται βαρία χρήση από πολλά connections / sessions ενδέχεται κάποιο ή κάποια από αυτά να καταναλώνουν μεγάλο ποσοστό μνήμης (RAM). Αν υπάρξει πρόβλημα και αυτό δεν αντιμετωπιστεί λόγο έλλειψη μνήμης ενδέχεται να αρχίσει το λειτουργικό και η Oracle να σκοτώνουν sessions μόνα τους ανεξέλεχτα ακόμα μέχρι και να πέσει ολόκληρο το instance της βάσης.
Οπότε σε αυτό το άρθρο θα δούμε έναν τρόπο ώστε μόλις η μνήμη (RAM) και ποιο συγκεκριμένα η μνήμη που ονομάζεται PGA στην Oracle ξεπεράσει ένα όριο, να στέλνει ένα warning email που να περιέχει το μέγεθος της μνήμης και τις πληροφορίες του session που καταλαμβάνει την περισσότερη.
Τι είναι η μνήμη PGA
Η Program Global Area ή αλλιώς PGA είναι η μη κοινόχρηστη μνήμη που καταλαμβάνει το κάθε ξεχωριστό connection / session στη βάση. Η PGA χρησιμοποιείται για να αποθηκεύεται σε αυτή πληροφορίες για το session και να επεξεργάζονται τα SQL queries για διεργασίες όπως η ταξινόμηση.
Τα βήματα
Σε προηγούμενο άρθρο είχαμε δει πως μπορούμε να ρυθμίσουμε έναν Linux server (Oracle Linux βασισμένο σε RHEL συγκεκριμένα) ώστε να λαμβάνουμε email κάθε φορά που εμφανίζεται ένα error στο Alert log του instance της βάσης δεδομένων. Αντίστοιχα τώρα θα δούμε τα βήματα για να λαμβάνουμε email όταν η μνήμη PGA ξεπερνάει κάποιο όριο.
Δημιουργία SMTP relay με gmail της Google
Αν έχουμε δικό μας relay στον exchange server με ρυθμισμένο το smtp που θα στέλνει τα emails, αυτό το βήμα δεν το χρειαζόμαστε.
Θα δούμε τώρα όμως τι κάνουμε σε περίπτωση που θέλουμε να στέλνουμε τα emails μέσω Gmail.
Για αρχή θα πρέπει να συνδεθούμε στο gmail account security.
Εκεί θα πρέπει να ενεργοποιήσουμε το 2 factor authentication και έπειτα να δημιουργήσουμε application password.
Αφού πάρουμε τον κωδικό από το gmail, πάμε στον server μας και προσθέτουμε στο mail configuration το email μας μαζί με τον κωδικό που πήραμε:
[oracle@dp-gr ~]$ sudo vi /etc/mail.rc
account gmail { set smtp-use-starttls set ssl-verify=ignore set smtp-auth=login set smtp=smtp://smtp.gmail.com:587 set from="info@dataplatform.gr" set smtp-auth-user=dataplatform.gr@gmail.com set smtp-auth-password="edw_vazoume_to_app_password" set ssl-verify=ignore set nss-config-dir=/etc/pki/nssdb }
Είμαστε έτοιμοι να κάνουμε δοκιμή ότι μπορούμε να στείλουμε email:
[oracle@dp-gr ~]$ echo "Test" | /usr/bin/mail -A gmail -s "dokimastiko" ToEmailMas@outlook.com
Πώς θα βρίσκουμε την συνολική μνήμη PGA του instance και το session που καταναλώνει την περισσότερη
Φτιάχνουμε το παρακάτω script που εξάγει ένα warning μύνημα με την συνολική μνήμη PGA που καταλαμβάνουν όλα μαζί τα sessions του instance και τις πληροφορίες του session που καταλαμβάνει αυτή τη στιγμή την περισσότερη:
[oracle@dp-gr ~]$ vi check_pga.sql
set echo off set pagesize 0 set feedback off select 'Warning: Session''s Program Page Area (PGA) Memory on '|| (select instance_name from v$instance) || '@' ||(select host_name from v$instance)||' is too high!!! ---> ' ||to_char(pga_sum_gb, '999g999g990d00', 'NLS_NUMERIC_CHARACTERS=,.')|| ' GB' as PGA_Response FROM (select sum(pga_alloc_mem/1024/1024/1024) as pga_sum_gb from v$process) where pga_sum_gb > 0.01; -- DONT FORGET TO SWITCH SELECT 'Highest PGA Session: ' || ' PGA:' || to_char(p.pga_alloc_mem/1024/1024/1024, '999g999g990d00', 'NLS_NUMERIC_CHARACTERS=,.')||' GB ' || ' ---- LOGON: ' || to_char(h.LOGON_TIME,'YYYY/MM/DD HH:MI:SS') || ' ---- SID: ' || h.SID || ' ---- SERIAL: ' || h.SERIAL# || ' ---- PROCESS: ' || p.SPID || ' ---- USERNAME: ' || u.username || ' ---- OSUSER: ' || h.osuser || ' ---- MACHINE: ' || h.machine || ' ---- PROGRAM: ' || h.program || ' ---- MODULE: ' || h.module || ' ---- SQL TEXT: ' || s.sql_text FROM gv$session h LEFT JOIN gv$SQLAREA s ON h.sql_hash_value = s.hash_value and h.sql_ADDRESS = s.ADDRESS and h.inst_id = s.inst_id LEFT JOIN DBA_USERS u ON h.USER# = u.USER_ID LEFT JOIN gv$process p ON p.ADDR = h.PADDR and p.inst_id = h.inst_id WHERE 1=1 and (select sum(pga_alloc_mem/1024/1024/1024) as pga_sum_gb from v$process) > 0.01 -- DONT FORGET TO SWITCH and rownum <=1 ORDER BY p.pga_alloc_mem DESC; quit; /
*Στα δύο πεδία στην 6 και 25 γραμμή ορίζουμε το όριο στο οποίο από αυτή τη συνολική μνήμη PGA και πάνω θα μας επιστρέφει το query αποτέλεσμα. Για το παράδειγμα έβαλα 0.01 GB. Αν θα θέλαμε να μας εμφανίζει μόνο όποτε πέρναει τα 30 GB θα το αλλάζαμε σε 30.
Πώς στέλνουμε email όταν η PGA περάσει το όριο που θέσαμε
Τώρα θα δημιουργήσουμε ένα εκτελέσιμο το οποίο θα τρέχει το παραπάνω query εξάγοντας τα αποτελέσματα σε ένα text file. Σε περίπτωση που το αρχείο είναι πάνω από 3 γραμμές τότε θα στείλει email με τον τίτλο “Oracle DB Alert ORCL” στα email που έχουμε ορίσει έχοντας ως κείμενο ένα warning με την συνολική PGA και τις πληροφορίες του session που καταλαμβάνει την περισσότερη.
Ο λόγος που η διαδικασία ολοκληρώνεται μόνο αν το αρχείο περιέχει πάνω από 3 γραμμές είναι ώστε να μην στέλνει email στη περίπτωση που δεν υπάρχει κάποιο alert και το text file είναι κενό.
Οπότε δημιουργούμε το εκτελέσιμο με τον παρακάτω κώδικα:
[oracle@dp-gr ~]$ vi check_pga_live.sh
#!/bin/bash sqlplus -S "/as sysdba" @/home/oracle/check_pga.sql > /home/oracle/check_pga.log cnt=$(wc -l </home/oracle/check_pga.log) echo $cnt if [ $cnt -ge "4" ] then /usr/bin/mail -A gmail -s "Oracle DB high PGA on ORCL" \ -r info@dataplatform.gr \ patatakia@outlook.com, dokimi@outlook.com \ < /home/oracle/check_pga.log fi
Μπορούμε εναλλακτικά να το τρέχουμε απομακρυσμένα σε άλλο μηχάνημα με τον χρήστη SYS μέσω ezconnect:
#!/bin/bash sqlplus -S "sys/Kwdikos@hostname:1521/ORCL as sysdba" @/home/oracle/check_pga.sql > /home/oracle/check_pga.log cnt=$(wc -l </home/oracle/check_pga.log) echo $cnt if [ $cnt -ge "4" ] then /usr/bin/mail -A gmail -s "Oracle DB Alert ORCL" \ -r info@dataplatform.gr \ patatakia@outlook.com, dokimi@outlook.com \ < /home/oracle/check_pga.log fi
Δεν ξεχνάμε να έχουμε δώσει δικαίωμα execute πριν την εκτέλεση του:
[oracle@dp-gr ~]$ chmod +x check_pga_live.sh
[oracle@dp-gr ~]$ ./check_pga_live.sh
Πώς το κάνουμε schedule να γίνεται έλεγχος κάθε 5 λεπτά για Alerts
Αφού και το εκτελέσιμό μας είναι έτοιμο μπορούμε να προσθέσουμε μια γραμμή στο crontab στην οποία θα ορίσουμε να τρέχει και αυτή κάθε 5 λεπτά:
[oracle@dp-gr ~]$ crontab -e
#crontab 0,5,10,15,20,25,30,35,40,45,50,55 * * * * . ~/.bash_profile && (/home/oracle/check_pga_live.sh >> /dev/null 2>&1)
Το αποτέλεσμα
Τώρα θα δούμε ότι όποτε ξεπερνάει η PGA το threshold που έχουμε ορίσει (για το παράδειγμα είχα βάλει 0.01 GB) θα μας έρχεται email.
Το email αυτό θα περιέχει ένα μύνημα του τύπου:
Warning: Session's Program Page Area (PGA) Memory on DBNAME@HOSTNAME is too high!!!
---> 0,09 GB
Και τις παρακάτω πληροφορίες του session που καταναλώνει την περισσότερη μνήμη PGA αυτή τη στιγμή:
- PGA
- Logon time
- SID
- Serial
- Process
- Username
- OS user
- Machine
- Program
- Module
- SQL text