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!
Whatsapp:+5521980000311
Skype: sal.netto
Linkedin: www.linkedin.com/in/salomao-oliveira
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