Pular para o conteúdo

CRIANDO STANDBY DATABASE

BANCO DE DADOS STANDBY

Dia desses tivemos que migrar um banco de dados de 9i para 10g, com o tamanho aproximado de 4 TB, sob um ambiente IBM AIX 5.1.

Apesar de um pouco conturbada, a migração para 10g foi realizada com sucesso; isto até que seria um tópico interessante para um post, mas hoje eu preferi abordar outro assunto: A criação de um standby para este banco de dados.

Este é um recurso do Oracle database conhecido como Oracle Data Guard; Neste caso, foi criado um banco standby físico.

Motivos para criar um banco standby não faltam. Proteção contra erros lógicos (comparado a um standby database lógico), failover rápido, possível switch over em casos de necessidade de manutenção no servidor primário, possíbilidade de abrir o banco standby em ready-only para a geração de relatórios, entre outras coisas.

Como pré-requisitos, o banco primário deve estar em archivelog – uma vez que as alterações serão replicadas através da aplicação dos relo logs arquivados; o banco primário também deverá usar arquivo de senhas.

Que tal conhecer como funcionou a criação deste standby?

INICIANDO A CRIAÇÃO

Inicialmente, para criar o banco de dados standby, deve ser instalado o software do Oracle. Utilizamos a interface gráfica do instalador, escolhendo a opção “Install database Software only”.

Para facilitar em caso de failover, foi criada a mesma estrutura de diretório dos arquivos do banco primário no novo servidor. Isto também ajudou na cópia dos datafiles (uma vez que optamos por copiar um a um via Begin backup).

Por que Begin backup?

Neste caso, uma série de fatores nos levou à opção de copiar os datafiles um a um, mas os principais foram o tamanho do banco e sua criticidade, o que não permitiu uma parada do ambiente para uma cópia a frio.

Copiando os datafiles

Antes de inciar a cópia, é interessante anotar o número do último archive gerado (Este será o primeiro archive a ser copiado no standby)

select max(sequence#)  
from v$log_history;

Após anotar o n. do archive, foi iniciada a cópia dos mais de 600 datafiles do banco.

Mas, não pense que fiquei olhando a cópia de datafile por datafile… foi feito um script que colocava cada tablespace em Begin backup, copiava os datafiles com scp, e colocava novamente a tablespace em end backup. Veja um pedaço do script:

alter tablespace users begin backup; 
ho scp -r -C   \oracle\oradata\orcl\tblusers01.dbf 192.168.1.10:\oracle\oradata\orcl\ 
ho scp -r -C   \oracle\oradata\orcl\tblusers02.dbf 192.168.1.10:\oracle\oradata\orcl\ 
alter tablespace users   end backup;

Lembrando que, para não ficar tendo que inserir senha toda hora, é possível criar uma chave pública entre os dois servidores, como expliquei em um dos meus posts (ver post).

Para saber quais são os datafiles do banco de dados, consulte a view dba_data_files:

select file_name 
from   dba_data_files order by tablespace_name;

Durante a cópia, o alert.log deve ser acompanhado, verificando se as tablespaces estão ficando em Begin backup / end backup corretamente.

Para ver as alterações do alert em tempo real, utilize o comando tail -f. Veja um exemplo de comando:

tail -f alert_ORCL.log

Também dá para acompanhar as alterações das tablespaces através da seguinte consulta:

select df.tablespace_name, df.file_id 
from   dba_data_files   df,  
          v$backup b 
where df.file_id =   b.file# 
and b.status =   'ACTIVE';

Também copiei os tempfiles e os redos log files, os quais foram localizados através das consultas abaixo:

select file_name 
from   dba_temp_files; 

select member 
from   v$log_member;

Standby Controlfile

Ao final da cópia dos arquivos, criei no banco primário um controlfile especial: o standby controlfile.

alter database create standby controlfile as '/home/oracle/migracao10g/orclstd.ctl'

Este controlfile foi copiado para o servidor secundário, com o cuidado de criar duas cópias e renomeá-las.

Copiando os archives

Neste ponto, foi a hora de copiar todos os archives gerados para o destino. Estes archives são importantes para o recover dos datafiles copiados em Begin backup, e para abrir o banco em read only.

Parâmetros da instância

Para um banco reconhecer o outro, haver a replicação dos archives e ativar os processos de background necessários, é necessário adicionar alguns parâmetros.

No banco de produção, foram ativados o log_archive_dest_2, log_archive_dest_state_2, standby_file_management, fal_server e fal_client . Todos estes parâmetros podem ser ativados com ALTER SYSTEM .

Uma observação importante é o valor do parâmetro log_archive_dest_2: ele deve estar de acordo com o alias utilizado para o banco standby no tnsnames do servidor, como no exemplo abaixo:

Também devem ser ajustados tais parâmetros no standby. Porém, eu fiz diferente: Primeiro, criei um pfile a partir do spfile da produção, e editei este arquivo. Depois, copiei o mesmo para o servidor standby.

Para criar um pfile:

create pfile='/home/oracle/migracao10g/initorcl.ora' from spfile;

Veja um exemplo de pfile para um banco standby:

rcl.__db_cache_size=34158411776
orcl.__java_pool_size=83886080 
orcl.__large_pool_size=33554432 
orcl.__shared_pool_size=3238002688 
orcl.__streams_pool_size=50331648 
aq_tm_processes=1 
archive_lag_target=60 
background_dump_dest='/oracle/admin/orcl/10g/bdump' 
compatible='10.2.0.4.0' 
control_file_record_keep_time=7 
control_files='/oracle/syst/u01/oradata/orcl/control01.ctl',                
'/oracle/syst/u01/oradata/orcl/control02.ctl',                
'/oracle/syst/u01/oradata/orcl/control03.ctl' 
core_dump_dest='/oracle/admin/orcl/10g/cdump' 
cursor_sharing='EXACT' 
db_block_size=8192 
db_cache_size=0 
db_domain='' 
db_file_multiblock_read_count=16 
db_files=2048 db_name='orcl' 
db_writer_processes=5 
dispatchers='(PROTOCOL=TCP)   (SERVICE=orclXDB)' 
dml_locks=3892 
fal_client='ORCLSTD' 
fal_server='ORCL' 
fast_start_mttr_target=300 
filesystemio_options='asynch' 
hash_area_size=1048576 
instance_name='orcl' 
java_pool_size=0 
job_queue_processes=18 
large_pool_size=0 
log_archive_dest_1='LOCATION=/oracle/arch/u01/orcl/archive/' 
log_archive_format='orcl_%t_%s_%r.arc' 
log_archive_max_processes=1 
log_buffer=10048576 
log_file_name_convert='/oracle/redo/u01/oradata/orcl/',                        
'/oracle/redo/u01/oradata/orcl/',                       
'/oracle/redo/u01/oradata/orcl/',                        
'/oracle/redo/u01/oradata/orcl/',  
open_cursors=2000 
optimizer_dynamic_sampling=2 
optimizer_features_enable='10.2.0.4' 
optimizer_index_caching=25 
optimizer_index_cost_adj=10 
pga_aggregate_target=7G 
processes=1200 
query_rewrite_enabled='TRUE' 
recovery_parallelism=16 
recyclebin='OFF' 
remote_login_passwordfile='EXCLUSIVE' 
service_names='ORCL' 
session_cached_cursors=200 
session_max_open_files=20 
sessions=1200 
sga_max_size=35G 
sga_target=35G 
shared_pool_reserved_size=124151398 
shared_pool_size=0 
skip_unusable_indexes=TRUE 
sort_area_size=1048576 
standby_archive_dest='/oracle/arch/u01/orcl/archive/' 
standby_file_management='MANUAL' 
star_transformation_enabled='FALSE' 
streams_pool_size=50331648 
transactions=973 
undo_management='AUTO' 
undo_retention=5400 
undo_tablespace='UNDOTBS2' 
user_dump_dest='/oracle/admin/orcl/10g/udump'

Arquivo de senhas

Outro item importantíssimo é a cópia (ou criação) do arquivo de senhas. Geralmente, ele está no diretório $ORACLE_HOME/dbs, e tem o nome orapw<nome_instancia> (por exemplo, orapworcl). Lembrando que a senha do sys no banco standby deve ser a mesma do banco primário.

Para criar um arquivo de senhas:

orapwd file=<caminho/arquivo>  password=<senha do sys> entries=10

exemplo:

orapwd file=/oracle/10g/dbs/orapworcl  password=change_on_install entries=10

Importante: o parâmetro remote_login_passwordfile deve ter valor exclusive ou shared.

Configurando as variáveis de ambiente

Para ajustar as variáveis de ambiente e outras configurações do usuário Oracle, ajustei o arquivo .profile (geralmente fica dentro do diretório /home do usuário).

Exemplo de arquivo .profile

EDITOR=vi
ORACLE_BASE=/oracle 
ORACLE_HOME=$ORACLE_BASE/10g 
ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data 
ORACLE_SID=orcl 
LIBPATH=$ORACLE_HOME/lib:/usr/lib 
PATH=$PATH:$ORACLE_HOME/bin:/usr/bin:/etc:/usr/bin/X11:/usr/local/bin export 
PATH ORACLE_BASE ORACLE_HOME PATH ORA_NLS33 ORACLE_SID LIBPATH EDITOR

Também foi ajustado o arquivo /etc/oratab, como no exemplo abaixo:

Subindo o banco de dados

Com todos estes procedimentos, foi possível subir a instância, utilizando o pfile criado:

sqlplus "/as sysdba" 
startup nomount pfile=/home/oracle/migracao10g/initorcl.ora

É importante acompanhar, em sessão paralela, o alert.log do banco: caso haja algum erro, através dele é possível ver detalhes do problema, e eventuais arquivos de trace gerados.

Com a instância no ar, foi criado um spfile, e ela restartada em mount.

Veja exemplo de comandos:

create spfile from pfile='/home/oracle/migracao10g/initorcl.ora'; 
shutdown immediate startup mount

Redo Aply

Para iniciar a recuperação do banco, através da aplicação dos archives no banco de dados, utilizamos o comando abaixo:

RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

Este comando inicia o processo de background MRP (Managed Standby Recovery) em background, e é possível verificar no alert.log do banco o processo.

É interessante notar não ser preciso subir o standby com o comando “mount standby”: O Oracle 10g verifica o tipo do controlfile ao montar o banco; se o controlfile for de standby, automaticamente o banco é montado como standby.

Todos os archives copiados via SCP foram recuperados no banco. Após esta recuperação, ele começará automaticamente a recuperar os archives copiados via RFS do servidor primário; quando não há mais archives novos, a seguinte mensagem é exibida:

Ou seja, o banco está esperando o próximo archive, vindo da produção, para aplicar no standby.

Neste momento, é possível abrir o banco para consultas (read only)

Comandos:

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; 
ALTER DATABASE OPEN READ ONLY;

Veja como fica o alert:

Verificando se os bancos estão sincronizados

Para verificar se os bancos primário e secundário estão sincronizados, verifique se o último archive gerado na produção foi o último replicado no secundário, através do alert.log de ambos.

Outra forma é consultando a view v$log_history nos dois bancos:

select max(sequence#) from v$log_history;
 
...

Bem, depois de tanto tempo sem postar nada, espero que seja útil!

Até mais,

Lílian

Para saber mais:

Na internet:

Livro:

Quão útil foi este post ?

Clique em uma estrela para classificar o post

nota média 4.8 / 5. Contagem de votos: 20

Sem votos ! Seja o primeiro a classificar !

1 comentário em “CRIANDO STANDBY DATABASE”

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress