Duplicate sem acessar o Target e o Catalog
Autor: Mario Barduchi | Publicado: 2016-10-10T22:43:00-03:00


Olá pessoal.



Manja quando te pedem para criar uma base nova para desenvolvimento, simulação, etc. Tranquilo.



Vamos fazer um duplicate e resolvemos o assunto, certo?&nbsp;



Só que o cara da infra fala que o duplicate não vai ser possível (nem o "comum", nem o active) já que o processo vai trafegar muitos dados pela rede, e o backup fica em uma rede separada e vai sentar o link se fizer, e blá blá&nbsp;blá.



Ok, então vamos copiar o backup para a máquina de destino, e fazemos um restore pensa o pequeno gafanhoto, nosso DBA.&nbsp;



Opa um restore também complica, poque essa máquina é usada para um DataGuard do cliente, e ele já tem uma base chamada "BANCO49" lá, que é o mesmo nome claro da sua base de produção.



Claro, poderíamos usar um workaround (nome bonito né) e colocar o nosso&nbsp;DB_UNIQUE_NAME com o nome da nossa nova base e manter o DB_NAME com o nome original para "burlar" a restrição dos nomes.



Porém isso não é recomendável e não é legal também. Para resolver esse problema, desde a versão 11g temos uma alternativa legal e que nem todo mundo conhece.&nbsp;



Podemos fazer um duplicate sem acessar o target.



No note "RMAN 11GR2 : DUPLICATE Without Target And Recovery Catalog Connection (Doc ID 874352.1)" temos o procedimento descrito que é muito simples e eu descrevo abaixo para vocês, com alguns acertos feitos por mim.



Na verdade o procedimento é o mesmo de uma duplicate comum, com apenas alguns acertos.



1) Os backuppieces devem ser copiados para a máquina de destino. No nosso exemplo, irei copiar para "/nfbackup/rman/BANCO49".



2) O procedimento funciona com o "DB_FILE_NAME_CONVERT", porém eu gosto de ter um pouco mais de controle sobre o processo, por isso eu uso o "SET NEWNAME".



3) Podemos usar o OMF (Oracle Managed Files) para definição dos locais dos datafiles. Eu particularmente gosto disso e uso sempre o "SET NEWNAME TO NEW".&nbsp;Sendo assim, devemos configurar:

 *.db_create_file_dest &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = '/BANCO49/oradata/banco49/'

 *.db_create_online_log_dest_1 = '/BANCO49/oradata/banco49/'

 *.db_create_online_log_dest_2 = '/BANCO49/oradata/banco49/'



4) Todos os outros procedimentos para o duplicate de uma base comum devem ser observados.



Tudo isso pronto, vamos ao duplicate. Só que antes, mais algumas observações importantes:



1) Repare que iremos nos conectar somente a base auxiliar ("rman AUXILIARY /").

2) Podemos alocar quantos canais precisarmos, mas não esqueça somente no EE.

3) Esse duplicate somente funciona com o "UNTIL TIME".

4) O comando de duplicate também é um pouquinho diferente.&nbsp;

5) O pulo do gato está na cláusula "BACKUP LOCATION '/local/do/backup' "



Todas as mudanças estão listadas abaixo.


rman AUXILIARY / << EOF

RUN
{
 ALLOCATE AUXILIARY CHANNEL aux1 DEVICE TYPE DISK
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FORMAT '/nfbackup/rman/BANCO49/%d_%Y%M%D_%U.dat';
 ALLOCATE AUXILIARY CHANNEL aux2 DEVICE TYPE DISK
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FORMAT '/nfbackup/rman/BANCO49/%d_%Y%M%D_%U.dat';
 ALLOCATE AUXILIARY CHANNEL aux3 DEVICE TYPE DISK
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FORMAT '/nfbackup/rman/BANCO49/%d_%Y%M%D_%U.dat';
 ALLOCATE AUXILIARY CHANNEL aux4 DEVICE TYPE DISK
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FORMAT '/nfbackup/rman/BANCO49/%d_%Y%M%D_%U.dat';
 set newname for datafile 1 to new;
 set newname for datafile 2 to new;
 set newname for datafile 3 to new;
 set newname for datafile 4 to new;
 set newname for datafile 5 to new;
 set newname for datafile 6 to new;
 set newname for datafile 7 to new;
 set newname for tempfile 1 to new;
 set newname for tempfile 2 to new;
 DUPLICATE DATABASE TO banco49
 UNTIL TIME "TO_DATE('02/10/2016 10:00:00','DD/MM/YYYY HH24:MI:SS')"
 LOGFILE
         GROUP 1 ('/BANCO49/oradata/sml49/redo01.log') SIZE 300M REUSE,
         GROUP 2 ('/BANCO49/oradata/sml49/redo02.log') SIZE 300M REUSE,
         GROUP 3 ('/BANCO49/oradata/sml49/redo03.log') SIZE 300M REUSE
 BACKUP LOCATION '/nfbackup/rman/BANCO49';
}
EXIT;
EOF

É isso, agora basta criar um arquivo dup.sh e deixar rodando em nohup.

Pode parecer besteira, mas já quebrou alguns galhos....

Grande abraço.
Mario