Πώς μπορούμε να λαμβάνουμε email κάθε φορά που χάνεται ο συγχρονισμός μεταξύ βάσεων δεδομένων σε Oracle Data Guard
- Τι είναι η PostgreSQL και πως κάνουμε μία πλήρης εγκατάσταση - 2 Σεπτέμβριος 2024
- Πώς ρυθμίζουμε το replication του GoldenGate ώστε να διαβάζει από το Standby του Oracle Data Guard - 2 Αύγουστος 2024
- Πώς μπορούμε να συνδέσουμε Oracle Database με SQL Server με χρήση Oracle Gateway σε Linux - 1 Ιούλιος 2024
Σε αυτό το άρθρο θα δούμε πώς φτιάχνουμε έναν μηχανισμό που θα μας ενημερώνει με email όταν κάποιες από τις standby βάσεις δεδομένων που κάνουν συγχρονισμό με την primary έχουν μείνει πίσω στο sequence number των logs είτε γιατί σταμάτησαν να στέλνονται τα logs είτε γιατί σταμάτησαν να γίνονται apply.
Τα βήματα
Σε προηγούμενο άρθρο είχαμε δει πως μπορούμε να ρυθμίσουμε έναν Linux server (Oracle Linux βασισμένο σε RHEL συγκεκριμένα) ώστε να λαμβάνουμε email κάθε φορά που εμφανίζεται ένα error στο Alert log του instance της βάσης δεδομένων. Αντίστοιχα τώρα θα δούμε τα βήματα για να λαμβάνουμε email όταν ένα κάποια replica είναι πίσω πάνω από ένα sequence number.
Δημιουργία 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
Πώς βλέπουμε αν κάποια standby replica έχει σταματήσει τον συγχρονισμό και βρίσκεται κάποια sequences πίσω
Φτιάχνουμε το παρακάτω sql query που δημιουργεί το warning μήνυμα για την διαφορά σε sequence numbers που έχει σε περίπτωση που υπάρχει για πάνω από ένα (είτε λόγο το ότι δεν ελήφθησαν, είτε γιατί δεν έχουν γίνει apply τα logs):
[oracle@dp-gr ~]$ vi check_dg.sql
set heading off; set feedback off; set echo off; set pagesize 0; SELECT 'Warning: Data Guard Replication not working on '|| (select instance_name from v$instance) || '@' ||(select host_name from v$instance)||'!!! ~~~~~~~~~~~~~~~~ Received Sequence Difference is: ' ||cast(LAST_SEQUENCE_RECEIVED-MAX_SEQUENCE as number) || ' and Applied Sequence Difference is: ' || cast(LAST_SEQUENCE_APPLIED-LAST_SEQUENCE_RECEIVED as number) FROM (SELECT DEST_ID, max(SEQUENCE#) LAST_SEQUENCE_RECEIVED FROM V$ARCHIVED_LOG where resetlogs_change#=(select resetlogs_change# from v$database) GROUP BY DEST_ID) ARCS LEFT JOIN (SELECT DEST_ID, max(SEQUENCE#) LAST_SEQUENCE_APPLIED FROM V$ARCHIVED_LOG where APPLIED='YES' AND DEST_ID not in (0,1) and resetlogs_change#=(select resetlogs_change# from v$database) GROUP BY DEST_ID UNION SELECT 1 DEST_ID,max(SEQUENCE#) LAST_SEQUENCE_APPLIED FROM V$LOG_HISTORY where resetlogs_change#=(select resetlogs_change# from v$database) ) APPLIED ON APPLIED.DEST_ID=ARCS.DEST_ID , (SELECT max(SEQUENCE#) MAX_SEQUENCE FROM V$LOG_HISTORY where resetlogs_change#=(select resetlogs_change# from v$database))MAX WHERE 1=1 and LAST_SEQUENCE_RECEIVED-MAX_SEQUENCE < -1 or LAST_SEQUENCE_APPLIED-LAST_SEQUENCE_RECEIVED < -1 ; exit; /
Πώς στέλνουμε email όταν κάποια standby replica έχει μείνει πάνω από ένα sequence πίσω στον συγχρονισμό
Τώρα θα δημιουργήσουμε ένα εκτελέσιμο το οποίο θα τρέχει το παραπάνω query εξάγοντας τα αποτελέσματα σε ένα text file. Σε περίπτωση που το αρχείο είναι πάνω από μία γραμμή, τότε θα στείλει email με τον τίτλο “Oracle DB Alert ORCL” στα email που έχουμε ορίσει έχοντας ως κείμενο ένα warning που περιέχει το όνομα του server και του instance, μαζί με τον αριθμό των logs που δεν έχουν ληφθεί και τον αριθμό των logs που δεν έχουν γίνει apply.
Το email αποστέλεται μόνο αν μείνει πάνω από ένα log πίσω το replication.
Οπότε δημιουργούμε το εκτελέσιμο με τον παρακάτω κώδικα:
[oracle@dp-gr ~]$ vi check_dg.sh
#!/bin/bash sqlplus -S "/as sysdba" @/home/oracle/check_dg.sql > /home/oracle/check_dg.log cnt=$(wc -l </home/opc/check_dg.log) echo $cnt if [ $cnt -ge "1" ] then /usr/bin/mail -A gmail -s "Oracle DB Data Guard Alert ORCL" \ -r info@dataplatform.gr \ dataplatform.gr@gmail.com \ < /home/opc/check_dg.log fi
Μπορούμε εναλλακτικά να το τρέχουμε απομακρυσμένα σε άλλο μηχάνημα με τον χρήστη SYS
μέσω ezconnect:
#!/bin/bash sqlplus -S "sys/Kwdikos@hostname:1521/ORCL as sysdba" @/home/oracle/check_dg.sql > /home/oracle/check_dg.log cnt=$(wc -l </home/opc/check_dg.log) echo $cnt if [ $cnt -ge "2" ] then /usr/bin/mail -A gmail -s "Oracle DB Alert ORCL" \ -r info@dataplatform.gr \ dataplatform.gr@gmail.com \ < /home/opc/check_dg.log fi
Δεν ξεχνάμε να έχουμε δώσει δικαίωμα execute πριν την εκτέλεση του:
[oracle@dp-gr ~]$ chmod +x check_dg.sh
[oracle@dp-gr ~]$ ./check_dg.sh
Πώς το κάνουμε schedule να γίνεται έλεγχος κάθε 5 λεπτά για Alerts
Αφού και το εκτελέσιμό μας είναι έτοιμο μπορούμε να προσθέσουμε μια γραμμή στο crontab στην οποία θα ορίσουμε να τρέχει και αυτή κάθε 5 λεπτά:
[oracle@dp-gr ~]$ crontab -e
0,5,10,15,20,25,30,35,40,45,50,55 * * * * . ~/.bash_profile && (/home/opc/check_dg_live.sh >> /dev/null 2>&1)
Το αποτέλεσμα
Τώρα σε περίπτωση που κάποια standby replica είτε δεν έχει λάβει κάποια logs (Received Sequence Difference) είτε δεν τα έχει κάνει apply (Applied Sequence Difference) θα μας στείλει ένα email όπως το παρακάτω:
Warning: Data Guard Replication not working on ORCL@dp-gr!!! ~~~~~~~~~~~~ Received Sequence Difference is: -6 and Applied Sequence Difference is: -1