segunda-feira, 5 de dezembro de 2011

Oracle Standby Database 2/2


Na segunda parte do artigo sobre Oracle Standby, descreverei os procedimentos para o gerenciamento do banco de dados.

Seguem abaixo os passos necessários para o gerenciamento de um “Standby Database”.


PARA A VERIFICAÇÃO DO STANDBY

1.   Conectar-se na base de dados primário (origem) para gerar novos “archives”.
Executar:  alter system archive log current;
alter system switch logfile;
   archive log list;

2.   Para verificar a atualização do “standby”

Executar: select sequence#, first_time, next_time
                        from v$archived_log order by sequence#;

3.   Para verificar os processos e status do “standby”

Executar: select process, status from v$managed_standby; 

4.   Para a verificação automática executar foi criado um script shell [verify_sync_stb.sh], fonte disponível no final do artigo.

5.   Para a remoção dos  “archives logs” já aplicados foi criado um script shell [clear_archives.sh], fonte disponível no final do artigo.


PARA A ATIVAÇÃO DO STANDBY EM MODO READ-ONLY

1.   Verificar se o banco de dados “standby” está no ar.
Caso esteja deve-se baixá-lo utilizando o comando abaixo:
Executar: shutdown immediate;

2.   Na seqüência, levantar o banco de dados “standby”
Executar:  startup nomount;
alter database mount standby database;
alter database open read only;

3.   Para verificar o status do “standby” executar a consulta abaixo:
Executar: select name,created,log_mode,database_role from v$database;



PARA A ATIVAÇÃO DO STANDBY EM MODO READ-WRITE

1.   Verificar as atualizações do banco de dados e ver se todos os “archives” pendentes foram aplicados.
Executar: select thread#, sequence#, first_change#, next_change# from v$log_history;

2.   Na sequência baixar o “standby” utilizando o comando abaixo:
Executar: shutdown immediate;

3.   Levantar o banco de dados “standby” usando os comandos abaixo:
Executar:  startup nomount;
alter database mount standby database;
recover standby database until cancel;
alter database activate standby database;
shutdown immediate;


4.   Levantar o “standby” :
Executar : startup;

Atenção:  A partir desse momento o banco de dados deixará de ser STANDBY e torna-se o banco de dados PRIMÁRIO.

5.   Realizar a validação do status do banco de dados
Executar: select name,created,log_mode,database_role from v$database;

6.   Levantar o serviço de listener.
Executar: lsnrctl start

Deve-re realizar um re-apontamento do arquivo TNSNAMES.ora na rede para que as aplicações possam conectar-se ao novo banco de dados primário.




Script - verify_sync_stb.sh

Script que realiza a verificação do sincronismo do standby, ao término, é enviado – via e-mail, um log contendo o tempo de início e fim do processo e também os processos de “recover” no “standby”.

Abaixo segue o código fonte:


. $HOME/.profile

export ORACLE_SID=basestd
export ORACLE_HOME=/u01/app/oracle/ora11g

ARQLOG=/home/oracle/verify_arch_updt.log

sqlplus sys/@base    as sysdba @$HOME/checksync.sql
sqlplus sys/@basestd as sysdba @$HOME/getsync.sql

cat $HOME/sync.txt > $ARQLOG

# Envia email informando status da execucao
#
MAIL_SUB="VERIFICACAO DO SINCRONISMO DO STANDBY: BASESTD"
MAIL_FILE=/home/oracle/logs/verf_mail.txt
mailx -r << seu_e-mail@empresa.com >> -s "$MAIL_SUB" << seu_e-mail@empresa.com >>  < $ARQLOG
#
# Renomeia arquivo de log
#

cd $HOME
mv sync.txt  $HOME/logs/sync_stb.`date +%d%m%H%M`


-- Conteúdo do script checksync.sql

prompt set echo off feedback off verify off trimspool on pagesize 0 linesize 255
prompt spool $HOME/sync.txt
prompt
select 'select ''   Standby Database Seq# '||sequence#||' First Time: '||to_char(first_time,'dd/mm/yyyy hh24:mi:ss')||'''||CHR(10)||'||chr(10)||
       '       ''Production Database Seq# ''||sequence#||'' First Time: ''||to_char(first_time,''dd/mm/yyyy hh24:mi:ss'')||CHR(10)||CHR(10)||'||chr(10)||
       '       ''Diferenca de Sincronizacao (minutos): ''||round((first_time-to_date('''||to_char(first_time,'yyyymmddhh24miss')||''',''yyyymmddhh24miss''))*2
4*60)'||chr(10)||
       '  from v$log_history'||chr(10)||
       ' where sequence#=(select max(sequence#) from v$log_history)'||chr(10)||
       '/'
  from v$log_history
 where sequence# = (select max(sequence#) from v$log_history)
/

select 'set lines 200 pages 200' from dual;

select 'select process, status from v$managed_standby;' from dual;

prompt exit
spool off
exit



Script - clear_archives.sh

Script que realiza a remoção de “archives” já aplicados no banco “standby”.

Abaixo segue o código fonte:


. $HOME/.profile

export ORACLE_SID=basestd
export ORACLE_BASE=/u01/app
export ORACLE_HOME=/u01/app/oracle/ora11g

#----------------------------------------------------------
#Verifica archives a eliminar
#----------------------------------------------------------
/u01/app/oracle/ora11g/bin/sqlplus "sys/@basestd as sysdba"   @/u01/app/oracle/ora11g/bin/clear_archives.sql

-- Conteúdo do script clear_archives.sql

set head off
set pagesize 0
set feedback off
set linesize 200
set trimspool on
set echo off
spool /u01/app/oracle/ora11g/bin/clear_lista_archives.sql
select '!rm '||name from v$archived_log
where trunc(completion_time) < trunc(sysdate-1)
and   APPLIED = 'YES' and name <> 'BASESTD'
/

select 'exit;' from dual
/
spool off
@/u01/app/oracle/ora11g/bin/clear_lista_archives.sql
exit

  
Com os procedimentos acima descritos, já é possível gerenciar seu banco de dados “standby”.

Os scripts de automação, poderão ser colocado na “crontab” do usuário “oracle” para execução automatica, permitindo um controle mais efetivo do gerenciamento.



Rubens Oliveira
DBA Oracle Consultor
olivert.dba@consultant.com