Duplicate a partir de um active DataGuard – 11.2.0.4

Recentemente, ao realizar uma atividade de duplicate de uma base de produção para teste, encontrei algumas dificuldades, uma vez que neste ambiente seria inviável a utilização do backup (devido ao tempo de restore) e a utilização do ambiente de produção como target uma vez que a janela para o processo seria bastante restrita devido ao impacto na performance do ambiente.

Diante deste cenário, surgiu a ideia de utilizar o ambiente de Active Data Guard como target, evitando assim problemas de performance no ambiente de produção e também podendo aumentar minha janela para realização do processo de duplicate.

O ambiente citado é composto por um ambiente de produção, um standby (Active Data Guard) e uma base de teste, ambos na versão 11.2.0.4. Este processo de duplicate possuí alguns bugs que podem não permitir a  sua execução em versões inferiores a 11.2.0.4, conforme o doc 11715084.8, sendo necessário em alguns casos aplicar patch set.

O processo realizado para atender esta necessidade é relativamente simples, e consiste na criação de um Data Guard Cascading Standby Database e posterior ativação do mesmo. Um Data Guard Cascading Standby nada mais é do que um um banco de dados standby que recebe os logs (redo ou archive) de outro standby e não do servidor primário.

A imagem abaixo representa de forma simples a estrutura básica de um Cascading Standby.


Agora, vamos simular o processo de duplicate usando como origem o ambiente de Standby. Para este processo estamos partindo do princípio de que, já temos um ambiente Oracle de produção (primário) com um Standby (Active Data Guard) previamente configurado e sincronizado, além da existência base de teste que vai receber a carga. Por isso, não será abordado neste artigo a criação dos mesmos.

O ambiente será composto por:

Base primária:
hostname: oraprimary
db_unique_name: primary

Base Data Guard:
hostname: dataguard
db_unique_name: primary_stb

Base de teste
hostname:cce
db_unique_name: teste

Antes de efetivamente iniciar o processo de duplicate, será necessário realizar o ajuste dos parâmetros abaixo:

oraprimary
- alter system set log_archive_config='DG_CONFIG=(primary,primary_stb,teste)' scope=both;
O parâmetro log_archive_config será composto da seguinte maneira: <'DG_CONFIG=(<db_unique_name base primaria>,<db_unique_name base data guard>,<db_unique_name base teste>)'

dataguard
- alter system set log_archive_config='DG_CONFIG=(primary,primary_stb,teste)' scope=both;
-alter system set log_archive_dest_3='service=teste async VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=teste' scope=both;
- service=<conexão com a base de teste>
- db_unique_name=<db_unique_name base teste>
- alter system set log_archive_dest_state_3='DEFER';

teste
- alter system set log_archive_config='DG_CONFIG=(primary,primary_stb,teste)' scope=both;
- alter system set fal_server='primary_stb';
- alter system set standby_file_management=AUTO;

Após realizar o processo de parametrização, podemos realizar um restore usando como origem (target) a base standby primary_stb e como destino (auxiliary) a nossa base de teste.
[oracle@cce teste]$ rman target=sys/pwdlamim@primary_stb auxiliary=sys/pwdlamim@teste
Recovery Manager: Release 11.2.0.4.0 - Production on Thu Oct 9 20:00:47 2014
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
connected to target database: PRIMARY (DBID=1681226768)
connected to auxiliary database: PRIMARY (not mounted)
RMAN>
run {
allocate channel prmy1 type disk;
allocate channel prmy2 type disk;
allocate channel prmy3 type disk;
allocate channel prmy4 type disk;
allocate auxiliary channel stby type disk;
DUPLICATE DATABASE
FOR STANDBY
FROM ACTIVE DATABASE
DORECOVER;
}
using target database control file instead of recovery catalog
allocated channel: prmy1
channel prmy1: SID=43 device type=DISK
allocated channel: prmy2
channel prmy2: SID=46 device type=DISK
allocated channel: prmy3
channel prmy3: SID=47 device type=DISK
allocated channel: prmy4
channel prmy4: SID=40 device type=DISK
allocated channel: stby
channel stby: SID=19 device type=DISK
Starting Duplicate Db at 09-OCT-2014
contents of Memory Script:
{
backup as copy reuse
targetfile '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwprimary' auxiliary format
'/oraprd01/oracle/app/product/11.2.0/dbhome_1/dbs/orapwteste' ;
}
executing Memory Script
Starting backup at 09-OCT-2014
Finished backup at 09-OCT-2014
contents of Memory Script:
{
backup as copy current controlfile for standby auxiliary format '/oraprd04/oradata/teste/control01.ctl';
restore clone controlfile to '/oraprd04/oradata/teste/control02.ctl' from
'/oraprd04/oradata/teste/control01.ctl';
}
executing Memory Script
Starting backup at 09-OCT-2014
channel prmy1: starting datafile copy
copying standby control file
output file name=/u01/app/oracle/product/11.2.0/dbhome_1/dbs/snapcf_primary.f tag=TAG20141009T200053 RECID=61 STAMP=860529654
channel prmy1: datafile copy complete, elapsed time: 00:00:03
Finished backup at 09-OCT-2014
Starting restore at 09-OCT-2014
channel stby: copied control file copy
Finished restore at 09-OCT-2014
contents of Memory Script:
{
sql clone 'alter database mount standby database';
}
executing Memory Script
sql statement: alter database mount standby database
contents of Memory Script:
{
set newname for tempfile 1 to
"/oraprd04/oradata/teste/temp01.dbf";
switch clone tempfile all;
set newname for datafile 1 to
"/oraprd04/oradata/teste/system01.dbf";
set newname for datafile 2 to
"/oraprd04/oradata/teste/sysaux01.dbf";
set newname for datafile 3 to
"/oraprd04/oradata/teste/undotbs01.dbf";
set newname for datafile 4 to
"/oraprd04/oradata/teste/users01.dbf";
backup as copy reuse
datafile 1 auxiliary format
"/oraprd04/oradata/teste/system01.dbf" datafile
2 auxiliary format
"/oraprd04/oradata/teste/sysaux01.dbf" datafile
3 auxiliary format
"/oraprd04/oradata/teste/undotbs01.dbf" datafile
4 auxiliary format
"/oraprd04/oradata/teste/users01.dbf" ;
}
executing Memory Script
executing command: SET NEWNAME
renamed tempfile 1 to /oraprd04/oradata/teste/temp01.dbf in control file
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
Starting backup at 09-OCT-2014
channel prmy1: starting datafile copy
input datafile file number=00001 name=/u01/app/oracle/oradata/primary/system01.dbf
channel prmy2: starting datafile copy
input datafile file number=00002 name=/u01/app/oracle/oradata/primary/sysaux01.dbf
channel prmy3: starting datafile copy
input datafile file number=00003 name=/u01/app/oracle/oradata/primary/undotbs01.dbf
channel prmy4: starting datafile copy
input datafile file number=00004 name=/u01/app/oracle/oradata/primary/users01.dbf
output file name=/oraprd04/oradata/teste/users01.dbf tag=TAG20141009T200105
channel prmy4: datafile copy complete, elapsed time: 00:00:08
output file name=/oraprd04/oradata/teste/undotbs01.dbf tag=TAG20141009T200105
channel prmy3: datafile copy complete, elapsed time: 00:00:26
output file name=/oraprd04/oradata/teste/sysaux01.dbf tag=TAG20141009T200105
channel prmy2: datafile copy complete, elapsed time: 00:02:08
output file name=/oraprd04/oradata/teste/system01.dbf tag=TAG20141009T200105
channel prmy1: datafile copy complete, elapsed time: 00:02:28
Finished backup at 09-OCT-2014
contents of Memory Script:
{
switch clone datafile all;
}
executing Memory Script
datafile 1 switched to datafile copy
input datafile copy RECID=61 STAMP=860529818 file name=/oraprd04/oradata/teste/system01.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=62 STAMP=860529818 file name=/oraprd04/oradata/teste/sysaux01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=63 STAMP=860529818 file name=/oraprd04/oradata/teste/undotbs01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=64 STAMP=860529819 file name=/oraprd04/oradata/teste/users01.dbf
contents of Memory Script:
{
set until scn 2406620;
recover
standby
clone database
noredo
delete archivelog
;
}
executing Memory Script
executing command: SET until clause
Starting recover at 09-OCT-2014
Finished recover at 09-OCT-2014
Finished Duplicate Db at 09-OCT-2014
released channel: prmy1
released channel: prmy2
released channel: prmy3
released channel: prmy4
released channel: stby
RMAN>

Após o processo de restore é necessário que pelo menos um archive seja gerado no ambiente primário (primary) para que o mesmo seja aplicado na base de teste quando realizar o recover da mesma.

select instance_name from v$instance;
INSTANCE_NAME
----------------
primary
archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /archive/primary
Oldest online log sequence 1252
Next log sequence to archive 1254
Current log sequence 1254
alter system switch logfile;
System altered.
Gerado o archive em produção, devemos conectar na base de TESTE e executar os comandos abaixo:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;  
- Realiza o processo de recover da base de teste.Devemos esperar a aplicação de pelo menos um archive na base de teste, antes de cancelar o processo de recover com o comando abaixo.

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; – Cancela o recover da base.

ALTER DATABASE ACTIVATE STANDBY DATABASE; – Ativa a base de standby como produção.

ALTER DATABASE OPEN;               

SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
teste
SQL> select open_mode, database_role from v$database;
OPEN_MODE DATABASE_ROLE
-------------------- ----------------
MOUNTED PHYSICAL STANDBY
SQL> alter database recover managed standby database using current logfile disconnect;
Database altered.
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Database altered.
SQL> ALTER DATABASE ACTIVATE STANDBY DATABASE;
Database altered.
SQL> alter database open;
Database altered.
SQL> select open_mode, database_role from v$database;
OPEN_MODE DATABASE_ROLE
-------------------- ----------------
READ WRITE PRIMARY
Concluídas todas as etapas acima, nossa base de teste está em modo read write, pronta para ser utilizada. Você pode manter as alterações realizadas que não terá impacto no seu ambiente.

FONTE:
http://docs.oracle.com/cd/B19306_01/backup.102/b14194/rcmsynta028.htm
http://docs.oracle.com/cd/A97630_01/server.920/a96653/cascade_appx.htm

Comentários