DB - Data Guard 12c - Criar uma Physical Standby
Ha algum tempo que andava para publicar um post sobre a solucao de disaster/recover da Oracle, Data Guard (DG). O objectivo deste post nao e destilar o Data Guard, mas para entender melhor e necessario rever algums conceitos.
Recap, Data Guard permite enviar a informacao de log de site/data center – principal para outro dedicado a recovery, protegendo dessa forma os dados em caso de indisponiblilidade ou perca do site principal.
As pontencialidades do Data Guard sao enormes , nao se reduzindo apenas a DR, por exemplo as base de dados secundarias pode ser usadas pra testes ou reporting.
Databases roles :
primary – base de dados activa para transacoes negocio
standby – base de dados secundaria (physical, logical, snapshot)
Para construir qualquer base de dados secundaria, e necessario primeiro contruir uma pysical standby ( desta uma logical ou snapshot) , ou seja uma copia bit a bit da primary.
Ha algumas formas de contruir uma pysical standby, ha muitos sites e documentacao Oracle sobre isto, neste post mosto a que me parece mais simples. Usar o broker.
Como estamos a falar uma demo, estou a usar uma VM, neste caso ambas as base de dados estao na mesma maquina, e listener sera o mesmo para ambas.
Hostname : oretail.example.com
Primary : PRODDB
Physical Standby : DRSITECDB
Para construir a physical standby irei seguir os seguintes passos:
1 . PRODDB - Verificar configuracoes e Preparar a primary
2 . REDE – Configurar listener e TNS
3 . DRSITECDB – Criar Physical Standby
4 . DGMGRL – Criar a confguracao DG
5 . DGMGRL – Testar
Recap, Data Guard permite enviar a informacao de log de site/data center – principal para outro dedicado a recovery, protegendo dessa forma os dados em caso de indisponiblilidade ou perca do site principal.
As pontencialidades do Data Guard sao enormes , nao se reduzindo apenas a DR, por exemplo as base de dados secundarias pode ser usadas pra testes ou reporting.
Databases roles :
primary – base de dados activa para transacoes negocio
standby – base de dados secundaria (physical, logical, snapshot)
Para construir qualquer base de dados secundaria, e necessario primeiro contruir uma pysical standby ( desta uma logical ou snapshot) , ou seja uma copia bit a bit da primary.
Ha algumas formas de contruir uma pysical standby, ha muitos sites e documentacao Oracle sobre isto, neste post mosto a que me parece mais simples. Usar o broker.
Como estamos a falar uma demo, estou a usar uma VM, neste caso ambas as base de dados estao na mesma maquina, e listener sera o mesmo para ambas.
Hostname : oretail.example.com
Primary : PRODDB
Physical Standby : DRSITECDB
Para construir a physical standby irei seguir os seguintes passos:
1 . PRODDB - Verificar configuracoes e Preparar a primary
2 . REDE – Configurar listener e TNS
3 . DRSITECDB – Criar Physical Standby
4 . DGMGRL – Criar a confguracao DG
5 . DGMGRL – Testar
1 . PRODDB - Verificar configuracoes e Preparar a primary
A secao seginte mostra alguma informacao key e outra util sobre a base de dados.
[oracle@oretail Desktop]$ tail /etc/oratab
#..
PRODCDB:/u01/app/oracle/product/12.1.0/dbhome_1:N
[oracle@oretail Desktop]$ . oraenv
ORACLE_SID = [PRODCDB] ? PRODCDB
The Oracle base remains unchanged with value /u01/app/oracle
[oracle@oretail Desktop]$ sqlplus / as sysdba
SQL> set pages 50
SQL> set lines 200
SQL> col name form a10
SQL> col db_unique_name form a15
SQL> col log_mode form a15
SQL> col switchover_status form a20
SQL> col force_logging form a20
SQL> select name, db_unique_name, switchover_status, log_mode, flashback_on , force_logging from v$database;
NAME DB_UNIQUE_NAME SWITCHOVER_STATUS LOG_MODE FLASHBACK_ON FORCE_LOGGING
---------- ------------- -------------------- ------------- ------------------ --------------------
PRODCDB PRODCDB NOT ALLOWED NOARCHIVELOG NO NO
-- Activar o force logging
SQL> alter database force logging;
Database altered.
-- Activar archivelog mode
SQL> shut immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1509949440 bytes
Fixed Size 2924640 bytes
Variable Size 973082528 bytes
Database Buffers 520093696 bytes
Redo Buffers 13848576 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.
-- verificar novamente
SQL> set pages 50
SQL> set lines 200
SQL> col name form a10
SQL> col db_unique_name form a15
SQL> col log_mode form a15
SQL> col switchover_status form a20
SQL> col force_logging form a20
SQL> select name, db_unique_name, switchover_status, log_mode, flashback_on , force_logging from v$database;
NAME DB_UNIQUE_NAME SWITCHOVER_STATUS LOG_MODE FLASHBACK_ON FORCE_LOGGING
---------- --------------- -------------------- --------------- ------------------ --------------------
PRODCDB PRODCDB NOT ALLOWED ARCHIVELOG NO YES
-- adicionar standby logs nesta altura
SQL> col member form a100
SQL> select l.group#, l.bytes, f.type, f.member from
v$log l , v$logfile f where l.group#=f.group#
union all
select l.group#, l.bytes, f.type, f.member
from v$standby_log l , v$logfile f where l.group#=f.group#;
GROUP# BYTES TYPE MEMBER
------ ---------- ------- ----------------------------------------------------
3 52428800 ONLINE /u01/app/oracle/oradata/PRODCDB/onlinelog/log3.log
3 52428800 ONLINE /u01/app/oracle/fra/PRODCDB/onlinelog/log3.log
2 52428800 ONLINE /u01/app/oracle/oradata/PRODCDB/onlinelog/log2.log
2 52428800 ONLINE /u01/app/oracle/fra/PRODCDB/onlinelog/log2.log
1 52428800 ONLINE /u01/app/oracle/oradata/PRODCDB/onlinelog/log1.log
1 52428800 ONLINE /u01/app/oracle/fra/PRODCDB/onlinelog/log1.log
6 rows selected..
SQL> alter database add standby logfile group 11 ('/u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_1.log','/u01/app/oracle/fra/PRODCDB/stdb_1.log') size 52428800;
SQL> alter database add standby logfile group 12 ('/u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_2.log','/u01/app/oracle/fra/PRODCDB/stdb_2.log') size 52428800;
SQL> alter database add standby logfile group 13 ('/u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_3.log','/u01/app/oracle/fra/PRODCDB/stdb_3.log') size 52428800;
SQL> alter database add standby logfile group 14 ('/u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_4.log','/u01/app/oracle/fra/PRODCDB/stdb_4.log') size 52428800;
SQL> select l.group#, l.bytes, f.type, f.member
from v$log l , v$logfile f where l.group#=f.group#
union all
select l.group#, l.bytes, f.type, f.member from
v$standby_log l , v$logfile f where l.group#=f.group#
GROUP# BYTES TYPE MEMBER
---------- ---------- ------- ------------------------------------------------
3 52428800 ONLINE /u01/app/oracle/oradata/PRODCDB/onlinelog/log3.log
3 52428800 ONLINE /u01/app/oracle/fra/PRODCDB/onlinelog/log3.log
2 52428800 ONLINE /u01/app/oracle/oradata/PRODCDB/onlinelog/log2.log
2 52428800 ONLINE /u01/app/oracle/fra/PRODCDB/onlinelog/log2.log
1 52428800 ONLINE /u01/app/oracle/oradata/PRODCDB/onlinelog/log1.log
1 52428800 ONLINE /u01/app/oracle/fra/PRODCDB/onlinelog/log1.log
11 52428800 STANDBY /u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_1.log
11 52428800 STANDBY /u01/app/oracle/fra/PRODCDB/stdb_1.log
12 52428800 STANDBY /u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_2.log
12 52428800 STANDBY /u01/app/oracle/fra/PRODCDB/stdb_2.log
13 52428800 STANDBY /u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_3.log
13 52428800 STANDBY /u01/app/oracle/fra/PRODCDB/stdb_3.log
14 52428800 STANDBY /u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_4.log
14 52428800 STANDBY /u01/app/oracle/fra/PRODCDB/stdb_4.log
14 rows selected.
-- verificar outras configuracoes - data files
SQL> col name form a100
SQL> select * from v$dbfile;
FILE# NAME CON_ID
---------- ----------------------------------------------------------- ------
6 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_users_fvdyknoc_.dbf 1
4 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_undotbs1_fvdykotw_.dbf 1
1 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_system_fvdyhmf2_.dbf 1
3 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_sysaux_fvdyfw4s_.dbf 1
5 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_system_fvdylynm_.dbf 2
7 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_sysaux_fvdylyn3_.dbf 2
8 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_system_fvdysy1f_.dbf 3
9 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_sysaux_fvdysy17_.dbf 3
10 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_users_fvdysy1m_.dbf 3
11 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_example_fvdysy0z_.dbf 3
-- verificar outras configuracoes - containers
SQL> col name form a10
SQL> select con_id,name, open_mode from v$containers;
CON_ID NAME OPEN_MODE
---------- ---------- ---------------
1 CDB$ROOT READ WRITE
2 PDB$SEED READ ONLY
3 PRDPDB1 MOUNTED
-- verificar outras configuracoes - parameteros
SQL> col name form a30
SQL> col value form a80
SQL> select name,value from v$parameter where name in ('log_archive_dest_2','log_archive_dest_state_2','log_archive_config','db_name','db_unique_name','dg_broker_start','db_recovery_file_dest','db_recovery_file_dest_size','control_files','db_file_name_convert','log_file_name_convert','pdb_file_name_convert');
NAME VALUE
------------------------------ ---------------------------------------------------------------------
control_files /u01/app/oracle/oradata/PRODCDB/controlfile/o1_mf_fvdyll4b_.ctl,
/u01/app/oracle/fra/PRODCDB/controlfile/o1_mf_fvdyll6s_.ctl
db_file_name_convert
log_file_name_convert
log_archive_dest_2
log_archive_dest_state_2 enable
log_archive_config
db_recovery_file_dest /u01/app/oracle/fra
db_recovery_file_dest_size 4781506560
db_name PRODCDB
db_unique_name PRODCDB
dg_broker_start FALSE
pdb_file_name_convert
#..
PRODCDB:/u01/app/oracle/product/12.1.0/dbhome_1:N
[oracle@oretail Desktop]$ . oraenv
ORACLE_SID = [PRODCDB] ? PRODCDB
The Oracle base remains unchanged with value /u01/app/oracle
[oracle@oretail Desktop]$ sqlplus / as sysdba
SQL> set pages 50
SQL> set lines 200
SQL> col name form a10
SQL> col db_unique_name form a15
SQL> col log_mode form a15
SQL> col switchover_status form a20
SQL> col force_logging form a20
SQL> select name, db_unique_name, switchover_status, log_mode, flashback_on , force_logging from v$database;
NAME DB_UNIQUE_NAME SWITCHOVER_STATUS LOG_MODE FLASHBACK_ON FORCE_LOGGING
---------- ------------- -------------------- ------------- ------------------ --------------------
PRODCDB PRODCDB NOT ALLOWED NOARCHIVELOG NO NO
-- Activar o force logging
SQL> alter database force logging;
Database altered.
-- Activar archivelog mode
SQL> shut immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1509949440 bytes
Fixed Size 2924640 bytes
Variable Size 973082528 bytes
Database Buffers 520093696 bytes
Redo Buffers 13848576 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.
SQL> set pages 50
SQL> set lines 200
SQL> col name form a10
SQL> col db_unique_name form a15
SQL> col log_mode form a15
SQL> col switchover_status form a20
SQL> col force_logging form a20
SQL> select name, db_unique_name, switchover_status, log_mode, flashback_on , force_logging from v$database;
NAME DB_UNIQUE_NAME SWITCHOVER_STATUS LOG_MODE FLASHBACK_ON FORCE_LOGGING
---------- --------------- -------------------- --------------- ------------------ --------------------
PRODCDB PRODCDB NOT ALLOWED ARCHIVELOG NO YES
-- adicionar standby logs nesta altura
SQL> col member form a100
SQL> select l.group#, l.bytes, f.type, f.member from
v$log l , v$logfile f where l.group#=f.group#
union all
select l.group#, l.bytes, f.type, f.member
from v$standby_log l , v$logfile f where l.group#=f.group#;
GROUP# BYTES TYPE MEMBER
------ ---------- ------- ----------------------------------------------------
3 52428800 ONLINE /u01/app/oracle/oradata/PRODCDB/onlinelog/log3.log
3 52428800 ONLINE /u01/app/oracle/fra/PRODCDB/onlinelog/log3.log
2 52428800 ONLINE /u01/app/oracle/oradata/PRODCDB/onlinelog/log2.log
2 52428800 ONLINE /u01/app/oracle/fra/PRODCDB/onlinelog/log2.log
1 52428800 ONLINE /u01/app/oracle/oradata/PRODCDB/onlinelog/log1.log
1 52428800 ONLINE /u01/app/oracle/fra/PRODCDB/onlinelog/log1.log
6 rows selected..
SQL> alter database add standby logfile group 11 ('/u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_1.log','/u01/app/oracle/fra/PRODCDB/stdb_1.log') size 52428800;
SQL> alter database add standby logfile group 12 ('/u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_2.log','/u01/app/oracle/fra/PRODCDB/stdb_2.log') size 52428800;
SQL> alter database add standby logfile group 13 ('/u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_3.log','/u01/app/oracle/fra/PRODCDB/stdb_3.log') size 52428800;
SQL> alter database add standby logfile group 14 ('/u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_4.log','/u01/app/oracle/fra/PRODCDB/stdb_4.log') size 52428800;
SQL> select l.group#, l.bytes, f.type, f.member
from v$log l , v$logfile f where l.group#=f.group#
union all
select l.group#, l.bytes, f.type, f.member from
v$standby_log l , v$logfile f where l.group#=f.group#
GROUP# BYTES TYPE MEMBER
---------- ---------- ------- ------------------------------------------------
3 52428800 ONLINE /u01/app/oracle/oradata/PRODCDB/onlinelog/log3.log
3 52428800 ONLINE /u01/app/oracle/fra/PRODCDB/onlinelog/log3.log
2 52428800 ONLINE /u01/app/oracle/oradata/PRODCDB/onlinelog/log2.log
2 52428800 ONLINE /u01/app/oracle/fra/PRODCDB/onlinelog/log2.log
1 52428800 ONLINE /u01/app/oracle/oradata/PRODCDB/onlinelog/log1.log
1 52428800 ONLINE /u01/app/oracle/fra/PRODCDB/onlinelog/log1.log
11 52428800 STANDBY /u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_1.log
11 52428800 STANDBY /u01/app/oracle/fra/PRODCDB/stdb_1.log
12 52428800 STANDBY /u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_2.log
12 52428800 STANDBY /u01/app/oracle/fra/PRODCDB/stdb_2.log
13 52428800 STANDBY /u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_3.log
13 52428800 STANDBY /u01/app/oracle/fra/PRODCDB/stdb_3.log
14 52428800 STANDBY /u01/app/oracle/oradata/PRODCDB/onlinelog/stdb_4.log
14 52428800 STANDBY /u01/app/oracle/fra/PRODCDB/stdb_4.log
14 rows selected.
-- verificar outras configuracoes - data files
SQL> col name form a100
SQL> select * from v$dbfile;
FILE# NAME CON_ID
---------- ----------------------------------------------------------- ------
6 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_users_fvdyknoc_.dbf 1
4 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_undotbs1_fvdykotw_.dbf 1
1 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_system_fvdyhmf2_.dbf 1
3 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_sysaux_fvdyfw4s_.dbf 1
5 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_system_fvdylynm_.dbf 2
7 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_sysaux_fvdylyn3_.dbf 2
8 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_system_fvdysy1f_.dbf 3
9 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_sysaux_fvdysy17_.dbf 3
10 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_users_fvdysy1m_.dbf 3
11 /u01/app/oracle/oradata/PRODCDB/datafile/o1_mf_example_fvdysy0z_.dbf 3
-- verificar outras configuracoes - containers
SQL> col name form a10
SQL> select con_id,name, open_mode from v$containers;
CON_ID NAME OPEN_MODE
---------- ---------- ---------------
1 CDB$ROOT READ WRITE
2 PDB$SEED READ ONLY
3 PRDPDB1 MOUNTED
-- verificar outras configuracoes - parameteros
SQL> col name form a30
SQL> col value form a80
SQL> select name,value from v$parameter where name in ('log_archive_dest_2','log_archive_dest_state_2','log_archive_config','db_name','db_unique_name','dg_broker_start','db_recovery_file_dest','db_recovery_file_dest_size','control_files','db_file_name_convert','log_file_name_convert','pdb_file_name_convert');
NAME VALUE
------------------------------ ---------------------------------------------------------------------
control_files /u01/app/oracle/oradata/PRODCDB/controlfile/o1_mf_fvdyll4b_.ctl,
/u01/app/oracle/fra/PRODCDB/controlfile/o1_mf_fvdyll6s_.ctl
db_file_name_convert
log_file_name_convert
log_archive_dest_2
log_archive_dest_state_2 enable
log_archive_config
db_recovery_file_dest /u01/app/oracle/fra
db_recovery_file_dest_size 4781506560
db_name PRODCDB
db_unique_name PRODCDB
dg_broker_start FALSE
pdb_file_name_convert
2 . REDE – Configurar listener e TNS
Nesta secao seginte irei configurar a rede, criar um listener e registar os seguintes servicos (listener.ora):
Primary: PRODCDB, PRODCDB_DGMGRL
Standby : DRSITECDB, DRSITECDB_DGMGRL
TNS (tnsnames.ora):
Primary : PRODCDB
Standby :DRSITECDB Pode se editar os ficheiros diretamente, mas recomendavel usar o netmgr ,
No final o conteudo dos ficheiros deve algo do genero.
$ cat listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = PRODCDB)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1)
(SID_NAME = PRODCDB)
)
(SID_DESC =
(GLOBAL_DBNAME = PRODCDB_DGMGRL)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1)
(SID_NAME = PRODCDB)
)
(SID_DESC =
(GLOBAL_DBNAME = DRSITECDB)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1)
(SID_NAME = DRSITECDB)
)
(SID_DESC =
(GLOBAL_DBNAME = DRSITECDB_DGMGRL)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1)
(SID_NAME = DRSITECDB)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oretail.example.com)(PORT = 1521))
)
ADR_BASE_LISTENER = /u01/app/oracle
$ cat tnsnames.ora
PRODCDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oretail.example.com)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PRODCDB)
)
)
DRSITECDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oretail.example.com)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = DRSITECDB)
)
)
$ lsnrctl stop; lsnrctl start
LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 05-OCT-2018 14:52:08
Copyright (c) 1991, 2014, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oretail.example.com)(PORT=1521)))
The command completed successfully
LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 05-OCT-2018 14:52:08
Copyright (c) 1991, 2014, Oracle. All rights reserved.
Starting /u01/app/oracle/product/12.1.0/dbhome_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 12.1.0.2.0 - Production
System parameter file is /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/oretail/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oretail.example.com)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oretail.example.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date 05-OCT-2018 14:52:08
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/oretail/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oretail.example.com)(PORT=1521)))
Services Summary...
Service "PRODCDB" has 1 instance(s).
Instance "PRODCDB", status UNKNOWN, has 1 handler(s) for this service...
Service "DRSITECDB" has 1 instance(s).
Instance "DRSITECDB", status UNKNOWN, has 1 handler(s) for this service...
Service "DRSITECDB_DGMGRL" has 1 instance(s).
Instance "DRSITECDB", status UNKNOWN, has 1 handler(s) for this service...
Service "PRODCDB_DGMGRL" has 1 instance(s).
Instance "PRODCDB", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
$ tnsping PRODCDB
TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 05-OCT-2018 10:49:55
Copyright (c) 1997, 2014, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oretail.example.com)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = PRODCDB)))
OK (0 msec)
$ tnsping DRSITECDB
TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 05-OCT-2018 10:49:57
Copyright (c) 1997, 2014, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oretail.example.com)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = DRSITECDB)))
OK (0 msec)
# listener.ora Network Configuration File: /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = PRODCDB)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1)
(SID_NAME = PRODCDB)
)
(SID_DESC =
(GLOBAL_DBNAME = PRODCDB_DGMGRL)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1)
(SID_NAME = PRODCDB)
)
(SID_DESC =
(GLOBAL_DBNAME = DRSITECDB)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1)
(SID_NAME = DRSITECDB)
)
(SID_DESC =
(GLOBAL_DBNAME = DRSITECDB_DGMGRL)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/dbhome_1)
(SID_NAME = DRSITECDB)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oretail.example.com)(PORT = 1521))
)
ADR_BASE_LISTENER = /u01/app/oracle
$ cat tnsnames.ora
PRODCDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oretail.example.com)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PRODCDB)
)
)
DRSITECDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oretail.example.com)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = DRSITECDB)
)
)
$ lsnrctl stop; lsnrctl start
LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 05-OCT-2018 14:52:08
Copyright (c) 1991, 2014, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oretail.example.com)(PORT=1521)))
The command completed successfully
LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 05-OCT-2018 14:52:08
Copyright (c) 1991, 2014, Oracle. All rights reserved.
Starting /u01/app/oracle/product/12.1.0/dbhome_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 12.1.0.2.0 - Production
System parameter file is /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/oretail/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oretail.example.com)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oretail.example.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date 05-OCT-2018 14:52:08
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/oretail/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oretail.example.com)(PORT=1521)))
Services Summary...
Service "PRODCDB" has 1 instance(s).
Instance "PRODCDB", status UNKNOWN, has 1 handler(s) for this service...
Service "DRSITECDB" has 1 instance(s).
Instance "DRSITECDB", status UNKNOWN, has 1 handler(s) for this service...
Service "DRSITECDB_DGMGRL" has 1 instance(s).
Instance "DRSITECDB", status UNKNOWN, has 1 handler(s) for this service...
Service "PRODCDB_DGMGRL" has 1 instance(s).
Instance "PRODCDB", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
$ tnsping PRODCDB
TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 05-OCT-2018 10:49:55
Copyright (c) 1997, 2014, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oretail.example.com)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = PRODCDB)))
OK (0 msec)
$ tnsping DRSITECDB
TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 05-OCT-2018 10:49:57
Copyright (c) 1997, 2014, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oretail.example.com)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = DRSITECDB)))
OK (0 msec)
3 . DRSITECDB – Criar Physical Standby
No servidor da standby, vamos tratar dos ficheiros no sistema operativo e instancia
- criar uma entrada para a standby no ficheiro /etc/oratab
- copiar o ficheiro orapw
- criar as pastas para para a base de dados
- criar um pfile como as entradas minimas
- criar um spfile
- deixar a instancia em nomount
- com RMAN duplicar a primary - nao esquecer que e necesario fazer um backup antes do duplicate
$ echo "DRSITECDB:/u01/app/oracle/product/12.1.0/dbhome_1:N" >> /etc/oratab
$ tail -n 2 /etc/oratab
#...
PRODCDB:/u01/app/oracle/product/12.1.0/dbhome_1:N
DRSITECDB:/u01/app/oracle/product/12.1.0/dbhome_1:N
$ cp $ORACLE_HOME/dbs/orapwPRODCDB $ORACLE_HOME/dbs/orapwDRSITECDB
$ mkdir -p /u01/app/oracle/oradata/DRSITECDB/controlfile
$ mkdir -p /u01/app/oracle/oradata/DRSITECDB/onlinelog
$ mkdir -p /u01/app/oracle/oradata/DRSITECDB/datafile
$# create a pfile
$ echo "db_name=PRODCDB
db_unique_name=DRSITECDB
control_files='/u01/app/oracle/oradata/DRSITECDB/controlfile/o1_mf_fvdyll4b_.ctl', '/u01/app/oracle/fra/DRSITECDB/controlfile/o1_mf_fvdyll6s_.ctl'
db_file_name_convert='PRODCDB','DRSITECDB'
log_file_name_convert='PRODCDB','DRSITECDB'
pdb_file_name_convert='PRODCDB','DRSITECDB'
db_recovery_file_dest='/u01/app/oracle/fra'
db_recovery_file_dest_size=4560M
compatible='12.1.0.2.0'
enable_pluggable_database = true
">/tmp/pfileDRSITECDB
12c - only
$ . oraenv
ORACLE_SID = [PRODCDB] ? DRSITECDB
The Oracle base remains unchanged with value /u01/app/oracle
$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on Fri Oct 5 21:43:29 2018
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to an idle instance.
SQL> create spfile from pfile='/tmp/pfileDRSITECDB' ;
File created.
SQL> startup nomount;
ORACLE instance started.
$ rman target sys/oracle@PRODCDB auxiliary sys/oracle@DRSITECDB
Recovery Manager: Release 12.1.0.2.0 - Production on Fri Oct 5 11:54:22 2018
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
connected to target database: PRODCDB (DBID=2986740707)
connected to auxiliary database: PRODCDB (not mounted)
RMAN> backup database;
.... < trunc output >
Finished backup at 05-OCT-18
Starting Control File and SPFILE Autobackup at 05-OCT-18
.... < trunc output >
Finished Control File and SPFILE Autobackup at 05-OCT-18
RMAN> duplicate target database for standby ;
.... < trunc output >
Finished Duplicate Db at 05-OCT-18
4 . DGMGRL – Criar a confguracao DG
A secao seginte irei usar DGMGRL para terminar a configuracao, mas antes para e activar o parameteros do broker
- dg_broker_config_file1
- dg_broker_config_file2
- dg_broker_start
$ sqlplus sys/oracle@PRODCDB as sysdba
SQL> set lines 200
SQL> show parameter dg_brok
TYPE VALUE
------------------------------------ ----------- ------------------------------
dg_broker_config_file1 string /u01/app/oracle/product/12.1.0/dbhome_1/dbs/dr1PRODCDB.dat
dg_broker_config_file2 string /u01/app/oracle/product/12.1.0/dbhome_1/dbs/dr2PRODCDB.dat
dg_broker_start boolean FALSE
SQL> alter system set dg_broker_start = TRUE scope=both;
SQL> System altered.
SQL> show parameter dg_brok
TYPE VALUE
------------------------------------ ----------- ------------------------------
dg_broker_config_file1 string /u01/app/oracle/product/12.1.0/dbhome_1/dbs/dr1PRODCDB.dat
dg_broker_config_file2 string /u01/app/oracle/product/12.1.0/dbhome_1/dbs/dr2PRODCDB.dat
dg_broker_start boolean TRUE
SQL> exit
$ sqlplus sys/oracle@DRSITECDB as sysdba
SQL> show parameter dg_brok
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dg_broker_config_file1 string /u01/app/oracle/product/12.1.0/dbhome_1/dbs/dr1DRSITECDB.dat
dg_broker_config_file2 string /u01/app/oracle/product/12.1.0/dbhome_1/dbs/dr2DRSITECDB.dat
dg_broker_start boolean FALSE
SQL> alter system set dg_broker_start = TRUE scope=both;
System altered.
SQL> show parameter dg_brok
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dg_broker_config_file1 string /u01/app/oracle/product/12.1.0/dbhome_1/dbs/dr1DRSITECDB.dat
dg_broker_config_file2 string /u01/app/oracle/product/12.1.0/dbhome_1/dbs/dr2DRSITECDB.dat
dg_broker_start boolean TRUE
SQL> exit
$ dgmgrl sys/oracle@PRODCDB
DGMGRL> CREATE CONFIGURATION PRODCDB_CONFIG AS PRIMARY DATABASE IS "PRODCDB" CONNECT IDENTIFIER IS "PRODCDB";
Configuration "prodcdb_config" created with primary database "PRODCDB"
DGMGRL> ADD DATABASE "DRSITECDB" AS CONNECT IDENTIFIER IS "DRSITECDB";
Database "DRSITECDB" added
DGMGRL> ENABLE CONFIGURATION;
Enabled.
DGMGRL> SHOW CONFIGURATION;
Configuration - prodcdb_config
Protection Mode: MaxPerformance
Members:
PRODCDB - Primary database
DRSITECDB - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:SUCCESS (status updated 54 seconds ago)
5 . DGMGRL – Testar
OK - o post ja vai longo, vamos la verificar as configuracoes de DG, pode mos verificar que os parameteros foram preenchidos .
SQL> select NAME,VALUE from v$parameter where name in ('log_archive_dest_2','log_archive_dest_state_2','log_archive_config');
NAME VALUE
--------------------------- -------------------------------------------------------------------------
log_archive_dest_2 service="DRSITECDB", ASYNC NOAFFIRM delay=0 optional
compression=disable max_failure=0 max_connections=1 reopen=300
db_unique_name="DRSITECDB" net_timeout=30, valid_for=(online_logfile,all_roles)
log_archive_dest_state_2 ENABLE
log_archive_config dg_config=(PRODCDB,DRSITECDB)
SQL> set pages 50
set lines 200
col name form a10
col db_unique_name form a15
col log_mode form a15
col switchover_status form a20
col force_logging form a20
select name, db_unique_name, switchover_status, log_mode, flashback_on , force_logging from v$database;
SQL> SQL> SQL> SQL> SQL> SQL> SQL>
NAME DB_UNIQUE_NAME SWITCHOVER_STATUS LOG_MODE FLASHBACK_ON FORCE_LOGGING
---------- --------------- -------------------- --------------- ------------------ --------------------
PRODCDB PRODCDB TO STANDBY ARCHIVELOG NO YES
Testar : Fazer switchover entre as bases de dados.
[oracle@oretail admin]$ dgmgrl sys/oracle@PRODCDB
DGMGRL for Linux: Version 12.1.0.2.0 - 64bit Production
Copyright (c) 2000, 2013, Oracle. All rights reserved.
Welcome to DGMGRL, type "help" for information.
Connected as SYSDBA.
DGMGRL> show configuration;
Configuration - prodcdb_config
Protection Mode: MaxPerformance
Members:
PRODCDB - Primary database
DRSITECDB - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS (status updated 14 seconds ago)
DGMGRL> switchover to "DRSITECDB";
Performing switchover NOW, please wait...
Operation requires a connection to instance "DRSITECDB" on database "DRSITECDB"
Connecting to instance "DRSITECDB"...
Connected as SYSDBA.
New primary database "DRSITECDB" is opening...
Operation requires start up of instance "PRODCDB" on database "PRODCDB"
Starting instance "PRODCDB"...
ORACLE instance started.
Database mounted.
Switchover succeeded, new primary is "DRSITECDB"
DGMGRL> show configuration;
Configuration - prodcdb_config
Protection Mode: MaxPerformance
Members:
DRSITECDB - Primary database
PRODCDB - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS (status updated 41 seconds ago)
DGMGRL> switchover to "PRODCDB";
Performing switchover NOW, please wait...
Operation requires a connection to instance "PRODCDB" on database "PRODCDB"
Connecting to instance "PRODCDB"...
Connected as SYSDBA.
New primary database "PRODCDB" is opening...
Operation requires start up of instance "DRSITECDB" on database "DRSITECDB"
Starting instance "DRSITECDB"...
ORACLE instance started.
Database mounted.
Switchover succeeded, new primary is "PRODCDB"
DGMGRL> show configuration;
Configuration - prodcdb_config
Protection Mode: MaxPerformance
Members:
PRODCDB - Primary database
DRSITECDB - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS (status updated 21 seconds ago)
Obrigado pela leitura, espero que este post o tenha ajudado...
Comments