Πώς ενεργοποιούμε Oracle Data Guard με αυτόματο Failover για High Availability
- Πώς φτιάχνουμε Logon Trigger για να ελέγχουμε τους χρήστες που επιτρέπουμε να συνδεθούν σε Oracle Database - 13 Ιανουάριος 2025
- Πώς συλλέγουμε to actual execution plan από τα queries με χρήση Extended Event και πως διαβάζουμε τα δεδομένα του - 2 Δεκέμβριος 2024
- Πώς βρίσκουμε τι δικαιώματα έχει ένας χρήστης σε βάση δεδομένων της Oracle - 1 Νοέμβριος 2024
Σε προηγούμενο άρθρο είχαμε δει πώς ενεργοποιούμε το Oracle Data Guard σε physical standby. Τώρα θα προχωρήσουμε την εγκατάσταση ένα βήμα παρακάτω με σύγχρονο commit που θα μας επιτρέψει να ενεργοποιήσουμε το automatic failover από το primary στο standby και αντίστροφα, χωρίς την δική μας παρέμβαση.
Η τεχνολογία αυτή ονομάζεται Oracle Data Guard Fast Start Failover και παρακάτω φαίνεται το διάγραμα της υποδομής της:
Η διαφορά με το απλό Oracle Data Guard σε physical standby είναι ότι το commit γίνεται σύχρονα, δηλαδή για να περαστεί επιτυχώς μια συναλλαγή στο primary θα πρέπει πρώτα να έχει περαστεί στο standby. Επίσης για να ενεργοποιηθεί η δυνατότητα του automatic failover πρέπει σε κάποιο site να τρέχει ένας observer ο οποίος καταγράφει την επικοινωνία και προς τα δύο sites (primary, standby).
Προαπαιτούμενα
Για αρχή θα πρέπει να έχουμε ακολουθήσει όλα τα βήματα για την δημιουργία ενός Oracle Data Guard με physical standby. Το πώς μπορούμε να το κάνουμε, θα το δούμε βήμα βήμα στο άρθρο εδώ.
Επίσης αν το μηχάνημα που εγκατασταθεί ο observer είναι διαφορετικό θα πρέπει να έχει γίνει εγκατάσταση του Oracle Database Software ή του Oracle Database Client. Όπως επίσης να περαστούν οι εγραφές στο tnsnames.ora όπως έχουν περαστεί στα άλλα δύο sites.
Η εγκατάσταση
Συνδεόμαστε από το primary (oradev1) στον broker:
dgmgrl "sys/Kwdikos1!"@ORADEV
Κάνουμε disable το configuration του Data Guard αν δεν είναι ήδη:
disable configuration;
Αλλάζουμε το log transport σε σύγχρονο και τον χρόνο που περιμένει να ενημερωθεί η standby (net timeout) από 30 σε 10 δευτερόλεπτα.
edit database oradev set property 'LogXptMode'=sync; edit database oradevdr set property 'LogXptMode'=sync; edit database oradev set property 'Nettimeout'=10; edit database oradevdr set property 'Nettimeout'=10;
Στη συνέχεια αλλάζουμε το protection mode από Max Performance σε Max Availability.
edit configuration set protection mode as maxavailability;
Ενεργοποιούμε το configuration, αφού πρώτα δούμε ότι το configuration δεν μας εμφανίζει κάποιο error:
show configuration verbose; enable configuration;
Έπειτα ενεργοποιούμε το Fast Start failover:
enable fast_start failover;
Στο τέλος συνδεόμαστε από τον server που θα τρέχει τον observer:
dgmgrl "sys/Kwdikos1!"@ORADEVDR
Και ξεκινάμε τον observer:
start observer;
Μπορούμε να τον τρέξουμε σαν background process στο Unix με την παρακάτω εντολή:
nohup dgmgrl "sys/Kwdikos1!"@ORADEVDR "start observer file='$HOME/fsfo.dat'" -logfile $HOME/observer.log &
Όπως επίσης μπορούμε να παρακολουθούμε το log του observer για τις ενέργειες του και σφάλματα:
tail -f $HOME/observer.log
Αν τώρα δούμε το configuration θα δούμε ότι τρέχει δίχως προβλήματα:
dgmgrl "sys/Kwdikos1!"@ORADEV
show configuration verbose;
Πώς δοκιμάζουμε αν λειτουργεί το automatic failover
Πολύ απλά μπορούμε να πάμε στον primary και να κάνουμε kill το service του process monitor της Oracle:
ps -ef |grep pmon
Αφού βρούμε το process number το κάνουμε kill:
kill -9 6188
Εναλλακτικά τρέχουμε από sqlplus το παρακάτω command:
shutdown abort;
Αν μετά δούμε τον log του observer θα δούμε ότι δεν μπορεί να επικοινωνήσει με τον primary και μέσα σε 30 δευτερόλεπτα που είναι η default τιμή για timeout και failover γύρισε στο standby (oracledevdr):
Όταν μετά πάμε και σηκώσουμε το service του primary (oracledev1) σε mount state:
sqlplus / as sysdba
startup mount;
Θα δούμε στο log του observer ότι μετά από λίγο έκανε connect στη βάση και την έκανε reinstate με τα δεδομένα από το standby που είναι προσωρινά primary:
Όταν ολοκληρωθεί το reinstate μπορούμε άνα πάσα στιγμή να γυρίσουμε στο primary site:
dgmgrl "sys/Kwdikos1!"@ORADEVDR
switchover to oradev;
Πώς συνδεόμαστε αυτόματα σε όποιο site είναι ενεργό
Με την χρήση του Transparent Application Failover μπορούμε μέσω εγγραφής στο tnsnames.ora να συνδεθούμε αυτόματα στο standby σε περίπτωση που πέσει το primary.
Στο tnsnames.ora όμως δεν πρέπει να κάνουμε χρήση του ονόματος της βάσης ως service_name, καθώς αν το κάνουμε αυτό δεν θα συνδέεται μόνο σε όποιο instance είναι το primary αυτή τη στιγμή αλλά σε οποιοδήποτε έχει ανεβασμένο τον listener της βάσης. Αυτό θα δημιουργήσει πρόβλημα όταν η standby μπορεί να είναι ανοιχτή για ανάγνωση (Active Data Guard) ή αν γίνει cold Failover καθώς έπεσε ξαφνικά το process της Oracle με τον listener της βάσης να είναι ακόμα πάνω.
Για να ξεπεράσουμε αυτό το πρόβλημα θα πρέπει να πάμε στο primary (oracledev1) και να φτιάξουμε ένα Dynamic Service. Η δουλεία του θα είναι να ξεχωρίζει ποιά βάση έχει τον primary ρόλο και θα μας βοηθήσει ώστε να είμαστε πάντα συνδεδεμένοι στην σωστή. Είναι δυναμικό καθώς θα ανεβαίνει με trigger μόνο όποτε η βάση έχει τον primary ρολό.
Τα βήματα
Πρώτα φτιάχνουμε το service όριζοντας το όνομα του και ότι πρόκειται για high availability μέσω Fast Application Notification (FAN) με την παράμετρο aq_ha_notifications:
begin dbms_service.create_service('oradev_primary','oradev_primary',aq_ha_notifications=>true,failover_method=>'BASIC',failover_type=>'SELECT',failover_retries=>120,failover_delay=>1); end; /
Δοκιμάζουμε να ξεκινήσουμε το service που φτιάξαμε:
begin dbms_service.start_service('oradev_primary'); end; /
Αφού ξεκινήσει χωρίς πρόβλημα μπορούμε να φτιάξουμε και το start-up trigger που θα ξεκινάει το service:
create or replace trigger start_oradev_primary_service after startup on database declare role varchar(50); begin select database_role into role from v$database; if role='PRIMARY' then dbms_service.start_service('oradev_primary'); else dbms_service.stop_service('oradev_primary'); end if; end; /
Δεν χρειάζεται να επαναλάβουμε την διαδικασία στην standby καθώς θα μεταφέρει τις ρυθμίσεις του service μόνο του το Data Guard.
Τώρα μπορούμε να πάμε στο tnsnames.ora και να προσθέσουμε την παρακάτω εγγραφή διαμορφώνοντας ανάλογα τα hosts και το service_name με αυτό που μόλις φτιάξαμε:
ORADEV_TAF =
(DESCRIPTION =
(CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)
(FAILOVER = ON)
(LOAD_BALANCE = OFF)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracledev1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = oracledev2)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = oradev_primary)
)
)
Πώς αφαιρούμε το Data Guard με Fast-Start Failover
Aν θέλουμε να αφαιρέσουμε το Data Guard τελείως τότε:
dgmgrl "sys/Kwdikos1!"@ORADEV
disable fast_start failover force; disable configuration; remove configuration; exit;
sqlplus / as sysdba
alter system set dg_broker_start=false;