Data

16 fev, 2007

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

Publicidade

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:

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!