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;