Instalação do Oracle Data Guard 12c

Por André Luiz Dutra Ontalba,
Postado em Outubro 2015

Do que se trata o artigo: Neste artigo vamos realizar a instalação do Oracle Data Guard 12c.

Em que situação o tema é útil: Montagem de ambiente Contingência com Oracle Data Guard

Olá amigos, hoje vamos a um desafio bem grande montar um Oracle Data Guard 12c

Como laboratório vamos estar usando asmídias do Oracle Database 12c e do virtualbox que se encontram nos links abaixo:

Vamos precisar das seguintes mídias para realizar a instalação do ambiente:

Bem agora que já fizemos toda parte de download do material para montar este ambiente vamos iniciar as instalações.

Primeiramente vamos criar as maquinas para o ambiente do Data Guard, conforme os procedimentos abaixo.

Nesta tela definimos o tipo de SO e a versão do mesmo, vamos utilizar o Oracle Linux 6 Update 5 em 64 Bits e vamos nomear este equipamento de DG1.

Nesta tela vamos definir o tamanho da memória do node neste caso vamos ter 2048 MB.

Nesta tela vamos selecionar a criação do drive que vai receber o sistema operacional do NODE1, selecione a opção “Create a virtual hard drive now”,  e depois clique em NEXT.

Nesta tela vamos selecionar o tipo de arquivo do disco virtual no caso vamos utilizar o VDI, depois de selecionar clique em NEXT.

Nesta tela vamos selecionar o tipo de alocação do disco, selecione a opção “Dynamically allocated”, e depois clique em NEXT.

Nesta tela vamos definir o tamanho do disco para instalar o SO e os binários do Oracle Database, estamos usando 20 GB.

Após criamos a máquina vamos agora habilitar 1 placa de rede que sera utilizada na rede do Data Guard.

Para chegar na tela a seguir, selecione a máquina que você criou e clique no botão settings do Virtualbox e depois que abrir a janela selecione a opção Network.

Nesta tela vamos definir na primeira placa de rede que a mesma vai funcionar na rede Host-only do virtualbox.

Depois de selecionar a opção clique no OK e vamos instalar o Sistema Operacional Oracle Linux 6. Para isso clique no item Storage e selecione a mídia do Oracle Linux 6.

Depois de um Start na máquina Virtual DG1 e vamos iniciar a instalação do S.O.

Bem nesta tela selecione a opção “Install or Upgrade an existing system”, e depois de um ENTER.

Nesta tela selecione a opção SKIP, pois não é necessário a validação da mídia, após selecionado de um ENTER.

Continue com a instalação do Oracle Linux como você faria para um servidor normal. Nas próximas três telas selecionar Language, teclado e dispositivos de armazenamento do tipo básicos.

Confirmar para descartar quaisquer dados.

Defina "Hostname" para db01dg e pressione "Configure Network".

Na tela de conexões de rede, selecione "System eth0", que será usada para a rede pública, e pressione "Edit"

Certifique-se de que "Conectar automaticamente" está marcada. Selecione a aba "Configurações IPv4"; alterar o método para "Manual"; Pressione o botão "Add" e preencha Endereço: 192.168.56.71; Máscara de rede: 255.255.255.0; Gateway: 0.0.0.0.

Pressione o botão "Apply".

Fechar tela Conexões de rede e vá para a tela de configuração seguinte.

Selecione o fuso horário.

Digite a senha do Root, coloquei como oracle.

Selecione "Use All Space" para o tipo de preparação do disco e marque a opção "Review and modify partitioning layout", clique em NEXT.

Clique em NEXT e confirme através de avisos e criar partições. Manter padrões de tela do carregador de inicialização.

Na tela de instalação do tipo de software, selecione "Database Server" e verifique o botão "Personalizar agora".

Pressione Next

Na tela Personalização selecione "Databases" e desmarque todos os itens.

Selecione "Desktops" e marque "Ferramentas gráficas de administração" "Desktop" e em seguida, pressione Next e aguarde até o final da instalação e depois Reinicie o Sistema Operacional.

Quando ele volta, não haverá mais telas de configuração para lidar com óbvias. Não crie conta 'Oracle', isso será feito mais tarde. Você pode ignorar as configurações Kdump.

Parabéns! O Linux foi instalado.

Bem após ter instalado o Linux, abra um terminal no Linux para que possamos dar continuidade as atividades.

Instalação do Oracle Clusterware – Pré requisitos.

Bem após ter instalado o Linux, abra um terminal no Linux para que possamos dar continuidade as atividades.

Todas as ações nesta seção devem ser executados pelo usuário root e devem ser executadas nos dois nodes.

Instalar pacote “oracle-rdbms-server-12cR1-preinstall”. Este pacote realiza pré-requisitos do kernel incluindo mudança de parâmetros e criação de conta Oracle Linux.

Execute no terminal o comando abaixo:


  
yum install oracle-rdbms-server-12cR1-preinstall    
 
 

Aguarde até o mesmo fazer download da internet deste pacote e realizar a instalação do mesmo.

Vamos agora desabilitar o SELINUX do sistema operacional.


  
vi /etc/selinux/config
 
 
 

Dentro do arquivo trocar o SELINUX que estiver setado para a opção abaixo. 


  
SELINUX=disabled
 
 

Salve o arquivo e saia do mesmo :wq no editor.

Após feito este passo, vamos configurar a parte de network para comunicação das máquinas.

Edite o arquivo hosts localizado no /etc:


  
vi /etc/hosts
 
 

Limpe todas as configurações do arquivo e adicione a seguintes entradas:


  
192.168.56.71    db01dg        db01dg 
 192.168.56.72    db02dg        db02dg
 
 

Após feito isso salve o arquivo e saia com o comando :wq

Desabilite o Firewall do Linux da seguinte forma:


  
service iptables stop 
service ip6tables stop
chkconfig iptables off
chkconfig ip6tables off

 
 

Após feito isso vamos clonar o equipamento para criar o DG2.

Instalando Oracle Database 12C

Faça o login no "db01dg" como usuário oracle para iniciarmos a instalação do binário do Oracle Database 12c.


  
$ cd /media/database 
 $ ./runInstaller
 
 

Desmarque a opção "I wish to receive security update via My Oracle Support" e pressione o botão "Next".

Selecione "Skip software updates", e clique em "NEXT".

Selecione a opção “Install database software Only”, e clique em “NEXT”.

Selecione a opção “Single Instance database installation” e clique em “NEXT”.

Na tela de Languages, clique em Next.

Na tela de “Database Edition”, selecione a opção Enterprise Edition e clique em “NEXT”.

Na tela de “Installation Location”, recomendamos seguir a sugestão padrão, caso seja necessário altere o caminho, e após isso clique em “NEXT”.

Mantenha os padrões em "Operating Systems Groups" e pressione "Next". Ignorar aviso na tela seguinte.

No item Prerequisite Checks, na minha instalação passou sem grandes problemas, caso apresente algo a vocês verifiquem os alertas, solucione os problemas antes da instalação.

Após tudo OK clique em Install.

Após o termino da instalação irá apresentar uma tela para execução de um script que deve ser executado.

Após isso vamos fazer a configuração do bash_profile do usuário oracle no DG1.

Edite o arquivo hosts localizado no /home/oracle/:


  
vi /home/oracle/.bash_profie
 
 

Adicione as seguintes configurações:


  
# Oracle Settings
export TMP=/tmp
export TMPDIR=$TMP  
export ORACLE_HOSTNAME=db01dg
export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/12.1.0
export ORACLE_SID=DG1
export ORACLE_TERM=xterm
export PATH=/usr/sbin:$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
 
 

Após feito isso salve o arquivo e saia com o comando :wq

Após a clonagem, teremos os seguintes ambientes para os testes de Data Guard:

TIPO VM HOSTNAME IP SID
PRIMARY DG1 DB01DG 192.168.56.71 DG1
STANDBY DG2 DB02DG 192.168.56.72 DG2ST

Clone equipamento para criação do DG2.

De um shutdown na sua máquina DG1 para que possamos iniciar o clone do ambiente.

No menu do VirtualBox “MACHINE” selecione a opção clone.

Digite "DG2" para o nome da nova máquina.

Certifique-se de que "Reinitialize the MAC address of all network cards" não está marcada.  Em seguida, pressione "Next":

Mantenha a opção "Full Clone" selecionado e pressione "Clone" para iniciar o clone do ambiente.

Após finalizar o clone com a máquina DG1 ainda em shutdown inicie a máquina DG2 e conecte como ROOT.

Após feito isso vamos configurar alguns itens para que não apresente problemas nas máquinas.

Primeiro vamos alterar o hostname do equipamento conforme instrução abaixo:


  
vi /etc/sysconfig/network
 
 

Quando abrir o arquivo altere o item HOSTNAME que esta configurado com o nome do DG2 para o item abaixo


  
HOSTNAME=db02dg
 
 

Após isso precisamos realizar a edição dos ip´s da placa de rede eth0 da máquina clonada.

Clique com o botão direito no ícone que demonstra 2 computadores para habilitar a edição das conexões de rede

Edite a placa eth0, com o ip conforme imagem.

Após feito o altere o MAC adresses de cada placa estamos trocando somente o final para 00 de todas as placas.

Após isso vamos fazer a configuração do bash_profile do usuário oracle no DG2.

Edite o arquivo hosts localizado no /home/oracle/:


  
vi /home/oracle/.bash_profie
 
 

Adicione as seguintes configurações:


  
# Oracle Settings
export TMP=/tmp
export TMPDIR=$TMP  
export ORACLE_HOSTNAME=db02dg
export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/12.1.0
export ORACLE_SID=DG2ST
export ORACLE_TERM=xterm
export PATH=/usr/sbin:$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
 
 

Após feito isso salve o arquivo e saia com o comando :wq

Após feito isso de um shutdown no equipamento e altere o MAC adresses também no VirtualBox.

Após feito isso vamos iniciar a criação dos database.

Criando Database Oracle 12C

Faça o login no DG1 como usuário oracle para criação do banco de dados.


  
$ dbca
 
 

Neste item selecione a opção "Create Database" e clique em NEXT.

Neste item selecione a opção "Advanced Mode" para que possamos realizar uma instalação customizada e clique em NEXT.

Neste item selecione a “Template General Purpose or Transaction Processing” como modelo de banco de dados e clique em NEXT.

Neste item digite o “Global Database Name” e o “SID” neste caso estamos usando DG1, após feito isso clique em NEXT.

Neste item selecione a opção de “Configure Enterprise Manager(EM) Database Express”, após feito isso clique em NEXT.

Neste item selecione a opção “Use the Same Administrative Password for All Accounts” para que possamos usar uma única senha lembrando que isso é um laboratório e como boas práticas, devemos sempre ter senhas com complexidade e diferentes para todos os usuários. Após feito isso clique em NEXT.

Neste item selecione a opção “Select” depois digite LISTENER e digite 1521 no item “PORT”,após feito isso clique em NEXT.

Neste item selecione a opção “File System” em “Database Files” depois selecione “Use Database File Locations from Template”.

Após feito isso selecione a opção “File System” em “Storage Type do Recovery Related Files” e selecione as opções “Specify Fast Recovery Area” e “Enable Archiving”, após feito isso clique em NEXT.

Neste item não marque nada e clique em NEXT.

Neste item como estamos montando um laboratório, deixe as opções já selecionadas e após feito isso clique em NEXT.

Neste item selecione a opção “Create Dtabase”, após feito isso clique em NEXT.

Neste item será exibido uma resumo do que você configurou, após fazer a analise clique em FINISH.

Aguarde o final da instalação e clique em CLOSE. 

Criando e configurando Oracle Data Guard 12C

Após feito toda parte de infraestrutura, vamos iniciar a criação do Data Guard.

No banco dados primário no DG1, vamos habilitar o archivelog mode.

Para você pode checar o modo de arquivamento do se o seu banco, através da seguinte consulta: 


  
SQL> SELECT LOG_MODE FROM V$DATABASE;

LOG_MODE
------------
NOARCHIVELOG    

Antes de ativar o arquivamento do banco de dados, vamos certificar o status do nosso listener e do próprio banco de dados.

lsnrctl status [oracle@db01dg ~]$ lsnrctl status   LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 25-SEP-2015 14:33:22   Copyright (c) 1991, 2013, Oracle.  All rights reserved.   Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db01dg)(PORT=1521))) STATUS of the LISTENER                                                      ------------------------                                                     Alias                     LISTENER                                          Version                   TNSLSNR for Linux: Version 12.1.0.1.0 - Production Start Date                25-SEP-2015 14:24:53                               Uptime                    0 days 0 hr. 8 min. 28 sec                        Trace Level               off                                               Security                  ON: Local OS Authentication                       SNMP                      OFF                                               Listener Parameter File   /oracle/12.1.0/network/admin/listener.ora         Listener Log File         /oracle/diag/tnslsnr/db01dg/listener/alert/log.xml Listening Endpoints Summary...                                                 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db01dg)(PORT=1521)))              (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))                     (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=db01dg)(PORT=5500)) (Security=(my_wallet_directory=/oracle/admin/DG1/xdb_wallet))(Presentation=HTTP)(Session=RAW))  Services Summary...                                                             Service "DG1" has 1 instance(s).                                                  Instance "DG1", status READY, has 1 handler(s) for this service...            Service "DG1XDB" has 1 instance(s).                                               Instance "DG1", status READY, has 1 handler(s) for this service...       [oracle@db01dg ~]$ sqlplus / as sysdba   SQL*Plus: Version 12.1.0.1.0 - Production on 25-SEP-2015 14:35:22   Copyright (c) 1991, 2013, Oracle.  All rights reserved.   Connected to an idle instance.   SQL> startup ORACLE instance started.   Total System Global Area 1853947904 bytes Fixed Size                 2229384 bytes Variable Size            452987768 bytes Database Buffers       1392508928 bytes Redo Buffers               6221824 bytes Database mounted. Database opened. SQL>  

Com o database primário iniciado, vamos criar o diretório para onde os archives logs gerados pelo banco será salvo.


  
SQL> !mkdir -p /oracle/arch
 
 

Precisamos agora, definir o formato que será gravado o nosso arquivo de log no disco e a sua localização, temos para isso dois parâmetros: o log_archive_format e log_archive_dest_1. 


  
SQL> alter system set log_archive_format='orcl_%t_%s_%r.arc' scope=spfile;  
System altered.  
SQL> alter system set log_archive_dest_1='LOCATION=/oracle/arch' scope=spfile;  
System altered.
 
 

Com todas as configurações feitas, vamos agora ativar o modo de ARCHIVELOG. Para que isso é necessário baixar e subir a instância do banco Oracle.


  
SQL> shut immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
 
SQL> startup mount
ORACLE instance started.
 
Total System Global Area 1853947904 bytes
Fixed Size                 2229384 bytes
Variable Size            452987768 bytes
Database Buffers        1392508928 bytes
Redo Buffers               6221824 bytes
Database mounted.
 
SQL> alter database archivelog;
 
Database altered.
 
SQL> alter database open;
 
Database altered.
 
SQL> archive log list
Database log mode             Archive Mode
Automatic archival            Enabled
Archive destination           /oracle/arch
Oldest online log sequence     1
Next log sequence to archive   3
Current log sequence           3 
 
 

Agora precisamos habilitar o modo de FORCE LOGGING no banco de dados Oracle, todas as mudanças que ocorrem no banco de dados são gerados logs, exceto para as tabelas e tablespaces temporários. Isso é fundamental para o Oracle Data Guard, pois assegura que toda transação efetivada (commit) pode ser capturada através dos arquivos de log do Oracle (redo ou archive).

Podemos ativar o modo de FORCE LOGGING da seguinte maneira:


  
alter database force logging;  
select force_logging from v$database;  
SQL> select force_logging from v$database;
 
FOR
---
YES  
 
 

Agora precisamos criar os arquivos de STANDBY REDO para o ambiente,  o Oracle Data Guard pode recuperar e aplicar mais dados do Standby Redo Log do que no convencional Redo Log, por isso a criação de SRL se faz necessária quando estamos montando um Oracle Data Guard.

Com a formula seguinte, é possível determinar o número apropriado dos SRL:

(maximum number of logfiles for each thread + 1) * maximum number of threads

Para o nosso caso: (3 + 1) * 1 = 4

É necessário também que o tamanho do SRL seja exatamente igual ao do Redo Log presente no seu banco, que no nosso ambiente é 100M.

Vamos então adicionar os 4 SRL para o database primário:


  
alter database add standby logfile group 4 '/oracle/oradata/DG1/redo_st04.log' size 100M; 
 
alter database add standby logfile group 5 '/oracle/oradata/DG1/redo_st05.log' size 100M;
 
alter database add standby logfile group 6 '/oracle/oradata/DG1/redo_st06.log' size 100M;
 
alter database add standby logfile group 7  '/oracle/oradata/DG1/redo_st07.log' size 100M;
 
select group#, sequence#, archived, status from v$standby_log;
 
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------
         4          0 YES UNASSIGNED
         5          0 YES UNASSIGNED
         6          0 YES UNASSIGNED
         7          0 YES UNASSIGNED
 
 

Agora vamos configurar os parâmetros de inicialização do ambiente no DG1.

Para uma configuração simples de Oracle Data Guard, basicamente precisamos mudar os 8 parâmetros de inicialização abaixo:


  
alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(DG1,DG2ST)'; 
 
alter system set LOG_ARCHIVE_DEST_1='LOCATION=/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=DG1';
 
alter system set LOG_ARCHIVE_DEST_2='SERVICE=DG2ST LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)   DB_UNIQUE_NAME=DG2ST'; 
 
alter system set LOG_ARCHIVE_DEST_STATE_1=ENABLE; 
 
alter system set FAL_SERVER=DG2ST; 
 
alter system set FAL_CLIENT=DG1; 
 
alter system set DB_FILE_NAME_CONVERT='/oracle/oradata/DG2ST','/oracle/oradata/DG1' scope=spfile; 
 
alter system set LOG_FILE_NAME_CONVERT='/oracle/oradata/DG2ST','/oracle/oradata/DG1' scope=spfile;
 
 

Segue a explicação de cada um deles:

LOG_ARCHIVE_CONFIG: Habita ou desabilita o comportamento de enviar as mensagens do redo log para o destino. Com a opção DG_CONFIG, podemos definir um range de até 9 destinos, definindo através do DB_UNIQUE_NAME de cada um deles.

LOG_ARCHIVE_DEST_1: Especifica o caminho do primeiro destino de archive do banco de dados. No nosso caso ele será gravado no caminho “/oracle/arch” do servidor do banco primário. A opção VALID_FOR define como será gravado os dados.

LOG_ARCHIVE_DEST_2: Esse parâmetro, defini o segundo destino de archive. Nesse parâmetro que concentra a mágica do Oracle Data Guard, diferente com o que fizemos no primeiro destino (LOG_ARCHIVE_DEST_1), vamos fazer com que o segundo destino de archive do banco primário seja gravado no primeiro destino de archive do banco standby. Veja que é exatamente o que definimos nesse parâmetro, pedidos para o LGWR escrever os dados de log através do serviço chamado “DG2ST” para o banco de dados “DG2ST”

LOG_ARCHIVE_DEST_STATE_1: Com esse parâmetro, apenas definimos que o primeiro destino de archive está habitado. Por enquanto o segundo destino de archive (LOG_ARCHIVE_DEST_STATE_2) que levará os dados de log para o Data Guard, matemos desativado.

FAL_SERVER e FAL_CLIENT: São parâmetros de inicialização usados para o FAL (fetch archive log), ou seja é utilizado para a detecção e resolução dos destinos do Data Guard. Basicamente, o no banco primário o FAL_SERVER será o TNS service name do banco standby e vice-versa.

DB_FILE_NAME_CONVERT: Ele não é mandatório para o Data Guard, na verdade sua função não é nem para o Data Guard, ele é apenas utilizado no momento do recovery. Esse parâmetro como o nome diz converte o nome do datafile e tempfile do primário database para o correspondente caminho no standby database, é utíl muito útil nomomento do recover, pois assim podemos renomear os datafiles facilmente. No nosso caso, vamos converter todos os datafiles que estão no caminho “/oracle/oradata/DG1” no primário database para o novo caminho “/oracle/oradata/DG2ST” no standby database.

LOG_FILE_NAME_CONVERT: O parâmetro LOG_FILE_NAME_CONVERT faz exatamente o que o DB_FILE_NAME_CONVERT faz, porém apenas com redo logs. 

Agora vamos fazer o backup do banco de dados no DG1.

Com todas as configurações feitas, precisamos agora realizar um backup do banco primário. O backup será feito através do RMAN no seguinte caminho: “/oracle/backup/”


  
Siga os passos abaixo:
[oracle@db01dg ~]$ mkdir -p /oracle/backup/
[oracle@db01dg ~]$ rman target /
 
Recovery Manager: Release 12.1.0.1.0 - Production on Fri Sep 25 14:59:17 2015
 
Copyright (c) 1982, 2013, Oracle and/or its affiliates.  All rights reserved.
 
connected to target database: DG1 (DBID=1872722065)
 
RMAN> run {   
2> allocate channel c1 type disk;
3> allocate channel c2 type disk;                              
4> backup database format '/oracle/backup/%d_%s_%p_%U.bkp';    
5> backup archivelog all format '/oracle/backup/ARCH_%d_%s_%p_%U.bkp';
6> backup current controlfile for standby format '/oracle/backup/control_%d_%U.bkp';
7> }                                                                                
 
using target database control file instead of recovery catalog
allocated channel: c1                                         
channel c1: SID=47 device type=DISK                           
 
allocated channel: c2
channel c2: SID=43 device type=DISK
 
Starting backup at 25-SEP-15
channel c1: starting full datafile backup set
channel c1: specifying datafile(s) in backup set
input datafile file number=00001 name=/oracle/oradata/DG1/system01.dbf
input datafile file number=00006 name=/oracle/oradata/DG1/users01.dbf 
channel c1: starting piece 1 at 25-SEP-15                             
channel c2: starting full datafile backup set                         
channel c2: specifying datafile(s) in backup set                      
input datafile file number=00003 name=/oracle/oradata/DG1/sysaux01.dbf
input datafile file number=00004 name=/oracle/oradata/DG1/undotbs01.dbf
channel c2: starting piece 1 at 25-SEP-15                              
channel c1: finished piece 1 at 25-SEP-15                              
piece handle=/oracle/backup/DG1_1_1_01qi21dp_1_1.bkp tag=TAG20150925T150321 comment=NONE
channel c1: backup set complete, elapsed time: 00:01:55                                 
channel c1: starting full datafile backup set                                           
channel c1: specifying datafile(s) in backup set                                        
channel c2: finished piece 1 at 25-SEP-15                                               
piece handle=/oracle/backup/DG1_2_1_02qi21dq_1_1.bkp tag=TAG20150925T150321 comment=NONE
channel c2: backup set complete, elapsed time: 00:01:55                                 
channel c2: starting full datafile backup set                                           
channel c2: specifying datafile(s) in backup set                                        
including current SPFILE in backup set                                                  
channel c2: starting piece 1 at 25-SEP-15                                               
including current control file in backup set                                            
channel c1: starting piece 1 at 25-SEP-15                                               
channel c2: finished piece 1 at 25-SEP-15                                               
piece handle=/oracle/backup/DG1_4_1_04qi21hd_1_1.bkp tag=TAG20150925T150321 comment=NONE
channel c2: backup set complete, elapsed time: 00:00:01                                 
channel c1: finished piece 1 at 25-SEP-15                                               
piece handle=/oracle/backup/DG1_3_1_03qi21hd_1_1.bkp tag=TAG20150925T150321 comment=NONE
channel c1: backup set complete, elapsed time: 00:00:01                                 
Finished backup at 25-SEP-15                                                            
 
Starting backup at 25-SEP-15
current log archived        
channel c1: starting archived log backup set
channel c1: specifying archived log(s) in backup set
input archived log thread=1 sequence=2 RECID=1 STAMP=891354582
channel c1: starting piece 1 at 25-SEP-15                     
channel c2: starting archived log backup set                  
channel c2: specifying archived log(s) in backup set
input archived log thread=1 sequence=3 RECID=2 STAMP=891356064
input archived log thread=1 sequence=4 RECID=3 STAMP=891356721
channel c2: starting piece 1 at 25-SEP-15
channel c1: finished piece 1 at 25-SEP-15
piece handle=/oracle/backup/ARCH_DG1_5_1_05qi21hi_1_1.bkp tag=TAG20150925T150522 comment=NONE
channel c1: backup set complete, elapsed time: 00:00:15
channel c2: finished piece 1 at 25-SEP-15
piece handle=/oracle/backup/ARCH_DG1_6_1_06qi21hi_1_1.bkp tag=TAG20150925T150522 comment=NONE
channel c2: backup set complete, elapsed time: 00:00:15
Finished backup at 25-SEP-15
 
Starting backup at 25-SEP-15
channel c1: starting full datafile backup set
channel c1: specifying datafile(s) in backup set
including standby control file in backup set
channel c1: starting piece 1 at 25-SEP-15
channel c1: finished piece 1 at 25-SEP-15
piece handle=/oracle/backup/control_DG1_07qi21i2_1_1.bkp tag=TAG20150925T150538 comment=NONE
channel c1: backup set complete, elapsed time: 00:00:01
Finished backup at 25-SEP-15
released channel: c1
released channel: c2
 
RMAN>
 
 
 

Agora devemos criar uma cópia do arquivo de inicialização do nosso banco primário, a cópia deve ser feita no mesmo caminho do backup que acabamos de fazer, isso porque iremos mover toda essa pasta para o servidor do banco DG2.


  
[oracle@db01dg ~]$ sqlplus / as sysdba
 
SQL*Plus: Version 12.1.0.1.0 - Production on 25-SEP-2015 14:35:22
 
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
SQL> create pfile='/oracle/backup/initDG2.ora' from spfile;
File created.
 
 

Agora devemos realizar a cópia do arquivo de senha para o servidor DG2.


  
cd $ORACLE_HOME/dbs
[oracle@db01dg ~]$ scp orapwDG1 db02dg:/oracle/12.1.0/dbs/orapwDG2
oracle@db02dg password: *******
orapwDG1                                100%   96KB  96.0KB/s   00:00
 
 

O Oracle Data Guard é totalmente configurado para ser executado em cima do Oracle NET. Toda sua comunicação com os bancos de DG1 e DG2 é feito através do serviços configurados no TNS.

No nosso caso, assim como foi configurado os parâmetros  acima, precisamos ter os serviços “DG1” e “DG2” em ambas as máquinas.      


  
[oracle@db01dg ~] cd $ORACLE_HOME/network/admin
[oracle@db01dg admin]$ vi tnsnames.ora 
 
          Inclua estas entradas no arquivo do TNSNAMES
 
DG1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = db01dg)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = DG1)
    )
  )
 
 
DG2ST =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = db02dg)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = DG2ST)
    )
  )
 
 

Após feito isso salve o arquivo e saia com o comando :wq

Agora vamos realizar um teste de conectividade.


  
[oracle@db01dg admin]$ tnsping DG1
 
TNS Ping Utility for Linux: Version 12.1.0.1.0 - Production on 25-SEP-2015 14:33:22
 
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
 
Used parameter files:
 
Used TNSNAMES adapter to resolve the alias
Attempting to contact 
(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = db01dg)(PORT = 1521))
   (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = DG1)))
 
[oracle@db01dg admin]$ tnsping DG2ST
 
TNS Ping Utility for Linux: Version 12.1.0.1.0 - Production on 25-SEP-2015 14:33:29
 
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
 
Used parameter files:
 
Used TNSNAMES adapter to resolve the alias
Attempting to contact 
(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = db02dg)(PORT = 1521))  
 (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = DG2ST)))
 
 
 
 

Lembrando que na máquina DG2 o serviço do LISTENER deve estar iniciado.

Agora temos agora o nosso banco primário DG1 todo configurado e pronto para iniciar o standby, precisamos apenas mover o backup e o arquivo de inicialização que estão no nosso servidor primário para o banco standby DG2.


  
[oracle@db01dg admin]$ cd /oracle/backup
[oracle@db01dg backup]$ ls -ltr
total 1383856
-rw-r-----. 1 oracle oinstall 607723520 Sep 25 15:05 DG1_2_1_02qi21dq_1_1.bkp
-rw-r-----. 1 oracle oinstall 685727744 Sep 25 15:05 DG1_1_1_01qi21dp_1_1.bkp
-rw-r-----. 1 oracle oinstall     98304 Sep 25 15:05 DG1_4_1_04qi21hd_1_1.bkp
-rw-r-----. 1 oracle oinstall  10092544 Sep 25 15:05 DG1_3_1_03qi21hd_1_1.bkp
-rw-r-----. 1 oracle oinstall  51418112 Sep 25 15:05 ARCH_DG1_6_1_06qi21hi_1_1.bkp
-rw-r-----. 1 oracle oinstall  51900416 Sep 25 15:05 ARCH_DG1_5_1_05qi21hi_1_1.bkp
-rw-r-----. 1 oracle oinstall  10092544 Sep 25 15:05 control_DG1_07qi21i2_1_1.bkp
-rw-r--r--. 1 oracle oinstall      1379 Sep 25 15:11 initDG2ST.ora
[oracle@db01dg backup]$
 
 

Para que a restauração seja mais fácil, sem a necessidade de catalogar os backup, vamos criar o mesmo diretório no servidor DG2.

[oracle@db01dg backup]$ ssh oracle@db02dg mkdir -p /oracle/backup

  
oracle@db02dg's password: *****
 
 

Com o diretório criado, vamos mover todos os arquivos da pasta /oracle/backup/ para o servidor DG2.


  
[oracle@db01dg backup]$ scp * db02dg:`pwd`
oracle@db02dg's password: *******
ARCH_DG1_5_1_05qi21hi_1_1.bkp      100%   49MB  49.5MB/s   00:00
ARCH_DG1_6_1_06qi21hi_1_1.bkp      100%   49MB  49.0MB/s   00:01
control_DG1_07qi21i2_1_1.bkp       100% 9856KB   9.6MB/s   00:00
DG1_1_1_01qi21dp_1_1.bkp           100%  654MB  19.2MB/s   00:34
DG1_2_1_02qi21dq_1_1.bkp           100%  580MB  17.1MB/s   00:34
DG1_3_1_03qi21hd_1_1.bkp           100% 9856KB   9.6MB/s   00:01
DG1_4_1_04qi21hd_1_1.bkp           100%   96KB  96.0KB/s   00:00
initDG2ST.ora                      100% 1379     1.4KB/s   00:00
[oracle@db01dg backup]$
 
 

Agora que finalizamos toda configuração no DG1 vamos fazer a configuração do DG2 – Standby.

Vamos editar o arquivo initDG2.ora para acrescentarmos alguns parâmetros necessários do Oracle Data Guard.

Para isso, conecte na máquina de standby DG2 e faça as alterações como abaixo, observe que os parâmetros em negrito, são os parâmetros necessários para o Data Guard. 


  
[oracle@db02dg~] $ cd /oracle/backup
[oracle@db02dg backup]$ ls -ltr
total 1383856
-rw-r-----. 1 oracle oinstall 607723520 Sep 25 15:05 DG1_2_1_02qi21dq_1_1.bkp
-rw-r-----. 1 oracle oinstall 685727744 Sep 25 15:05 DG1_1_1_01qi21dp_1_1.bkp
-rw-r-----. 1 oracle oinstall     98304 Sep 25 15:05 DG1_4_1_04qi21hd_1_1.bkp
-rw-r-----. 1 oracle oinstall  10092544 Sep 25 15:05 DG1_3_1_03qi21hd_1_1.bkp
-rw-r-----. 1 oracle oinstall  51418112 Sep 25 15:05 ARCH_DG1_6_1_06qi21hi_1_1.bkp
-rw-r-----. 1 oracle oinstall  51900416 Sep 25 15:05 ARCH_DG1_5_1_05qi21hi_1_1.bkp
-rw-r-----. 1 oracle oinstall  10092544 Sep 25 15:05 control_DG1_07qi21i2_1_1.bkp
-rw-r--r--. 1 oracle oinstall      1379 Sep 25 15:11 initDG2ST.ora
[oracle@db01dg backup]$ vi initstdby.ora
 
*.audit_file_dest='/oracle/admin/DG2ST/adump'
*.compatible='12.1.0.0.0'
*.control_files='/oracle/oradata/DG2ST/control01.ctl','/oracle/oradata/DG2ST/control02.ctl'
*.db_block_size=8192
*.diagnostic_dest='/oracle'
*.log_archive_format='orcl_%t_%s_%r.arc'
*.open_cursors=300
*.pga_aggregate_target=616562688
*.sga_target=1849688064
*.undo_tablespace='UNDOTBS1'
*.db_name=DG1
*.db_unique_name=DG2ST
*.db_file_name_convert='/oracle/oradata/DG1','/oracle/oradata/DG2ST'
*.log_file_name_convert='/oracle/oradata/DG1','/oracle/oradata/DG2ST'
*.log_archive_config='DG_CONFIG=(DG1,DG2ST)'
*.log_archive_dest_1='LOCATION=/oracle/archive/DG2ST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=DG2ST'
*.log_archive_dest_2='SERVICE=DG1 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=DG1'
*.log_archive_dest_state_1='ENABLE'
*.fal_client='DG2ST'
*.fal_server='DG1'
*.remote_login_passwordfile='EXCLUSIVE'
*.standby_file_management=auto
 
 

Assim como fizemos na máquina DG1 (servidor primário), temos que configurar da mesma maneira no servidor DG2 o TNSNAMES.


  
[oracle@db02dg ~] cd $ORACLE_HOME/network/admin 
 [oracle@db02dg admin]$ vi tnsnames.ora 
 
 

Inclua estas entradas no arquivo do TNSNAMES


  
DG1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = db01dg)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = DG1)
    )
  )
 
 
DG2ST =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = db02dg)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = DG2ST)
    )
  )
 
 

Após feito isso salve o arquivo e saia com o comando :wq

Agora vamos realizar um teste de conectividade.


  
[oracle@db02dg admin]$ tnsping DG1
 
TNS Ping Utility for Linux: Version 12.1.0.1.0 - Production on 25-SEP-2015 14:33:22
 
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
 
Used parameter files:
 
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = db01dg)(PORT = 1521))   (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = DG1)))
 
[oracle@db02dg admin]$ tnsping DG2ST
 
TNS Ping Utility for Linux: Version 12.1.0.1.0 - Production on 25-SEP-2015 14:33:29
 
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
 
Used parameter files:
 
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = db02dg)(PORT = 1521))   (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = DG2ST)))
 
 
 

Lembrando que na máquina DG2 o serviço do LISTENER deve estar iniciado.

Agora para Para iniciar a instância DG2ST, precisamos dos seguintes diretórios criados:


  
[oracle@db02dg ~]$ mkdir -p /oracle/admin/DG2ST/adump 
 [oracle@db02dg ~]$ mkdir -p /oracle/oradata/DG2ST/ 
 [oracle@dg02dg ~]$ mkdir -p /oracle/arch
 
 

Agora os passos necessários para iniciar a instância DG2ST em estado nomount. Primeiro, vamos criar o spfile através do arquivo pfile “/oracle/backup/initDG2ST.ora”.

[oracle@dg02dg ~]$ echo $ORACLE_SID


  
D2GST 
 
[oracle@dg02dg ~]$ sqlplus / as sysdba
 
SQL*Plus: Version 12.1.0.1.0 - Production on 25-SEP-2015 14:35:22
 
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
 
SQL> create spfile from pfile='/oracle/backup/initDG2ST.ora';
 
File created.
 
SQL> startup nomount
ORACLE instance started.
 
Total System Global Area  1853947904 bytes
Fixed Size                  2229384 bytes
Variable Size            452987768 bytes
Database Buffers                    1392508928 bytes
Redo Buffers                6221824 bytes
 
 

Com todas as configurações acima realizadas, vamos agora a restauração do banco DG1 para o standby DG2ST. A restauração será feita através do comando duplicate do RMAN, para isso precisamos estar conectados em ambos os bancos de dados (DG1 e DG2ST), isso é feito da seguinte maneira: $ rman target sys/oracle@DG1 auxiliary /

Onde: target -> Representa o nosso banco de dados destino, que no caso é o banco DG1 (database primário). A conexão será feita com o usuário com o usuário sys e senha oracle através do TNSNAME DG1. auxiliary -> Representa o banco na máquina que estamos conectado, que no caso é a instância DG2ST, definido pela variável de ambiente ORACLE_SID. A conexão será feita pelo sistema operacional “/”.


  

Recovery Manager: Release 12.1.0.1.0 - Production on Fri Sep 25 14:59:17 2015
 
Copyright (c) 1982, 2013, Oracle and/or its affiliates.  All rights reserved.
 
connected to target database: DG1 (DBID=1872722065)
connected to auxiliary database: DG2ST (not mounted)
 
RMAN> duplicate target database for standby;
 
Starting Duplicate Db at 25-SEP-15
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=111 device type=DISK
 
contents of Memory Script:
{
   restore clone standby controlfile;
}
executing Memory Script
 
Starting restore at at 25-SEP-15
using channel ORA_AUX_DISK_1
 
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: reading from backup piece /oracle/backup/control_DG1_07o6ou86_1_1.bkp
channel ORA_AUX_DISK_1: piece handle=/oracle/backup/control_DG1_07o6ou86_1_1.bkp tag=TAG20130410T225358
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/oracle/oradata/DG2ST/control01.ctl
output file name=/oracle/oradata/DG2ST/control02.ctl
Finished restore at at 25-SEP-15
 
contents of Memory Script:
{
   sql clone 'alter database mount standby database';
}
executing Memory Script
 
sql statement: alter database mount standby database
 
contents of Memory Script:
{
   set newname for tempfile  1 to 
 "/oracle/oradata/DG2ST /temp01.dbf";
   switch clone tempfile all;
   set newname for datafile  1 to 
 "/oracle/oradata/DG2ST /system01.dbf";
   set newname for datafile  2 to 
 "/oracle/oradata/DG2ST/sysaux01.dbf";
   set newname for datafile  3 to 
 "/oracle/oradata/DG2ST/undotbs01.dbf";
   set newname for datafile  4 to 
 "/oracle/oradata/DG2ST/users01.dbf";
   set newname for datafile  5 to 
 "/oracle/oradata/DG2ST/example01.dbf";
   restore
   clone database
   ;
}
executing Memory Script
 
executing command: SET NEWNAME
 
renamed tempfile 1 to /oracle/oradata/DG2ST/temp01.dbf in control file
 
executing command: SET NEWNAME
 
executing command: SET NEWNAME
 
executing command: SET NEWNAME
 
executing command: SET NEWNAME
 
executing command: SET NEWNAME
 
Starting restore at 25-SEP-15
using channel ORA_AUX_DISK_1
 
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00002 to /oracle/oradata/DG2ST/sysaux01.dbf
channel ORA_AUX_DISK_1: restoring datafile 00003 to /oracle/oradata/DG2ST/undotbs01.dbf
channel ORA_AUX_DISK_1: restoring datafile 00004 to /oracle/oradata/DG2ST/users01.dbf
channel ORA_AUX_DISK_1: reading from backup piece /oracle/backup/DG_1_2_1_02o6ou56_1_1.bkp
channel ORA_AUX_DISK_1: piece handle=/oracle/backup/DG1_2_1_02o6ou56_1_1.bkp tag=TAG20130410T225222
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:25
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to /oracle/oradata/DG2ST/system01.dbf
channel ORA_AUX_DISK_1: restoring datafile 00005 to /oracle/oradata/DG2ST/example01.dbf
channel ORA_AUX_DISK_1: reading from backup piece /oracle/backup/DG1_1_1_01o6ou56_1_1.bkp
channel ORA_AUX_DISK_1: piece handle=/oracle/backup/DG1_1_1_01o6ou56_1_1.bkp tag=TAG20130410T225222
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:55
Finished restore at 25-SEP-15
 
contents of Memory Script:
{
   switch clone datafile all;
}
executing Memory Script
 
datafile 1 switched to datafile copy
input datafile copy RECID=2 STAMP=812419999 file name=/oracle/oradata/DG2ST/system01.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=3 STAMP=812419999 file name=/oracle/oradata/DG2ST/sysaux01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=4 STAMP=812419999 file name=/oracle/oradata/DG2ST/undotbs01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=5 STAMP=812419999 file name=/oracle/oradata/DG2ST/users01.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=6 STAMP=812419999 file name=/oracle/oradata/DG2ST/example01.dbf
Finished Duplicate Db at 25-SEP-15
 
RMAN>
 
 

Restore finalizado com sucesso. Vamos realmente conferir se o banco DG2ST restaurado está no modo STANDBY:


  
SQL> select name, db_unique_name, database_role from v$database; 
 
NAME      DB_UNIQUE_NAME                 DATABASE_ROLE
--------- ------------------------------ ----------------
DG1       DG2ST                          PHYSICAL STANDBY
 
 

Show, nosso banco DG2ST está definido como PHYSICAL STANDBY. Agora com a restauração completa do banco de dados DG2ST, temos agora que informar ao database primário (DG1) para começar a enviar os logs das alterações feitas para o banco DG2ST. Isso é feito conforme o parâmetro log_archive_dest_state_2. Agora, através desse segundo destino de archive habilitado, todas as alterações feitas no DG1 será automaticamente enviada para o banco DG2ST (database standby). Com os logs sendo encaminhado no banco DG2ST, vamos informar ao Oracle Data Guard para que o banco DG2ST comece a trabalhar com esses logs que estão sendo encaminhado do banco DG1. Ao executar os comandos abaixo, estamos solicitando para que o Data Guard inicie os processos background para que automaticamente sejam restaurados os logs.


  
SQL> show parameter instance_name
 
NAME                     TYPE        VALUE
------------------------ ----------- ------------------------------
instance_name            string      stdby
 
SQL> alter database recover managed standby database disconnect;
Database altered.
SQL>
 
 

Agora que fizemos isso, temos o  nosso Data Guard pronto e habilitado.

Agora para finalizar vamos verificar o sincronismo do Data Guard está funcionando. Para isso, temos que checar se o destino de log 1 está na mesma sequência do destino de log 2, ou seja, cada sequência gerada no destino 1 (destino do banco DG1) deverá gerar a mesma sequência no destino 2 (destino do banco DG2ST), garantindo assim que ambas estão sincronizadas. Essa forma de monitorar, funciona apenas para o tipo do Data Guard que estamos criando, o tipo ASYNC. Existe a forma SYNC, que muda a forma de como monitorar também, mais isso fica para um próximo artigo, por enquanto basta saber que o Data Guard ASYNC deve gerar a mesma sequência no destino 1 como no destino 2. Vamos verificar através da view v$archived_log, conforme query abaixo: Deve ser rodado está query no DG1.


  
SQL>  select
  2   thread#,
  3   dest_id,
  4   sequence#,
  5   first_time,
  6   next_time
  7   from v$archived_log
  8   where resetlogs_change# = (select resetlogs_change# from v$database)
  9*  order by thread#, sequence#, dest_id;
 
 THREAD#    DEST_ID  SEQUENCE# FIRST_TIME          NEXT_TIME
-------- ---------- ---------- ------------------- -------------------
       1          1          4 25-09-2015 21:51:01 25-09-2015 22:01:25
       1          1          5 25-09-2015 22:01:25 25-09-2015 22:53:49
       1          2          5 25-09-2015 22:01:25 25-09-2015 22:53:49
       1          1          6 25-09-2015 22:53:49 25-09-2015 23:58:46
       1          2          6 25-09-2015 22:53:49 25-09-2015 23:58:46
       1          1          7 25-09-2015 23:58:46 25-09-2015 00:02:31
       1          2          7 25-09-2015 23:58:46 25-09-2015 00:02:31
       1          1          8 25-09-2015 00:02:31 25-09-2015 00:07:34
       1          2          8 25-09-2015 00:02:31 25-09-2015 00:07:34
       1          1          9 25-09-2015 00:07:34 25-09-2015 00:25:01
       1          2          9 25-09-2015 00:07:34 25-09-2015 00:25:01
       1          1         10 25-09-2015 00:25:01 25-09-2015 00:25:02
       1          2         10 25-09-2015 00:25:01 25-09-2015 00:25:02
       1          1         11 25-09-2015 00:25:02 25-09-2015 00:12:03
       1          2         11 25-09-2015 00:25:02 25-09-2015 00:12:03
       1          1         12 25-09-2015 00:12:03 25-09-2015 00:15:46
       1          2         12 25-09-2015 00:12:03 25-09-2015 00:15:46    
 
 

Observe que a partir da sequência 5, o Oracle está gerando a mesma sequência tanto no destino 1 como no destino 2. Isso se repete até o sequência 12, que é a última sequência gerada para o banco DG1. Para validar a sincronização, podemos forçar a geração de uma nova sequência, execute o comando abaixo.


  
SQL> alter system switch logfile;
 
 

Agora após feito isso, checamos novamente com a consulta acima, para verificar se a sequência 13 foi gerada no destino 1 e destino 2.


  
SQL>  select
  2   thread#,
  3   dest_id,
  4   sequence#,
  5   first_time,
  6   next_time
  7   from v$archived_log
  8   where resetlogs_change# = (select resetlogs_change# from v$database)
  9*  order by thread#, sequence#, dest_id;
 
 THREAD#    DEST_ID  SEQUENCE# FIRST_TIME          NEXT_TIME
-------- ---------- ---------- ------------------- -------------------
       1          1          4 25-09-2015 21:51:01 25-09-2015 22:01:25
       1          1          5 25-09-2015 22:01:25 25-09-2015 22:53:49
       1          2          5 25-09-2015 22:01:25 25-09-2015 22:53:49
       1          1          6 25-09-2015 22:53:49 25-09-2015 23:58:46
       1          2          6 25-09-2015 22:53:49 25-09-2015 23:58:46
       1          1          7 25-09-2015 23:58:46 25-09-2015 00:02:31
       1          2          7 25-09-2015 23:58:46 25-09-2015 00:02:31
       1          1          8 25-09-2015 00:02:31 25-09-2015 00:07:34
       1          2          8 25-09-2015 00:02:31 25-09-2015 00:07:34
       1          1          9 25-09-2015 00:07:34 25-09-2015 00:25:01
       1          2          9 25-09-2015 00:07:34 25-09-2015 00:25:01
       1          1         10 25-09-2015 00:25:01 25-09-2015 00:25:02
       1          2         10 25-09-2015 00:25:01 25-09-2015 00:25:02
       1          1         11 25-09-2015 00:25:02 25-09-2015 00:12:03
       1          2         11 25-09-2015 00:25:02 25-09-2015 00:12:03
       1          1         12 25-09-2015 00:12:03 25-09-2015 00:15:46
       1          2         12 25-09-2015 00:12:03 25-09-2015 00:15:46
       1          1         13 25-09-2015 00:15:46 25-09-2015 00:17:30
       1          2         13 25-09-2015 00:15:46 25-09-2015 00:17:30
 
 
 

Olhe e veja a sequência 13 foi gerada em ambos os destino. Agora repita o comando do switch do redo e veja como ficou a sequência 14:


  
SQL>  select
  2     thread#,
  3     dest_id,
  4     sequence#,
  5     first_time,
  6     next_time
  7  from v$archived_log
  8  where resetlogs_change# = (select resetlogs_change# from v$database)
  9* order by thread#, sequence#, dest_id;
 
THREAD#  DEST_ID SEQUENCE# FIRST_TIME          NEXT_TIME
------- -------- --------- ------------------- -------------------
      1        1         4 25-09-2015 21:51:01 25-09-2015 22:01:25
      1        1         5 25-09-2015 22:01:25 25-09-2015 22:53:49
      1        2         5 25-09-2015 22:01:25 25-09-2015 22:53:49
      1        1         6 25-09-2015 22:53:49 25-09-2015 23:58:46
      1        2         6 25-09-2015 22:53:49 25-09-2015 23:58:46
      1        1         7 25-09-2015 23:58:46 25-09-2015 00:02:31
      1        2         7 25-09-2015 23:58:46 25-09-2015 00:02:31
      1        1         8 25-09-2015 00:02:31 25-09-2015 00:07:34
      1        2         8 25-09-2015 00:02:31 25-09-2015 00:07:34
      1        1         9 25-09-2015 00:07:34 25-09-2015 00:25:01
      1        2         9 25-09-2015 00:07:34 25-09-2015 00:25:01
      1        1        10 25-09-2015 00:25:01 25-09-2015 00:25:02
      1        2        10 25-09-2015 00:25:01 25-09-2015 00:25:02
      1        1        11 25-09-2015 00:25:02 25-09-2015 00:12:03
      1        2        11 25-09-2015 00:25:02 25-09-2015 00:12:03
      1        1        12 25-09-2015 00:12:03 25-09-2015 00:15:46
      1        2        12 25-09-2015 00:12:03 25-09-2015 00:15:46
      1        1        13 25-09-2015 00:15:46 25-09-2015 00:17:30
      1        2        13 25-09-2015 00:15:46 25-09-2015 00:17:30
      1        1        14 25-09-2015 00:17:30 25-09-2015 00:23:50
      1        2        14 25-09-2015 00:17:30 25-09-2015 00:23:50
 
 

Uma outra de analisar e verificar a sincronia do seu Data Guard é através do arquivo de log do seu banco de dados, veja no banco DG1 a seguinte mensagem: LNS: Standby redo logfile selected for thread 1 sequence 14 for destination LOG_ARCHIVE_DEST_2 Isso confirma que o processo LNS do banco DG1, capturou a sequência 14 da tread 1 e enviou para o destino LOG_ARCHIVE_DEST_2.

De um more no alert.log, para verificar a transação


  
Thu Sep 25 00:17:30 2015
Thread 1 advanced to log sequence 14 (LGWR switch)
Current log# 2 seq# 14 mem# 0: /oracle/oradata/DG1/redo02.log
Thu Sep 25 00:17:30 2015
Archived Log entry 20 added for thread 1 sequence 13 ID 0x4f860f89 dest 1:
Thu Sep 25 00:17:30 2015
LNS: Standby redo logfile selected for thread 1 sequence 14 for destination LOG_ARCHIVE_DEST_2
 
 

Com o envio da sequência 14, confirmada pelo alert.log do banco DG1, temos no alert.log do DG2ST que o processo RFS capturou a sequência 14 aplicou com sucesso no banco DG2ST.


  
Thu Sep 25 00:17:58 2015
RFS[4]: Selected log 5 for thread 1 sequence 14 dbid 1334188681 branch 806407947
Thu Sep 25 00:17:58 2015
Archived Log entry 9 added for thread 1 sequence 14 ID 0x4f860f89 dest 1:
Thu Sep 25 00:17:58 2015
Media Recovery Log /oracle/arch/DG1_1_14_806407947.arc
Media Recovery Waiting for thread 1 sequence 15
 
 

Conclusões

Bem amigos vimos a criação de um laboratório para Oracle Data Guard 12c, está é uma das formas de trabalhar com o Data Guard, se vocês quiserem apreender mais recomendo estudar as outras formas de configurar o Data Guard, como por exemplo a SYNC, Snapshot Data Guard e Active Data Guard.

É muito importante também aprender os outros tipos de proteção (Maximum Availability. Maximum Performance e Maximum Protection) entender o que o Redo Transport Services pode ajudar na melhoria do seu Data Guard, assim como aprender a administrar melhor o seu Data Guard.

Até a próxima!

André Luiz Dutra Ontalba é DBA ATG Oracle há 13 anos, especialista em Banco de Dados Oracle e SQL SERVER, com conhecimentos em MySQL. Bacharel em Ciências da Computação pela UNINOVE (Universidade de Nove de Julho), Pós Graduado pela Fiap em Administração de Banco de dados e MBA em Administração de TI pela FGV . Com sólidos conhecimentos em Banco de Dados e Sistemas operacionais, possui certificações OCP 11g e 12c, OCE Linux, OCE RAC, OCE Performance e Tunning, OCS 11g Exadata, OCP – E-Business Suite 12i, LPIC-1 e 2 entre outros. Professor na Faculdade FIAP e DBA/ATG no Grupo Ultra.

Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle.