Oracle Dataguard (SYNC/MaxAvailability)

Come per PostgreSQL e MySQL anche su Oracle e' ovviamente 
possibile avere un istanza replicata in maniera sincrona
(o asincrona se si preferisce). 
La gestione risulta molto piú veloce, intuitiva e semplice 
rispetto a quella degli altri due database anche grazie al 
Dataguard broker che Oracle mette a disposizione.

L'istanza dal quale partire ovviamente deve essere in 
modalita' ARCHIVELOG, verificare con:

SELECT log_mode FROM v$database;

se non lo e' procedere con:

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

Abilitare il forced logging con:

ALTER DATABASE FORCE LOGGING;

Per essere sicuri che un primo filelog sia generato:

ALTER SYSTEM SWITCH LOGFILE;

Creare quindi gli standby redo logs cosi:

ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 10 ('/u01/app/oracle/oradata/DBSID/standby_redo01.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 11 ('/u01/app/oracle/oradata/DBSID/standby_redo02.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 12 ('/u01/app/oracle/oradata/DBSID/standby_redo03.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 13 ('/u01/app/oracle/oradata/DBSID/standby_redo04.log') SIZE 200M;

Abilitare il FLASHBACK:

ALTER DATABASE FLASHBACK ON;

Settare i parametri db_name e db_unique_name sui 2 nodi
facendo attenzione che il db_name sia lo stesso in 
entrambi ma che invece il db_unique_name sia diverso.
In questo esempio ho usato DBSID e DBSID_stby 
come db_unique_name per i due nodi.

Settare il parametro STANDBY_FILE_MANAGEMENT 
in questo modo:

ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;

Modificare i file tnsnames.ora delle instanze 
in modo da avere:

DBSID =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostdbsid)(PORT = 1521))
)
(CONNECT_DATA =
(SID = dbsid)
)
)
DBSID_stby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostdbsid_stby)(PORT = 1521))
)
(CONNECT_DATA =
(SID = dbsid)
)
)
dbsid_DGMGRL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostdbsid)(PORT = 1521))
)
(CONNECT_DATA =
(SID = dbsid)
)
)
dbsid_stby_DGMGRL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostdbsid_stby)(PORT = 1521))
)
(CONNECT_DATA =
(SID = dbsid)
)
)

Configurare i listener in modo da avere sul nodo primario:

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostdbsid)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = dbsid_DGMGRL)
(ORACLE_HOME = /u01/app/oracle/product/18/db_1)
(SID_NAME = dbsid)
)
)
ADR_BASE_LISTENER = /u01/app/oracle

e sullo standby:

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostdbsid_stby)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =

(GLOBAL_DBNAME = dbsid_stby_DGMGRL)
(ORACLE_HOME = /u01/app/oracle/product/18/db_1)
(SID_NAME = dbsid)
(ENVS="TNS_ADMIN=/u01/app/oracle/product/18/db_1/network/admin")
)
)
ADR_BASE_LISTENER = /u01/app/oracle

Restartare quindi i listeners:

lsnrctl stop
lsnrctl start

Per preparare l'istanza di standby alla duplicate configuriamo il file "/tmp/initDBSID_stby.ora" in modo che contenga:

*.db_name='dbsid'

Creare le seguenti directory nel server standby:

mkdir -p /u01/app/oracle/oradata/DBSID/pdbseed
mkdir -p /u01/app/oracle/oradata/DBSID/DBSIDpdb1
mkdir -p /u01/app/oracle/recovery_area/DBSID
mkdir -p /u01/app/oracle/admin/DBSID/adump

Copiare il password file dal master allo standby (ovviamente nello stesso PATH)

Accendere l'istanza di standby in NOMOUNT utilizzando l'init file precedentemente creato.

$ export ORACLE_SID=DBSID
$ sqlplus / as sysdba
SQL> STARTUP NOMOUNT PFILE='/tmp/initDBSID_stby.ora';

Connettere quindi RMAN al sorgente e al destinatario della duplicate:

rman TARGET sys/Password1@DBSID AUXILIARY sys/Password1@DBSID_stby

E iniziare la duplicate con il comando:

DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER SPFILE SET db_unique_name='dbsid_stby' COMMENT 'Is standby' NOFILENAMECHECK;

Settare su entrambi i nodi la location degli archivelogs:

ALTER SYSTEM SET log_archive_dest_1='LOCATION="/backups/archivelogs", valid_for=(ALL_LOGFILES,ALL_ROLES)' scope=spfile;


Creare i redo standby logs sullo standby come fatto prima per il master:

ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 10 ('/u01/app/oracle/oradata/DBSID/standby_redo01.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 11 ('/u01/app/oracle/oradata/DBSID/standby_redo02.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 12 ('/u01/app/oracle/oradata/DBSID/standby_redo03.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 13 ('/u01/app/oracle/oradata/DBSID/standby_redo04.log') SIZE 200M;

attivare anche sullo standby il flashback mode:
ALTER DATABASE FLASHBACK ON;

Abilitare il Dataguard broker con il seguente comando su entrambe le istanze:

ALTER SYSTEM SET dg_broker_start=true; 

Connettere dal server MASTER il Dataguard broker con il comando:
$ dgmgrl sys/Password1@DBSID

e configurare la replica con:

DGMGRL> CREATE CONFIGURATION my_dg_config AS PRIMARY DATABASE IS DBSID CONNECT IDENTIFIER IS DBSID;
DGMGRL> ADD DATABASE DBSID_stby AS CONNECT IDENTIFIER IS DBSID_stby MAINTAINED AS PHYSICAL;
DGMGRL> ENABLE CONFIGURATION;
DGMGRL> edit database DBSID set property LogXptMode = 'SYNC';
Property "logxptmode" updated
DGMGRL> edit database DBSID_stby set property LogXptMode = 'SYNC';
Property "logxptmode" updated
DGMGRL> edit database DBSID set property Binding = 'mandatory';
Property "binding" updated
DGMGRL> edit database DBSID_stby set property Binding = 'mandatory';
Property "binding" updated
DGMGRL> edit database DBSID set property ReopenSecs = '60';
Property "reopensecs" updated
DGMGRL> edit database DBSID_stby set property ReopenSecs = '60';
Property "reopensecs" updated
DGMGRL> edit database DBSID set property ApplyLagThreshold = '0';
Property "applylagthreshold" updated
DGMGRL> edit database DBSID_stby set property ApplyLagThreshold = '0';
Property "applylagthreshold" updated
DGMGRL> edit database DBSID set property TransportLagThreshold = '0';
Property "transportlagthreshold" updated
DGMGRL> edit database DBSID_stby set property TransportLagThreshold = '0';
DGMGRL> edit configuration set protection mode as maxavailability;

Per abilitare la lettura sullo standby:

shutdown immediate
startup mount
ALTER DATABASE OPEN READ ONLY;

Leave a Reply

Your email address will not be published. Required fields are marked *

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.