top of page

Como duplicar um banco de dados ORACLE em um caminho diferente e sem incluir todos os Tablespaces

Atualizado: 8 de fev. de 2022

Recentemente precisei criar um banco de dados em ambiente de testes, a partir de um banco de dados de produção, mas eu tinha duas restrições a considerar:

  • O servidor de testes não tinha espaço suficiente para o banco de dados completo.

  • Os caminhos para os arquivos eram diferentes.

Duplicating a Database, Fonte: Oracle Corporation

Felizmente os testes que seriam realizados eram de apenas alguns dos sistemas, e eu poderia excluir Tablespaces não necessários no banco de testes, resolvendo, assim, o problema de espaço..

A forma mais fácil e recomendada para se criar este banco de dados é usando o comando DUPLICATE do RMAN. Este comando permite criar uma cópia de um banco de dados, o que é muito útil para preparar ambientes de teste e homologação.

Temos duas técnicas possíveis de duplicação:

  • Active Database Duplication: nesta técnica de duplicação, nos conectamos às instâncias de origem (TARGET) e de destino (AUXILIARY) e o RMAN gerencia a cópia dos arquivos necessários. Não é necessário um backup da origem.

  • Backup-based Duplication: nesta duplicação, o RMAN utiliza um Backup já existente. Se pudermos nos conectar ao banco de dados de origem ou a um catálogo do RMAN, a duplicação saberá onde estão os arquivos de backup e irá utilizá-los, desde que estejam em local acessível ao servidor de destino. Se não nos conectarmos ao banco de dados de origem ou a um catálogo do RMAN, deveremos informar o caminho onde estão os arquivos de backup, que deverão ser previamente copiados para este local.

A seguir apresento um exemplo de duplicação. Como em muitos casos o ambiente de testes está separado do ambiente de produção e não é possível fazer uma conexão entre eles, farei o exemplo usando a técnica “Backup-based Duplication”, onde não me conectarei ao banco de dados de origem. Desta forma, precisarei copiar os arquivos de backup necessários para o servidor de destino antes de realizar a duplicação.

Neste exemplo usarei um banco de dados de testes chamado ORCL, onde criei quatro Tablespaces, chamados: TS_TESTE_1, TS_TESTE_2, TS_TESTE_3 e TS_TESTE_4. Este banco de dados está na seguinte estrutura de arquivos:

  • /orafiles/orcl/controlfile1: local do controlfile 1;

  • /orafiles/orcl/controlfile2: local do controlfile 2;

  • /orafiles/orcl/redo: local dos Redo log files;

  • /orafiles/orcl/archive: local dos archives;

  • /orafiles/orcl/datafiles/root: local dos arquivos de dados do Container (CDB$ROOT);

  • /orafiles/orcl/datafiles/orclpdb: local dos arquivos de dados da Pluggable Database ORCLPDB;

  • /orafiles/orcl/datafiles/pdbseed: local dos arquivos de dados da Pluggable Database PDB$SEED;

Nosso banco de dados de destino irá se chamar ORCLTEST, e iremos excluir os Tablespaces TS_TESTE_2 e TS_TESTE_4 na duplicação. Também iremos alterar o caminho dos arquivos do banco de dados.

O primeiro passo para realizar a duplicação é disponibilizar os arquivos de backup do banco de dados de origem no servidor de destino. Isto pode ser feito através do sistema operacional, usando ponto de montagem, ou podemos copiar os arquivos do servidor de origem para o servidor de destino. Vale ressaltar que devemos copiar todos os arquivos de backup necessários, e devemos ter também o backup dos archives e os últimos archives gerados. A duplicação será feita até o SCN do último archive disponível nos backups. Isto porque não teremos acesso aos Redos do banco de dados de origem para aplicar as alterações mais recentes.

O segundo passo é preparar um arquivo “initorcltest.ora”. A melhor forma de se fazer isto é copiar o arquivo do banco de dados de origem, renomeá-lo e ajustar os parâmetros necessários. Os ajustes mandatórios serão o nome do banco de dados e os caminhos do nosso banco de dados de destino. O trecho abaixo mostra os parâmetros que foram ajustados. Observe os caminhos dos controlfiles e dos archives, que foram modificados para estar em /orafiles/orcltest:

*.db_name='orcltest'

*.control_files='/orafiles/orcltest/controlfile1/control01.ctl','/orafiles/orcltest/controlfile2/control02.ctl'

*.log_archive_dest_1='LOCATION=/orafiles/orcltest/archive'

O terceiro passo é copiar o arquivo de senhas (Password File) do banco de dados original para o de destino, renomeando-o devidamente (de orapworcl para orapworcltest). Isto permite que se mantenham as definições do banco de origem. Opcionalmente pode-se criar este arquivo com o utilitário “orapwd”.

Com esses ajustes feitos, podemos iniciar nosso banco de dados em modo NOMOUNT usando o pfile, conforme abaixo:

startup nomount pfile = '/home/oracle/app/oracle/product/12.2.0.1/dbs/initorcltest.ora';

Agora que nosso banco de dados está iniciado em NOMOUNT podemos efetuar a duplicação, conectando-nos ao RMAN, na instância auxiliar:

> rman auxiliary /

Depois executamos o comando de duplicação, conforme abaixo:

duplicate database to orcltest

backup location '/bkp2dup'

pfile = '/home/oracle/app/oracle/product/12.2.0.1/dbs/initorcltest.ora'

logfile

group 1 ('/orafiles/orcltest/redo/redo01.log') size 100M,

group 2 ('/orafiles/orcltest/redo/redo02.log') size 100M,

group 3 ('/orafiles/orcltest/redo/redo03.log') size 100M

db_file_name_convert =

'/orafiles/orcl/datafiles/orclpdb/ts_teste',

'/orafiles/orcltest/datafiles/teste/teste_ts',

'/orafiles/orcl/',

'/orafiles/orcltest/'

skip tablespace ORCLPDB:TS_TESTE_2,ORCLPDB:TS_TESTE_4;

Observe neste comando os seguintes parâmetros:

  • Backup Location: indica o local onde estão os arquivos de backup do banco de dados de origem. Neste caso isto é necessário, pois não estamos conectados nem ao banco de origem e nem ao catálogo do RMAN;

  • Pfile: indica o arquivo de parâmetros do tipo pfile que deverá ser usado pelo DUPLICATE quando ele reiniciar o banco de dados, algo que ele precisa fazer durante o processo de duplicação;

  • db_file_name_convert: indica as conversões para os caminhos e nomes de arquivos. Na prática funciona como uma substituição de string. O 1o valor, uma vez encontrado, é substituído pelo segundo valor, o 3o, se houver, é substituído pelo 4o valor, e assim por diante. No nosso caso todos os caminhos de arquivos possuem '/orafiles/orcl/, e serão substituídos por '/orafiles/orcltest/. Especificamente os arquivos dos Tablespaces TS_TESTE_1 e TS_TESTE_3 serão alterados para um sub-diretório e nome diferentes dos originais. Os demais arquivos permanecem nos mesmos sub-diretórios e com os mesmos nomes, tendo apenas seu diretório base alterado para “/orafiles/orcltest”;

  • Logfile: cria os grupos de Redo’s nos caminhos desejados;

  • Skip tablespace: indica os tablespaces que serão excluídos. Observe que se os tablespaces pertencem a algum PDB, ele deve ser especificado antes do nome da tablespace.

Vale ressaltar que quando excluímos Tablespaces no DUPLICATE, eles não podem ter dependências com outros tablespaces não excluídos. Se isto ocorrer, os Tablespaces que deveriam ser excluídos podem ficar Offline, sem seus arquivos de dados, e teremos erros ao tentar usar objetos desses Tablespaces ou que deles dependem.

Abaixo temos duas consultas que mostram como ficaram os dois tablespaces excluídos e os caminhos dos arquivos de dados.

select con_id, file#, name from v$datafile order by 1, 2, 3;

CON_ID FILE# NAME

1 1 /orafiles/orcltest/datafiles/orcl/system01.dbf

1 3 /orafiles/orcltest/datafiles/orcl/sysaux01.dbf

1 4 /orafiles/orcltest/datafiles/orcl/undotbs01.dbf

1 7 /orafiles/orcltest/datafiles/orcl/users01.dbf

2 5 /orafiles/orcltest/datafiles/pdbseed/system01.dbf

2 6 /orafiles/orcltest/datafiles/pdbseed/sysaux01.dbf

2 8 /orafiles/orcltest/datafiles/pdbseed/undotbs01.dbf

3 9 /orafiles/orcltest/datafiles/orclpdb/system01.dbf

3 10 /orafiles/orcltest/datafiles/orclpdb/sysaux01.dbf

3 11 /orafiles/orcltest/datafiles/orclpdb/undotbs01.dbf

3 12 /orafiles/orcltest/datafiles/orclpdb/users01.dbf

3 18 /orafiles/orcltest/datafiles/teste/teste_ts_1.dbf

3 20 /orafiles/orcltest/datafiles/teste/teste_ts_3.dbf

select con_id, ts#, name from v$tablespace where name like '%TESTE%' order by 1, 2, 3;

CON_ID FILE# NAME

3 7 TS_TESTE_1

3 9 TS_TESTE_3

Este é um exemplo simples do comando DUPLICATE. Espero que você tenha aprendido algo e que este conhecimento lhe seja útil.

Até a próxima!

QUER APRENDER MAIS SOBRE BACKUP AND RECOVERY OU RMAN?

CONHEÇA O NOSSO TREINAMENTO ORACLE BACKUP AND RECOVERY!

2.910 visualizações1 comentário

Posts recentes

Ver tudo
bottom of page