Πώς μπορούμε να λαμβάνουμε email κάθε φορά που εμφανίζεται ένα error στο Alert log της βάσης δεδομένων της Oracle
- Τι είναι η PostgreSQL και πως κάνουμε μία πλήρης εγκατάσταση - 2 Σεπτέμβριος 2024
- Πώς ρυθμίζουμε το replication του GoldenGate ώστε να διαβάζει από το Standby του Oracle Data Guard - 2 Αύγουστος 2024
- Πώς μπορούμε να συνδέσουμε Oracle Database με SQL Server με χρήση Oracle Gateway σε Linux - 1 Ιούλιος 2024
Σε ένα σύστημα βασισμένο σε βάση δεδομένων της Oracle, ότι error συμβαίνει καταγράφεται σε ένα log αρχείο το οποίο ονομάζεται Alert Log. Είναι πολύ χρήσιμο να ενημερωνόμαστε άμεσα όταν συμβαίνει κάτι και ο πιο άμεσος τρόπος δεν είναι άλλος από την αποστολή email.
Σε αυτό το άρθρο θα δούμε με ποιο τρόπο μπορούμε να ρυθμίσουμε έναν Linux server (Oracle Linux βασισμένο σε RHEL συγκεκριμένα) ώστε να πραγματοποιεί αυτή τη δουλεία.
Δημιουργία SMTP relay με gmail της Google
Αν έχουμε δικό μας relay στον exchange server με ρυθμισμένο το smtp που θα στέλνει τα emails, αυτό το βήμα δεν το χρειαζόμαστε.
Θα δούμε τώρα όμως τι κάνουμε σε περίπτωση που θέλουμε να στέλνουμε τα emails μέσω Gmail.
Για αρχή θα πρέπει να συνδεθούμε στο gmail account security.
Εκεί θα πρέπει να ενεργοποιήσουμε το two 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
Πώς θα βρίσκουμε τα Alerts που έχουν συμβεί τα τελευταία 5 λεπτά
Φτιάχνουμε το παρακάτω script που θα μας πίανει ότι error έχει εμφανιστεί στο Alert Log ή διαδικασία Shutdown:
[oracle@dp-gr ~]$ vi check_alertlog.sql
set echo off set pagesize 0 set feedback off select 'TIMESTAMP: '|| originating_timestamp || ' ---- INSTANCE_NAME: ' || (select instance_name from v$instance) || ' ---- HOST_NAME: ' || host_id ||' ---- MESSAGE: ' || message_text from v$diag_alert_ext where 1=1 and CAST(SUBSTR(originating_timestamp,1,LENGTH(originating_timestamp)-7) AS TIMESTAMP) > CAST (sysdate-interval '5' minute AS TIMESTAMP) and (message_text like '%ORA-%' OR message_text like '%Shutting down instance%' or message_text like '%archival error%' or message_text like '%Cannot allocate log, archival required%') and message_text not like '%ORA-609%' --process abort and message_text not like 'ORA-00060%' --ignore deadlocks and message_text not like 'ORA-01555%' --ignore snapshot too old and message_text not like '%ORA-1013%' --operation canceled by user and message_text not like '%ORA-3136%' --inbound connection timeout and message_text not like '%ORA-235 %' --unlocked control file and message_text not like '%Result = ORA-0%' and message_text not like '%Result = ORA-31%' and message_text not like '%Result = ORA-30%' and message_text not like '%ORA-609%' --process abort and message_text not like '%ORA-3135%' --aborting process unknown ; quit; /
Στο originating_timestamp ορίζουμε ότι θέλουμε μόνο τα τελευταία 5 λεπτά.
Φυσικά έχουμε τη δυνατότητα να περιορίσουμε σε συγκεκρίμενα μόνο errors ή και να αλλάξουμε το χρονικό διάστημα αλλάζοντας τις παραμέτρους στο where
του query.
*Στο τέλος του άρθρου σας αναφέρω μια συστημική procedure με την οποία μπορούμε να δημιουργήσουμε ψεύτικα errors στο Alert Log για δοκιμή.
Πώς στέλνουμε με email τα Alerts αν υπάρχουν
Τώρα θα δημιουργήσουμε ένα εκτελέσιμο το οποίο θα τρέχει το παραπάνω query εξάγοντας τα αποτελέσματα σε ένα text file. Σε περίπτωση που το αρχείο είναι πάνω από 3 γραμμές τότε θα στείλει email με τον τίτλο “Oracle DB Alert ORCL” στα email που έχουμε ορίσει έχοντας ως κείμενο τα Alerts.
Ο λόγος που η διαδικασία ολοκληρώνεται μόνο αν το αρχείο περιέχει πάνω από 3 γραμμές είναι ώστε να μην στέλνει email στη περίπτωση που δεν υπάρχει κάποιο alert και το text file είναι κενό.
Οπότε δημιουργούμε το εκτελέσιμο με τον παρακάτω κώδικα:
[oracle@dp-gr ~]$ vi check_alert_live.sh
#!/bin/bash sqlplus -S "/as sysdba" @/home/oracle/check_alertlog.sql > /home/oracle/alerts_formail.txt cnt=$(wc -l </home/oracle/alerts_formail.txt) 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/alerts_formail.txt fi
Μπορούμε εναλλακτικά να το τρέχουμε απομακρυσμένα σε άλλο μηχάνημα με τον χρήστη SYS μέσω ezconnect:
#!/bin/bash sqlplus -S "sys/Kwdikos@hostname:1521/ORCL as sysdba" @/home/oracle/check_alertlog.sql > /home/oracle/alerts_formail.txt cnt=$(wc -l </home/oracle/alerts_formail.txt) 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/alerts_formail.txt fi
Δεν ξεχνάμε να έχουμε δώσει δικαίωμα execute πριν την εκτέλεση του:
[oracle@dp-gr ~]$ chmod +x check_alert_live.sh
[oracle@dp-gr ~]$ ./check_alert_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_alert_live.sh >> /dev/null 2>&1)
Το αποτέλεσμα
Τώρα θα δούμε ότι όποτε εμφανίζεται κάποιο error θα μας έρχεται email.
Για να το δοκιμάσουμε μπορούμε να συνδεθούμε στη βάση και τρέξουμε το command το οποίο θα δημιουργήσει ένα ψεύτικο error στο Alert Log:
exec dbms_system.ksdwrt(2,'ORA-00600: This is a test error message for monitoring and can be ignored.');
Και μετά από λίγο ήρθε το παρακάτω email: