Como pré-requisito, é necessário que o banco primary esteja em archiving mode. Caso você precise fazer isso, pode seguir este artigo AQUI.
[oracle@fornix1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Mar 5 04:52:55 2021
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> SELECT LOG_MODE FROM V$DATABASE ;
LOG_MODE
------------
ARCHIVELOG
SQL> SHO PARAMETER LOG_ARCHIVE_DEST_1
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1 string LOCATION=+DG_RECO
log_archive_dest_10 string
log_archive_dest_11 string
log_archive_dest_12 string
log_archive_dest_13 string
log_archive_dest_14 string
log_archive_dest_15 string
log_archive_dest_16 string
log_archive_dest_17 string
log_archive_dest_18 string
log_archive_dest_19 string
SQL>
Habilitando o FORCE LOGGIN:
SQL> SELECT FORCE_LOGGING FROM V$DATABASE;
FORCE_LOGGING
---------------------------------------
NO
SQL> ALTER DATABASE FORCE LOGGING;
Database altered.
SQL> SELECT FORCE_LOGGING FROM V$DATABASE;
FORCE_LOGGING
---------------------------------------
YES
SQL>
Configurando os Standby Redo Logs. Lembrando que a sua quantidade ficaria como (3+1)*1=4:
SQL> SELECT GROUP#, BYTES/1024/1024 MB FROM V$LOG;
GROUP# MB
---------- ----------
1 200
2 200
3 200
SQL> SELECT THREAD#, INSTANCE FROM V$THREAD ;
THREAD#
----------
INSTANCE
--------------------------------------------------------------------------------
1
cortex
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 '+DG_FRA' SIZE 200M ;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 '+DG_FRA' SIZE 200M ;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 '+DG_FRA' SIZE 200M ;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 '+DG_FRA' SIZE 200M ;
Database altered.
SQL> SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG;
GROUP# THREAD# SEQUENCE# ARC STATUS
---------- ---------- ---------- --- ----------
4 1 0 YES UNASSIGNED
5 1 0 YES UNASSIGNED
6 1 0 YES UNASSIGNED
7 1 0 YES UNASSIGNED
SQL>
Alterando os parâmetros do primary:
SQL> show parameter DB_UNIQUE_NAME
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name string cortex
SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(cortex,cortexDR)' scope=BOTH;
System altered.
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2= 'SERVICE=cortexDR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=cortexDR' scope=BOTH;
System altered.
SQL> ALTER SYSTEM SET ARCHIVE_LAG_TARGET=1800 scope=BOTH;
System altered.
SQL> show parameter REMOTE_LOGIN_PASSWORDFILE
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile string EXCLUSIVE
SQL> show parameter FAL_SERVER ;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fal_server string
SQL> alter system set FAL_SERVER ='cortexDR' scope=BOTH;
System altered.
SQL> show parameter STANDBY_FILE_MANAGEMENT
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
standby_file_management string MANUAL
SQL> alter system set STANDBY_FILE_MANAGEMENT='AUTO' scope=BOTH;
System altered.
SQL>
Coletando a lista de diretórios que deverão existir no ambiente Standby:
SQL> SELECT NAME, VALUE FROM V$PARAMETER WHERE upper(VALUE) LIKE upper('%/cortex/%');
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
spfile
+DG_DATA/CORTEX/PARAMETERFILE/spfile.265.1039034301
control_files
+DG_DATA/CORTEX/CONTROLFILE/current.260.1039033623, +DG_FRA/CORTEX/CONTROLFILE/c
urrent.256.1039033625
core_dump_dest
/oracle/19.3.0/base/diag/rdbms/cortex/cortex/cdump
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
audit_file_dest
/oracle/19.3.0/base/admin/cortex/adump
SQL>
De forma opcional, podemos habilitar o recurso de Flashback Database (o que seria recomendado):
SQL> alter system set DB_FLASHBACK_RETENTION_TARGET =2880 scope=BOTH;
System altered.
SQL> ALTER DATABASE FLASHBACK ON;
Database altered.
SQL>
Ajustando parâmetro do controlfile:
SQL> show parameter CONTROL_FILE_RECORD_KEEP_TIME;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
SQL> alter system set CONTROL_FILE_RECORD_KEEP_TIME=30 scope=BOTH;
System altered.
SQL>
Validar se seu ambiente já possui um password file:
[oracle@fornix1 ~]$ cd $ORACLE_HOME/dbs
[oracle@fornix1 dbs]$ ls -lthr
total 11M
-rw-r--r--. 1 oracle oinstall 3.1K May 14 2015 init.ora
-rw-r-----. 1 oracle asmadmin 24 Apr 29 2020 lkCORTEX
-rw-r-----. 1 oracle oinstall 2.0K Feb 26 05:43 orapwcortex
-rw-rw----. 1 oracle asmadmin 1.6K Mar 5 04:51 hc_cortex.dat
-rw-r-----. 1 oracle asmadmin 11M Mar 5 05:11 snapcf_cortex.f
[oracle@fornix1 dbs]$
Ajustando o arquivo /etc/hosts para que o ambiente primary possa se comunicar com o standby:
[oracle@fornix1 dbs]$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.109 fornix1.localdomain fornix1
192.168.0.110 fornix2.localdomain fornix2
[oracle@fornix1 dbs]$ ping fornix2
PING fornix2.localdomain (192.168.0.110) 56(84) bytes of data.
64 bytes from fornix2.localdomain (192.168.0.110): icmp_seq=1 ttl=64 time=2.33 ms
64 bytes from fornix2.localdomain (192.168.0.110): icmp_seq=2 ttl=64 time=1.17 ms
64 bytes from fornix2.localdomain (192.168.0.110): icmp_seq=3 ttl=64 time=1.39 ms
Ajustando arquivo tnsnames.ora:
[oracle@fornix1 admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /oracle/19.3.0/product/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
CORTEX =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = fornix1.localdomain)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = cortex.localdomain)
)
)
LISTENER_LISTENER =
(ADDRESS = (PROTOCOL = TCP)(HOST = fornix1.localdomain)(PORT = 1521))
CORTEXDR =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = fornix2.localdomain)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = cortexDR.localdomain)
)(UR=A)
)
RMANDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oel8.localdomain)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = RMANDB)
)
)
[oracle@fornix1 admin]$
Teste de tnsping:
[oracle@fornix1 admin]$ tnsping CORTEX
TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 05-MAR-2021 05:31:42
Copyright (c) 1997, 2019, Oracle. All rights reserved.
Used parameter files:
/oracle/19.3.0/product/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = fornix1.localdomain)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = cortex.localdomain)))
OK (10 msec)
[oracle@fornix1 admin]$ tnsping CORTEXDR
TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 06-MAR-2021 11:45:29
Copyright (c) 1997, 2019, Oracle. All rights reserved.
Used parameter files:
/oracle/19.3.0/product/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = fornix2.localdomain)(PORT = 1522)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = cortexDR.localdomain))(UR=A))
OK (10 msec)
[oracle@fornix1 admin]$
Validando arquivo sqlnet.ora:
[oracle@fornix1 admin]$ cat sqlnet.ora
# sqlnet.ora Network Configuration File: /oracle/19.3.0/product/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
[oracle@fornix1 admin]$
Não é difícil se deparar com o erro abaixo, ao tentar fazer o Duplicate do banco. E para isso, já vou fazer a cópia do SPFILE para o local onde o RMAN pensa que está hospedado:
RMAN-03009: failure of backup command on prmy2 channel at 05/03/2021 05:38:08
ORA-19505: failed to identify file "+DG_DATA/CORTEX/spfilecortex.ora"
ORA-15173: entry 'spfilecortex.ora' does not exist in directory 'CORTEX'
Fazendo cópia do SPFILE:
[oracle@fornix1 admin]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Mar 5 05:38:59 2021
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> sho parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string +DG_DATA/CORTEX/PARAMETERFILE/
spfile.265.1039034301
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
[oracle@fornix1 admin]$ su - grid
Password:
Last login: Fri Mar 5 05:35:16 -03 2021 on pts/0
[grid@fornix1 ~]$ asmcmd
ASMCMD> cd DG_DATA/CORTEX/PARAMETERFILE/
ASMCMD> cp spfile.265.1039034301 +DG_DATA/CORTEX/spfilecortex.ora;
copying +DG_DATA/CORTEX/PARAMETERFILE/spfile.265.1039034301 -> +DG_DATA/CORTEX/spfilecortex.ora
ASMCMD>
Obs: Este procedimento foi criado pelo senhor Ahmed Baraka (www.ahmedbaraka.com) e foi apenas reproduzido por mim em um laboratório pessoal para fins de aprendizado.