GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

CRIANDO UM 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”.

instalando apenas o software do oracle

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.

controlfile

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 .

log_archive...

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:

tnsnames

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:

orcl.__db_cache_size=34158411776orcl.__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=viORACLE_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:

oratab

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.

alert.log

É 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:

wainting_archive

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:

alert.log2

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:

Oracle Database 11g Editions

Introduction to Oracle Data Guard

Livro:

Oracle database 10g High Availability with RAC, flashback & Data Guard

Share

You may also like...

1 Response

  1. Jeferson Marques Cunha disse:

    Muito útil, sou DBA Júnior ainda…estou iniciando e foi de grande valia.
    Parabéns e obrigado!!!

Deixe um comentário

O seu endereço de e-mail não será publicado.