Data Guard na versão 10g
Release 2 (10.2) - Parte 01
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".
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;
('/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;
('/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;
('/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
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;
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
$ 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
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
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=0SID_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) )
)
(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=0SID_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.