Escolar Documentos
Profissional Documentos
Cultura Documentos
AMBIENTE:
As preparações dos servidores não demandam muito esforço técnico, mas precisam ser feitos e
validados com cuidado.
Para este tutorial, partiremos do suposto que os binários estão instalados em ambos os servidores
e que no primeiro, o banco será um banco de produção já ativo. Também assumiremos como
verdade que o ambiente está será configurado em SO Oracle Linux 6.7.
2.1 - Edite do /etc/hosts
É imprescindível que as máquinas se ‘enxerguem’ via rede. Sendo assim, editaremos o /etc/hosts
informando em ambos tanto seu próprio nome quanto do host que abrigará o segundo banco.
Documente através de comentário na entrada. Abaixo, no exemplo, o que chamamos de fal
server é o servidor remoto. Faça o comentário da mesma forma no ambiente secundário, pois
quando este assumir a role PRIMARY, saberemos quem é seu AUXILIARY.
Ressaltando que se o cliente tiver um DNS confiável, esta etapa pode ser desconsiderada.
2.2 Teste via ping no hostname e via ssh.
A relação de confiança não é um pré-requisito para Data Guard, mas recomendamos que seja
feito para auxiliar em atividades que demandem a troca de arquivos, como por exemplo quando
o AUXILIARY necessitar ser refeito por motivo de failover e tivermos que copiar peças de backup.
3.1 - Gere chave com usuário oracle:
$ ssh-keygen -t rsa -f ~/.ssh/id_rsa
3.2 - Inserir no host secundário
$ cat ~/.ssh/id_rsa.pub | ssh oracle@192.168.0.5 'cat - >> ~/.ssh/authorized_keys'
3.3 - Teste acessando via ssh ou transferindo arquivo ao outro host e confirme se pede senha.
DB_UNIQUE_NAME = DATABASE1
DB_NAME = DATABASE
Esta fuga do cotidiano é proposital, para que o conceito de Data Guard se torne mais claro. Para
ter sucesso na configuração do ambiente, é preciso entender os conceitos de cada um destes
parâmetros e como deve/pode ser tratado no ambiente DG.
INSTANCE_NAME = O nome da instância. Em dataguard, CADA membro PODERÁ ter sua instância
DIFERENTE.
DB_UNIQUE_NAME = Nome único do banco. Em dataguard, CADA membro DEVERÁ ter sua
DB_UNIQUE_NAME DIFERENTE
DB_NAME = Nome Global do banco de dados. Em dataguard, TODOS os membros DEVERÃO o
mesmo DB_NAME.
Sendo assim, adotaremos a seguinte estrutura de ambiente:
MEMBRO: PRIMARY STANDBY
HOSTNAME: vm-lnx-lab04 vm-lnx-lab05
IP: 192.168.168.184 192.168.168.185
INSTANCE_NAME: PROD PROD
DB_UNIQUE_NAME: DATABASE1 DATABASE2
DB_NAME: DATABASE DATABASE
DIRETÓRIO DE DATA FILES /u02/oradata/DATABASE1/ /u02/oradata/DATABASE2/
Tendo definido nossa estrutura, no segundo servidor, crie uma instância e banco já com os
parâmetros descritos na coluna 2. Ele será descartado, mas a recomendação da criação é para
que haja uma validação prévia do ambiente.
6 - PREPARAÇÃO O ORANET
O transporte de informação de forma bilateral do ambiente Data Guard funciona totalmente
suportado pelo ORANET. Um dos segredos tanto da restauração do backup quanto no
funcionamento impecável está na configuração correta e validada do ORANET. Tome por verdade
e lembre: A comunicação deve ser uma mão via dupla, tendo que funcionar tanto PRIMARY ->
AUXILIARY quanto AUXILIARY – PRIMARY.
6.1 CRIAÇÃO DE LISTENER EXPLÍCITO
A criação do listener explícito, futuramente permitirá a configuração e utilização de Data Guard
Broker – Esta é uma excelente ferramenta, que permite além de administrar todo o ambiente
DG, repara-lo e configura-lo, removendo ou adicionando novos membros ou alterando a
característica do mesmo. Entendemos que o ambiente deverá ser preparado para qualquer nova
configuração, evitando indisponibilidades caso futuramente estas opções sejam assumidas pelo
cliente. Da mesma forma, evitaremos questionamentos desnecessários.
https://docs.oracle.com/cd/B28359_01/server.111/b28295/concepts.htm
6.1.1 - Para isso, edite os arquivos $ORACLE_HOME/network/admin/listener.ora em ambos os nós–
caso não existam, crio-os.
Adicione o seguinte bloco, adaptando-o às características do ambiente:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = DATABASE2)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = PROD)
(SID_DESC =
(GLOBAL_DBNAME = DATABASE1)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = PROD)
)
)
Lembre que o SMON (se versão =< 11G) ou LREG (12c) demoram para registrar as instâncias.
Aguarde um pouco ou entre em cada instância e:
SQL> alter system register;
(DESCRIPTION =
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = DATABASE1)
(UR=A)
DATABASE2 =
(DESCRIPTION =
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = DATABASE2)
(UR=A)
7.1 - NO PRIMARY, crie um arquivo para geração de backup utilizando bloco abaixo.
Para isso, edite no bloco do RMAN as seguintes configurações:
CONFIGURE DEVICE TYPE DISK PARALLELISM 3; (Escolher a quantidade de canais)
CONFIGURE COMPRESSION ALGORITHM 'HIGH'; (BASIC, LOW, MEDIUM OU HIGH).
run
{
backup AS COMPRESSED BACKUPSET database include current controlfile tag 'full backup com controlfile';
Caso já haja um backup e não seja possível atualizar este por alguma razão, gerar standby
controlfile através do banco de produção:
SQL> alter database create standby controlfile as '/u03/backup/fisico/controlfile/control01.ctl'
LEMBRE: Se é dataguard, é enterprise, e se é enterprise, pode se usar parallelism e compressão
avançada no backup RMAN
Para isso, deve inserir ou editar no bloco do RMAN:
CONFIGURE DEVICE TYPE DISK PARALLELISM 3; (Escolher a quantidade de canais)
CONFIGURE COMPRESSION ALGORITHM 'HIGH'; (BASIC, LOW, MEDIUM OU HIGH).
7.2 – Transfira o backup para partição semelhante no servidor que abrigará o STANDBY.
8 – CRIAÇÃO DO STANDBY.
Com sucesso da primeira etapa da preparação de ambos os ambientes, partiremos agora para a
criação do dataguard. Assim como a criação de um standby comum, o Data Guard precisa ser
feito através do RMAN ou de qualquer técnica de restauração física, como restore a frio, por
exemplo. No entanto, como este documento tem como objetivo servir de guia adaptado para os
ambientes de produção monitorados pela Polo-iT, abordaremos as duas técnicas mais viáveis,
sendo RMAN HOT BACKUP/RESTORE e RMAN DUPLICATE. Nesta versão do manual, iniciaremos
com o RMAN DUPLICATE
8.1 – Desligue através de shutdown abort o banco STANDBY:
SQL> Shut abort
Nota: Outros parâmetros poderiam ser alterados já aqui, mas por segurança e também como
forma de validação, alteraremos posteriormente via SPFILE.
8.8 – Defina o local de armazenamento dos datafiles no PRIMARY e no STANDBY.
NO PRIMARY:
alter system set log_file_name_convert='/u02/oradata/DATABASE2/','/u02/oradata/DATABASE1/' scope = spfile;
NO STANDBY:
alter system set log_file_name_convert='/u02/oradata/DATABASE1/','/u02/oradata/DATABASE2/' scope = spfile;
Estes parâmetros não são pré-requisitos, mas sua configuração permitirá a restauração sem
preocupação com set new name ára data files e temp files (db_file_name_convert) e para redo logs
(log_file_name_convert). Além disso, na criação de datafiles/redologs futuros, os mesmos já serão
redirecionados para a partição que definirmos. No primeiro parâmetro, estamos ‘dizendo’ ao
banco: “O que for criado em /u02/oradata/DATABASE2/ do meu host remoto, redirecione para
/u02/oradata/DATABASE1/”. Veja abaixo um exemplo onde criamos um datafile no PRIMARY
para a tablespace USERS e observe o comportamento no STANDBY em um ambiente já
configurado e validado.
CRIAÇÃO NO PRODUÇÃO:
LOG DO STANDBY
Este parâmetro aceita diversos diretórios como argumento (vide documentação).
https://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams048.htm#REFRN10038
Este parâmetro é dinâmico. Com esta configuração, não precisamos nos preocupar em criar
manualmente os datafiles no standby quando criados no PRIMARY.
9 – DUPLICAÇÃO DO BANCO
Onde:
Target / é nossa conexão local (PRIMARY).
$ rman AUXILIARY=sys/oracle@DATABASE2 é nossa conexão com o standby.
!ATENÇÃO! – Aqui, recomendo ver o nome do banco – o RMAN retornará em database e auxiliary
o valor de db_name. No exemplo acima, conectamos apenas para exemplo, mas o status na linha
deverá ser not mounted. Caso contrário, estará conectado em um
banco de produção ou possivelmente não deixou o STANDBY no mount.
9.2 – Duplique o banco
DUPLICATE TARGET DATABAE FOR STANDBY DORECOVER;
Nota: Tanto a conexão quanto o comando podem ser postos em um sh. Assim, poderá ser
executado em nohup.
Ainda sobre o DUPLICATE, caso os ambientes sejam fiéis, poderá ser restaurado da seguinte
forma: DUPLICATE TARGET DATABAE FOR STANDBY DORECOVER NOFILENAMECHECK;
O parâmetro NOFILENAMECHECK ignora a conversão ou verificação do path.
9.3 – Valide o log de restore.
10 – PARAMETRIZAÇÃO FINAL
NO PRIMARY:
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u03/archive/database1/
valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=DATABASE1';
NO STANDY:
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u03/archive/database2/
valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=DATABASE2';
NO STANDY:
alter system set fal_client=DATABASE2;
log_archive_dest_state_2='ENABLE';
Se a recomendação de ativação do modo flashback no ambiente foi acatada, ative nesta etapa
no banco STANDBY (caso não esteja).
11.1 - Pare a recuperação automática
SQL> alter database recover managed standby database cancel;
SQL> SELECT I.INSTANCE_NAME, D.NAME, P.VALUE FROM V$INSTANCE I, V$DATABASE D, v$parameter P WHERE
P.name='db_unique_name';
SQL> select switchover_status from v$database; --Esperado banco off para produção e SESSIONS ACTIVE para STANDBY
NO ATUAL PRIMARY:
SQL> alter database commit to switchover to physical standby with session shutdown;
9.1.4 – MONTE O PRIMARY como STANDBY DATABASE e, novamente, check os status de ambos.
NO ATUAL PRIMARY:
NO ATUAL PRIMARY:
EM AMBOS:
SQL> SELECT I.INSTANCE_NAME, D.NAME, P.VALUE FROM V$INSTANCE I, V$DATABASE D, v$parameter P WHERE
P.name=’db_unique_name;
SQL> select switchover_status from v$database; -- RECOVERY NEEDED para produção e SESSIONS ACTIVE para
STANDBY
9.1.4 – Permita a mudança de role do STANDBY para PRIMARY, abra o banco inicie o recover no
antigo PRIMARY
NO STANDBY:
SELECT I.INSTANCE_NAME, D.NAME, P.VALUE FROM V$INSTANCE I, V$DATABASE D, v$parameter P WHERE
P.name='db_unique_name'
NO ANTIGO PRIMAY
SQL> alter database recover managed standby database disconnect from session;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
NO PRIMARY:
9.2 – SWITCHBACK
É comum que um ambiente possa fazer switchover e não consiga executar o switchback
– Estes erros normalmente estão relacionados a configuração do ORANET ou parâmetros
errados. Para evitar que haja um erro fatal em um possível evento de
FAILOVER/FAILBACK, refaça a operação acima, desta vez retornando o servidor original a
ROLE de PRIMARY.
Infelizmente o oracle não oferece uma opção para switchover e switchback no que diz respeito
ao tnsnames.ora, mas apenas para casos de failover e failback. A diferença é que no caso do
failover, o cliente não encontrará o stream referente ao serviço do oracle e por isso o bloco
padrão de tns funciona, mas caso se faça um switchover, haverá erro porque o primeiro
tratamento não é entendido como um timeout. Veja abaixo um bloco funcional de failover:
ORCLT =
(DESCRIPTION_LIST =
(FAILOVER = ON)
(LOAD_BALANCE = OFF)
(DESCRIPTION =
(CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)
(DESCRIPTION =
(CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)
)
No caso acima, a conexão só irá mudar para o host alternativo caso o acesso ao primário esteja completamente
inviável.
Uma solução para resolvermos esse problema é a configuração de um serviço que só será iniciado através de uma
trigger de startup e caso o banco atual seja o primary:
Criação do serviço:
exec dbms_service.create_service('svc_orcl','svc_orcl');
Criação da trigger que irá verificar a role atual e iniciar o serviço (o defer/enable do log_archive_dest é opcional):
v_role varchar(30);
begin
dbms_service.start_service('svc_orcl');
end if;
end;
Entrada para o tnsnames.ora que conectará independentemente do tipo de switch (se failover ou switchover):
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(CONNECT_DATA =
(SERVICE_NAME = svc_orcl)))
Partindo do pressuposto de que o ambiente está pronto e replicando, para se ativar o active dataguard, execute no banco standby:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
O QUE VEM A SEGUIR:
- Controle de archives;