Data Guard na versão 10g Release 2 (10.2) - Parte 01

Renato Osterne (e-mail) é formado em Técnico em Processamento de dados pelo
COtemig a nível médio, formado em Administração de Sistamas de Informação pela
UNA-CCG e
especializado em banco de dados Oracle com certificações OCP 9i e 10g.
Trabalha com informática há 8 anos e sendo 3 deles como DBA. Hoje atua na Synos technologies,parceiro Oracle, em um projeto do jornal O Estado de Minas.

Esse artigo descreverá como configurar o Data Guard na versão 10g Release 2 (10.2).

O Data Guard é uma feature do Oracle, utilizado muito como plano de contingência de
banco. Sua nomenclatura é constituída por um banco primário e um ou mais bancos
secundários.

O banco secundário pode ser físico ou lógico. A diferença entre os dois é de conceito.

O banco secundário físico é mais utilizado quando se deseja manter uma cópia integra do
banco primário, pois ele é utilizado apenas em READ-ONLY ou com o banco no estado
montado.

Já o banco secundário lógico é muito utilizado pra replicação de dados com o intuito de atualização automática de uma base que deve se manter idêntica a produção, podemos
citar com exemplo uma base de treinamento.

Há várias maneiras de configuração do Data Guard, utilizaremos um tipo de
configuração baseado em "Role Transition" e "Primary Role".

Figura 1.0- Primário e Físico Standby Database com regras de transação:

image001.jpg
Conforme a Figura 1.0 iremos configurar tanto o banco primário como o
secundário (Banco físico), sendo que no nosso exemplo os banco terão
os seguintes nomes:

Primário: Ao invés de Boston será Primary

Secundário: Ao invés de Chicago será Standy

Passo a Passo - Criando Physical Standby

1º ) No Primary Database ative a feature "FORCE LOGGING":

ALTER DATABASE FORCE LOGGING;

Isso fará que todas as alterações gerem logs.

2º) Crie os Standby logs para que mais tarde possamos utilizar a feature Real Time,
que nada mais é que as alterações serão aplicadas em tempo real no banco secundário:

ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/home/oracle/primary/oradata/log1c.rdo','/home/oracle/primary/oradata/log2c.rdo') SIZE 10M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/home/oracle/primary/oradata/log1d.rdo','/home/oracle/primary/oradata/log2d.rdo') SIZE 10M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/home/oracle/primary/oradata/log1f.rdo','/home/oracle/primary/oradata/log2f.rdo') SIZE 10M;

3º) Nesse ponto, após a criação dos Standby logs, altere o arquivo de parâmetro
do banco primário da seguinte forma:

DB_NAME=primary| DB_UNIQUE_NAME=primary| LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary, standy)'| LOG_ARCHIVE_DEST_1=| 'LOCATION=/home/oracle/primary/arch1/| VALID_FOR=(ALL_LOGFILES,ALL_ROLES)| DB_UNIQUE_NAME=primary'| LOG_ARCHIVE_DEST_2=| 'SERVICE=standy LGWR ASYNC| VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)| DB_UNIQUE_NAME=standy'| LOG_ARCHIVE_DEST_STATE_1=ENABLE| LOG_ARCHIVE_DEST_STATE_2=ENABLE| REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE| LOG_ARCHIVE_FORMAT=%t_%s_%r.arc| LOG_ARCHIVE_MAX_PROCESSES=30| FAL_SERVER=standy| FAL_CLIENT=primary| DB_FILE_NAME_CONVERT='/home/oracle/standy/oradata','/home/oracle/primary/oradata'| LOG_FILE_NAME_CONVERT=| '/home/oracle/standy/oradata','/home/oracle/primary/oradata'| STANDBY_FILE_MANAGEMENT=AUTO

OBS: Note que os parâmetros DB_FILE_NAME_CONVERT e LOG_FILE_NAME_CONVERT
servem para que o banco automaticamente altere a caminho dos datafiles e redos no
controlfile quando alterado para modo Standby, diferentemente da versão 9i, que era
necessário modifica-lo manualmente com o comando "ALTER DATABASE RENAME FILE".

4º) Ative o arquivamento no banco Primary:

SQL> SHUTDOWN IMMEDIATE;| SQL> STARTUP MOUNT;| SQL> ALTER DATABASE ARCHIVELOG;| SQL> ALTER DATABASE OPEN;

5º) Faça um backup frio do banco primário:

SQL> SHUTDOWN IMMEDIATE; $ cp -r /home/oracle/primary/oradata/*.* /home/oracle/standy/oradata

6º) Inicie o banco primário no modo MOUNT pra criar o standby controlfile:

SQL> STARTUP MOUNT; SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS
'/home/oracle/standy/oradata/logical_standy.ctl'; SQL> ALTER DATABASE OPEN; [codigo]$ cp -r logical_standy.ctl standy1.ctl| $ cp -r logical_standy.ctl standy2.ctl

7º) Crie o arquivo de parâmetro pra o banco Standy conforme o Primary:

CREATE PFILE='?/dbs/intistandy.ora' from spfile;

8º) Altere o arquivo de parâmetro do banco Standy:

DB_NAME=primary| DB_UNIQUE_NAME=standy| LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary, standy)'| DB_FILE_NAME_CONVERT='/home/oracle/primary/oradata','/home/oracle/standy/oradata'| LOG_FILE_NAME_CONVERT=| '/home/oracle/primary/oradata','/home/oracle/standy/oradata'| LOG_ARCHIVE_FORMAT=log%t_%s_%r.arc| LOG_ARCHIVE_DEST_1=| 'LOCATION=/home/oracle/standy/arc/| VALID_FOR=(ALL_LOGFILES,ALL_ROLES)| DB_UNIQUE_NAME=standy'| LOG_ARCHIVE_DEST_2=| 'SERVICE=primary LGWR ASYNC| VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)| DB_UNIQUE_NAME=primary'| LOG_ARCHIVE_DEST_STATE_1=ENABLE| LOG_ARCHIVE_DEST_STATE_2=ENABLE| REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE| STANDBY_FILE_MANAGEMENT=AUTO| FAL_SERVER=primary| FAL_CLIENT=standy

OBS: Atente que o DB_UNIQUE_NAME é Standy, esse parâmetro que diferencia os dois
bancos no modo Físico.

9º) Configure o tnsnames e os listeners. Nesse caso foi colocado um listener pra
cada banco, um na porta 1521 e o outro na 1522.

Listener

LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)) ) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.4) (PORT = 1521)) ) ) ) standy = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.4)(PORT = 1522)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = standy) ) ) INBOUND_CONNECT_TIMEOUT_listener=0 SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = primary) (ORACLE_HOME = /home/oracle/10gR2) (SID_NAME = primary) ) ) SID_LIST_STANDY = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = standy) (ORACLE_HOME = /home/oracle/10gR2) (SID_NAME = standy) Tnsnames # tnsnames.ora Network Configuration File: /home/oracle/10gR2/network/admin/tnsnames.ora # Generated by Oracle configuration tools. primary = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.4)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = primary) (SERVER = DEDICATED) ) ) standy = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.4)(PORT = 1522)) ) (CONNECT_DATA = (SERVICE_NAME = standy) (SERVER = DEDICATED) ) )

10º) Inicie os listeners:

$ lsnrctl start| $ lsnrctl start standy

11º) Inicíe o banco standy:

SQL> STARTUP MOUNT;

12º) Nesse momento, colocaremos o banco secundário pra receber os archive logs
do banco primário. Para isso Inicie o Redo Apply da seguinte forma no banco secundário:

Alter Database Recover Managed Standby Database Disconnect From Session;

Para testar se está funcionado, entre no banco primário e crie uma tabela.

Ex:

Create table t1 as select * from dba_users; Alter system switch logfile;

Veja se o banco Standy está recendo os archive logs:

SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME 2> FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#; SEQUENCE# FIRST_TIME NEXT_TIME 8 11-JUL-02 17:50:45 11-JUL-02 17:50:53 9 11-JUL-02 17:50:53 11-JUL-02 17:50:58 10 11-JUL-02 17:50:58 11-JUL-02 17:51:03 11 11-JUL-02 17:51:03 11-JUL-02 18:34:11

E verifique se estão sendo aplicados:

SQL> SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG 2 ORDER BY SEQUENCE#; SEQUENCE# APP 8 YES 9 YES 10 YES 11 YES

Caso estejam, a replicação esta funcionando.

Espero ter ajudado. Na próxima matéria iremos configurar o Data Guard no modo lógico.

Abraço!