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 as mí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:
- Oracle Linux: Realizar o download das mídias do Oracle Linux 6 Update 5 – 64 Bits.
- VirtualBox: Realizar da última versão estável.
- Oracle Database 12c Release 1 (12.1.0.1.0): Realizar da última versão do Oracle 12c para Linux – X86_64.
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 redes que ser utilizado 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ásico.
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 Database – 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 db01dg192.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.
[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;
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 no momento 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 DG1l) 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.
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.
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:
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é
BLOG DBADUTRA