segunda-feira, 10 de outubro de 2016

Duplicate sem acessar o Target e o Catalog

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? 

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á blá.

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

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 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. 

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". Sendo assim, devemos configurar:
*.db_create_file_dest                 = '/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. 
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
                FORMAT '/nfbackup/rman/BANCO49/%d_%Y%M%D_%U.dat';
ALLOCATE AUXILIARY CHANNEL aux2 DEVICE TYPE DISK
                FORMAT '/nfbackup/rman/BANCO49/%d_%Y%M%D_%U.dat';
ALLOCATE AUXILIARY CHANNEL aux3 DEVICE TYPE DISK
                FORMAT '/nfbackup/rman/BANCO49/%d_%Y%M%D_%U.dat';
ALLOCATE AUXILIARY CHANNEL aux4 DEVICE TYPE DISK
                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

3 comentários:

Isso te ajudou? Comente...

Postagem em destaque

[ORACLE] Batch change EDITIONABLE property.

Hello everyone. Hope you're doing well! Today, I have a simple case.   A test database had many database objects with the EDITIONABLE pr...