Πώς μπορούμε να λαμβάνουμε email κάθε φορά που ξεπερνάει ένα όριο η μνήμη PGA σε βάση δεδομένων της Oracle

Πώς μπορούμε να λαμβάνουμε email κάθε φορά που ξεπερνάει ένα όριο η μνήμη PGA σε βάση δεδομένων της Oracle
Πώς μπορούμε να λαμβάνουμε email κάθε φορά που ξεπερνάει ένα όριο η μνήμη PGA σε βάση δεδομένων της Oracle

Όταν σε μία βάση δεδομένων της 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.

Πώς μπορούμε να λαμβάνουμε email κάθε φορά που ξεπερνάει ένα όριο η μνήμη PGA σε βάση δεδομένων της Oracle

Αφού πάρουμε τον κωδικό από το 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

Πώς μπορούμε να λαμβάνουμε email κάθε φορά που ξεπερνάει ένα όριο η μνήμη PGA σε βάση δεδομένων της Oracle

Πηγές:

Μοιράσου το

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