Devido a algumas duvidas executando o processo de criação do Oracle Data Guard Fisico, em um ambiente onde o primary é um ambiente RAC e o standby, um ambiente single node, ambos Multitenant, resolvi escrever este artigo.
| HOSTNAME | VERSÃO BANCO DE DADOS | SISTEMA OPERACIONAL | FUNÇÃO |
|---|---|---|---|
| orarac01 | 19.3.0.0 | Oracle Linux 7.9 | Primário |
| orarac02 | 19.3.0.0 | Oracle Linux 7.9 | Primário |
| oradg | 19.3.0.0 | Oracle Linux 7.9 | Data Guard |
A baixo, desenho de como deve ficar nosso ambiente:

Partiremos do principio que ambos ambientes estão com seus sistemas operacionais configurados, discos de storage criados e os binários do Oracle RDBMS e Grid Infrastructure instalados, bem como no ambiente de produção, o banco criado.
Ambos os ambientes foram criados utilizando Grid Infrastructure com asmlib.
Observações:
- Antes de realizar a instalação do Grid no ambiente Data Guard, configure a variável de ambiente TNS_ADMIN, para o caminho do TNS do RDBMS. Isto fará com que tanto os binários do Grid quanto do RDBMS, utilizem o mesmo caminho dos binários para a configuração do listener.
- Será necessário configurar corretamente os tnsnames do ambiente RAC e do ambiente ADG, para o comando duplicate, encontre o service name do banco Data Guard, quando o RMAN estiver realizando a conexão inversa, do primário para o standby.
- O arquivo init utilizado para subir o ADG, deverá conter os parâmetros de pluggable database, indicando que o banco será um container, assim como cluster database, indicando que o banco não será um cluster.
- Ainda referente o ambiente o ambiente primário, deverá ser criada uma entrada tns, sem a utilização do racscan, para realizar o duplicate.
Iniciaremos configurando o ambiente primário, adicionado os redologs no banco de produção.
Verifique o tamanho dos redos ja existentes e crie do mesmo tamanho.
Crie um redolog file a mais. Adicionando em um nó do Rac, o Oracle automaticamente irá criar no outro node, thread 2:
ALTER DATABASE ADD STANDBY LOGFILE thread 1 (‘+RECO/CDB19C/ONLINELOG/standby_redo01.log’) SIZE 512M;
ALTER DATABASE ADD STANDBY LOGFILE thread 1 (‘+RECO/CDB19C/ONLINELOG/standby_redo02.log’) SIZE 512M;
ALTER DATABASE ADD STANDBY LOGFILE thread 1 (‘+RECO/CDB19C/ONLINELOG/standby_redo03.log’) SIZE 512M;
ALTER DATABASE ADD STANDBY LOGFILE thread 1 (‘+RECO/CDB19C/ONLINELOG/standby_redo04.log’) SIZE 512M;
ALTER DATABASE ADD STANDBY LOGFILE thread 1 (‘+RECO/CDB19C/ONLINELOG/standby_redo05.log’) SIZE 512M;
Adicione as seguintes entradas no arquivo listener.ora dos nodes do RAC primário:
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=cdb19c1_DGMGRL)
(ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1/)
(SID_NAME=cdb19c1)
(ENVS = “TNS_ADMIN=/u01/app/oracle/product/19.3.0/db/network/admin”)
)
(SID_DESC =
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1/)
(SID_NAME = PLSExtProc)
(PROGRAM = extproc)
)
(SID_DESC=
(GLOBAL_DBNAME=cdb19c)
(ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1/)
(SID_NAME=cdb19c)
)
)
Adicione as seguintes entradas no arquivo tnsnames.ora dos nodes do RAC primário:
CDB19C =
(DESCRIPTION =
#(ADDRESS = (PROTOCOL = TCP)(HOST = orarac-racscan)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.31)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.32)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = cdb19c)
)
)
CDB19C1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.31)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = cdb19c1)
(UR=A)
)
)
CDB19CDG =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oradg)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = cdb19c)
(UR=A)
)
)
Adicione as seguintes entradas no arquivo listener.ora no Data Guard:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = cdb19cdg_DGMGRL)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
(SID_NAME = cdb19c)
)
)
ADR_BASE_LISTENER = /u01/app/oracle
Adicione as seguintes entradas no arquivo tnsnames.ora no Data Guard:
cdb19c =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = orarac01)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = cdb19c)
(UR=A)
)
)
cdb19cdg =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oradg)(PORT = 1521))
)
(CONNECT_DATA =
(SID = cdb19c)
(UR=A)
)
)
Será necessário criar arquivo init para iniciar o banco Data Guard em modo nomout e executar o duplicate. No servidor oradg, crie o arquivo initcdb19c.ora, com o editor que desejar e coloque os seguintes parametros:
*.db_name=’cdb19c’
*.db_unique_name=’cdb19cdg’
*.enable_pluggable_database=true
*.STANDBY_FILE_MANAGEMENT=AUTO
*.sga_target=1G
*.pga_aggregate_target=500M
*.cluster_database=false
Copie o arquivo orapw do ambiente de produção, para o ambiente Data Guard.
$ scp $ORACLE_HOME/dbs/orapwcdb19c oradg:/u01/app/oracle/product/19.3.0/dbhome_1/dbs/orapwcdb19c
Após isto, inicie o banco Data Guard em modo nomount:
$ sqlplus “/as sysdba”
STARTUP NOMOUNT PFILE=’/u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/initcdb19c.ora’
Conecte com o RMAN ao banco target e ao auxiliar e então execute o duplicate. Reforce os parametros de init, no comando duplicate:
$ rman target sys/oracle@cdb19c auxiliary sys/oracle@cdb19cdg
DUPLICATE TARGET DATABASE
FOR STANDBY
FROM ACTIVE DATABASE
DORECOVER
SPFILE
SET db_unique_name=’cdb19cdg’
SET cluster_database=false
SET enable_pluggable_database=true
COMMENT ‘Is standby’
NOFILENAMECHECK;
Após o duplicate concluído, vamos configurar o broker.
Em ambas as bases:
ALTER SYSTEM SET dg_broker_start=true scope=both sid=’*’;
ALTER SYSTEM set REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE scope=both sid=’*’;
ALTER SYSTEM set STANDBY_FILE_MANAGEMENT=AUTO scope=both sid=’*’;
alter database flashback on;
Em produção:
alter system set LOG_ARCHIVE_CONFIG=’DG_CONFIG=(cdb19c,cdb19cdg)’ scope=both sid=’*’;
alter system set LOG_ARCHIVE_DEST_1=’LOCATION= USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=cdb19c’ scope = both;
Caso nao esteja utilizando DB_RECOVER_FILE_DEST:
alter system set LOG_ARCHIVE_DEST_1=’LOCATION=+RECO VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=cdb19c’ scope=both sid=’*’;
alter system set LOG_ARCHIVE_DEST_2=’SERVICE=cdb19cdg LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=cdb19cdg’ scope=both sid=’*’;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=enable scope=both sid=’*’;
alter system set log_archive_max_processes=8 scope=both sid=’*’;
alter system set FAL_SERVER=CDB19CDG scope=both sid=’*’;
alter system set FAL_CLIENT=CDB19C scope=both sid=’*’;
No Data Guard:
alter system set LOG_ARCHIVE_CONFIG=’DG_CONFIG=(cdb19c,cdb19cdg)’ scope = both;
alter system set LOG_ARCHIVE_DEST_1=’LOCATION=+RECO VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=cdb19cdg’ scope=both;
alter system set LOG_ARCHIVE_DEST_2=’SERVICE=cdb19c LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=cdb19c’ scope=both;
alter system set FAL_SERVER=cdb19c scope=both;
alter system set FAL_CLIENT=CDB19CDG scope=both;
Configurando o Broker:
$ dgmgrl sys/oracle@cdb19c
CREATE CONFIGURATION dg_config AS PRIMARY DATABASE IS cdb19c CONNECT IDENTIFIER IS cdb19c;
ADD DATABASE cdb19cdg AS CONNECT IDENTIFIER IS cdb19cdg MAINTAINED AS PHYSICAL;
ENABLE CONFIGURATION;
edit database cdb19c set property StaticConnectIdentifier=”orarac-rascan:1521/cdb19c_dgmgrl”;
edit database cdb19cdg set property StaticConnectIdentifier=”oradg:1521/cdb19cdg_dgmgrl”;
EDIT DATABASE cdb19c SET PROPERTY ‘LogXptMode’=’SYNC’;
EDIT DATABASE cdb19cdg SET PROPERTY ‘LogXptMode’=’SYNC’;
Ao final, faça os testes de switchover e verifique se os bancos são alterados.