quarta-feira, 19 de outubro de 2016

COMO CRIAR UM ORACLE STANDBY MANUAL NO WINDOWS

Criar um banco de dados para servir de standby é uma tarefa que parece ser simples, mas pode se tornar muito complexa. Me lembro como se fosse hoje, quando criei meu primeiro stadby manual, a complexidade maior foi em querer realizar a atividade com os conceitos não muito formulados  na minha cabeça, muito bem observado pelo excelente DBA Oracle do Dataprev, Daniel Vidal. É preciso entender algumas coisas, preliminarmente: 

1) Quando o banco sobe em nomount, ele só lê o parâmetro init.ora, determinando o tamanho da SGA, criando e iniciando os processos de background;

2) Quando o banco sobe em mount, ele lê o control file, momento em que os endereços dos data files e dos redo log files são lidos;

3) Para o banco conseguir subir em open, e no caso do stand by, em open read only, é preciso que os arquivos referenciados no arquivo de controle sejam encontrados (SNC), pois basta que um não seja para o banco stand by estar fora de sincronia com o banco de produção (primário). Neste caso o banco não abre;

4) Restore (restaurar) é copiar os data files de volta pro seu local de origem;

5) Recover (recuperar) é refazer todas as alterações feitas no arquivo restaurado, desde o momento do backup.

6) O banco standby precisa ter o mesmo nome que o banco primário, pois o banco standby não sabe que é uma replicação, ele entende que é um banco comum, que aplicará archives.




Servidor Primário:

É preciso criar um script de contingência ‘copia_primario_standby.bat’, indicando o caminho da pasta do servidor standby, onde serão salvos os archives, pois o oracle irá buscar esse caminho para fazer o recover. Por exemplo:  ‘C:\oracle11g\oradata\arch\nome_do_banco\archivelog’.



Servidor Standby:

É no Servidor Standby, que deve rodar o script que irá conectar ao Servidor Primário, para verificar a última sequência de archive que foi aplicado em produção para atualizar o banco de standby.


Criação do standby

 Para criar o standby é preciso realizar os seguintes procedimentos:

1) Realizar um backup database no banco primário;

rman target /

RMAN> backup database;;

2) Copiar os arquivos .bkp, no servidor primário, para uma pasta no servidor standby.

3) Restaurar o control file para que ele saiba o caminho dos data files e dos redo log files, lembrando que para isso o banco precisa estar no modo nomount.

RMAN> rman target /

RMAN> startup nomount;

RMAN> restore controlfile from 'D:standby\backup\O1_MF_NCSNF_TAG20161011T182614_CZTQNNV4_.BK';

4) Catalogar a pasta do servidor standby, para que o oracle saiba onde estão os arquivos .bkp:

RMAN> alter database mount;

RMAN> catalog start with 'D:standby\backup\' noprompt;

5) Em seguida, é necessário escolher o caminho onde serão alocadosos data files, foram alocados em D:\standby\datafiles;

   5.1) Após, restaurar os backups, ou seja, copiar para o local original, que iremos definir com o comando set newname; 

   5.2) Seguindo adiante, como mudamos o path ( o local original), precisamos atualizar o control file, para que ele aponte para os data files no local correto, e para isso utilizamos o comando switch; 

    5.3) Para finalizar, executamos a recuperação do banco. Lembrando que tudo isso é para ser feito num bloco run { }.

RMAN> run {

set newname for datafile 1 to 'D:\standby\datafiles\SYSTEM01.DBF';

set newname for datafile 2 to 'D:\standby\datafiles\SYSAUX01.DBF';

set newname for datafile 3 to 'D:\standby\datafiles\UNDOTBS01.DBF';

set newname for datafile 4 to 'D:\standby\datafiles\USERS01.DBF';

set newname for datafile 5 to 'D:\standby\datafiles\TBX_STANDBY_01.DBF';

set newname for datafile 6 to 'D:\standby\datafiles\TBS_DATA_STANDBY_01.DBF';

set newname for datafile 7 to 'D:\standby\datafiles\TBX_STANDBY_02.DBF';

set newname for datafile 8 to 'D:\standby\datafiles\TBS_DATA_STANDBY_02.DBF';

set newname for datafile 9 to 'D:\standby\datafiles\TBS_CEP_DADOS_01.DBF';

set newname for datafile 10 to 'D:\standby\datafiles\TBS_CEP_IDX_01.DBF';

set newname for tempfile  1 to 'D:\standby\datafiles\TEMP01.DBF';

set newname for tempfile  1 to 'D:\standby\datafiles\TEMP02.DBF';

set newname for tempfile  1 to 'D:\standby\datafiles\TEMP03.DBF';

set newname for tempfile  1 to 'D:\standby\datafiles\TEMP04.DBF';

restore database;

switch datafile all;

switch tempfile all;

recover database;

}

6) Para sincronizar a sequência do último archive aplicado pelo banco primário com o banco de standby, é preciso rodar o seguinte comando no sqlplus:

SQL> recover database using backup controlfile until cancel;

Caso esteja desatualizado, basta copiar e colar o caminho do archive, sugerido pelo oracle e pressionar enter. Quando chegar no último archive, digite cancel e precione enter. 



Automatizando a sincronização dos bancos

É preciso criar um script ‘atualiza.bat’, que serve para atualização da ‘sequence dos archives’, ou seja, para que o banco de standby esteja íntegro com o banco primário, estando sempre num ponto de sequência mais próximo do banco primário.

Segue o script ‘atualiza.bat’, no qual me espelhei no meu grande amigo e eterno professor Ricardo Portilho:

set ORACLE_SID=Nome_da_instância_igual_ao_nome_primário

set ORACLE_HOME=C:\oracle11g\product\11.2.0\dbhome_1

set StandbyTNS=standby_SB

set ProdTNS=primario_PR



set Texto=SHUTDOWN IMMEDIATE; STARTUP MOUNT;EXIT

echo.%Texto% > D:\ATUALIZA\BAIXA_SOBE_MOUNT.rman

%ORACLE_HOME%\BIN\rman.exe target / CMDFILE=D:\ATUALIZA\BAIXA_SOBE_MOUNT.rman

del D:\ATUALIZA\BAIXA_SOBE_MOUNT.rman

FOR /F "tokens=*" %%A IN ('%ORACLE_HOME%\BIN\sqlplus.exe -s SYS/senha@%ProdTNS% AS SYSDBA @D:\ATUALIZA\ATUALIZA.sql ^| FIND "KEEP"') DO SET Variable=%%A

set Variable=%Variable: =%

set Variable=%Variable:KEEP=%

echo.%Variable%



set Texto=BACKUP ARCHIVELOG FROM SEQUENCE %Variable% FORMAT 'D:\ATUALIZA\ATUALIZA__Sequence%Variable%__Data%%Y%%M%%D__Set%%s__Piece%%p.BKP';

echo.%Texto% > D:\ATUALIZA\ATUALIZA.rman

%ORACLE_HOME%\BIN\rman.exe target SYS/senha@%ProdTNS% CMDFILE=D:\ATUALIZA\ATUALIZA.rman

del D:\ATUALIZA\ATUALIZA.rman



NET USE X: \\10.10.1.246\D$

COPY X:\ATUALIZA\ATUALIZA__Sequence%Variable%* D:\ATUALIZA\ATUALIZA__SEQUENCE

DEL X:\ATUALIZA\ATUALIZA__Sequence%Variable%*

NET USE X: /DELETE



set Texto=CROSSCHECK BACKUP; DELETE NOPROMPT EXPIRED BACKUP;

echo.%Texto% > D:\ATUALIZA\CROSSCHECK.rman

%ORACLE_HOME%\BIN\rman.exe target SYS/senha@%ProdTNS% CMDFILE=D:\ATUALIZA\CROSSCHECK.rman

del D:\ATUALIZA\CROSSCHECK.rman



set Texto=CATALOG START WITH 'D:\ATUALIZA\ATUALIZA__SEQUENCE' NOPROMPT;

echo.%Texto% > D:\ATUALIZA\CATALOG.rman

%ORACLE_HOME%\BIN\rman.exe target / CMDFILE=D:\ATUALIZA\CATALOG.rman

del D:\ATUALIZA\CATALOG.rman



set Texto=RECOVER DATABASE;

echo.%Texto% > D:\ATUALIZA\RECOVER.rman

%ORACLE_HOME%\BIN\rman.exe target / CMDFILE=D:\ATUALIZA\RECOVER.rman

del D:\ATUALIZA\RECOVER.rman



set Texto=DELETE NOPROMPT BACKUP; DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-1';

echo.%Texto% > D:\ATUALIZA\DELETE.rman

%ORACLE_HOME%\BIN\rman.exe target / CMDFILE=D:\ATUALIZA\DELETE.rman

del D:\ATUALIZA\DELETE.rman



set Texto=SQL 'ALTER DATABASE OPEN READ ONLY';

echo.%Texto% > D:\ATUALIZA\READ_ONLY.rman

%ORACLE_HOME%\BIN\rman.exe target / CMDFILE=D:\ATUALIZA\READ_ONLY.rman

del D:\ATUALIZA\READ_ONLY.rman



Vale ressaltar que o script ‘atualiza.bat’, baixa o banco stand by e sobe em mount, antes de fazer a sincronização do banco de stand by com o banco de produção. E, após a sincronização, o script altera o estado do banco de modo manutenção (mount) para aberto, mas na condição de estar em modo de leitura (open read only), ou seja, só poderá ser realizado consultas (selects), e não insert, update e delete.

No meu caso, o scheduler do windows foi agendado para realizar diariamente, e de hora em hora (hh:30min), a atualização do standby, via script ‘atualiza.bat’. 


Grande abraço!


Salomão Netto

DBA MongoDB, Oracle and SQL ServerRemote or Physical Consulting

Contacts:
Whatsapp:+5521980000311
Skype: sal.netto
Linkedin: www.linkedin.com/in/salomao-oliveira

Nenhum comentário:

Postar um comentário