Clonar uma BD Oracle

Uma tarefa recorrenta na vida de um DBA é o processo de clonagem de base de dados, seja para atualizar ambientes de desenvolvimento e qualidade, ou para criar ambientes para a realização de algum teste.

Além do processo, que normalmente ocupa tempo, existe sempre a questão do espaço, que deve ser o mesmo a cada novo ambiente, ou seja, para uma BD de 1TB, para clonar para 4 novos ambientes, significa queserão necessários 4TB.

Com a feature do dNFS introduzido na versão 11gR2 foi disponibilizado um recurso chamado de clonedb, que possibilita a disponibilização rápida de um clone e que ocupe pouco espaço.

CloneDB_Overview

Com o processo de clonedb, é possível disponibilizar estes 4 ambientes clonados com pouco storage.

Uma instância de base de dados clonada com esta feature, so ocupa espaço com blocos de dados que são alterados, todos os blocos que não forem alterados, a imagem do backup é utilizada para a consulta.

Para este processo, é necessário um mount point via NFS, para armazenar a imagem de backup e as novas instâncias. Neste exemplo exportei um mount point NFS para a própria máquina 🙂 …

1) Backup / imagem da base de dados origem:

clone2

2) Criar init file:

No init file, é necessário acrescentar o seguinte parâmetro:

CLONEDB=TRUE

3) Criar controlfiles:

STARTUP NOMOUNT pfile=’/oraclone/img/initorcl1.ora’;
CREATE CONTROLFILE REUSE SET DATABASE “ORCL1” RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ‘/oracle/app/oracle/oradata/orcl1/redo01.log’ SIZE 50M BLOCKSIZE 512,
GROUP 2 ‘/oracle/app/oracle/oradata/orcl1/redo02.log’ SIZE 50M BLOCKSIZE 512,
GROUP 3 ‘/oracle/app/oracle/oradata/orcl1/redo03.log’ SIZE 50M BLOCKSIZE 512
DATAFILE
‘/oraclone/img/b3_kdata_D-ORCL_I-1361577073_TS-SYSTEM_FNO-1_03or5l86.img’,
‘/oraclone/img/b4_kdata_D-ORCL_I-1361577073_TS-SYSAUX_FNO-2_04or5lai.img’,
‘/oraclone/img/b5_kdata_D-ORCL_I-1361577073_TS-UNDOTBS1_FNO-3_05or5lca.img’,
‘/oraclone/img/b7_kdata_D-ORCL_I-1361577073_TS-USERS_FNO-4_07or5lce.img’
CHARACTER SET WE8MSWIN1252
;

Os datafiles apontam para os respectivos em formato de imagem de Backup, que foram gerados no passo 1)

4) Renomear os datafiles com dbms_dnfs:

declare
begin
dbms_dnfs.clonedb_renamefile(‘/oraclone/img/b3_kdata_D-ORCL_I-1361577073_TS-SYSTEM_FNO-1_03or5l86.img’, ‘/oraclone//orcl1/system01.f’);
dbms_dnfs.clonedb_renamefile(‘/oraclone/img/b4_kdata_D-ORCL_I-1361577073_TS-SYSAUX_FNO-2_04or5lai.img’, ‘/oraclone/orcl1/sysaux01.f’);
dbms_dnfs.clonedb_renamefile(‘/oraclone/img/b5_kdata_D-ORCL_I-1361577073_TS-UNDOTBS1_FNO-3_05or5lca.img’, ‘/oraclone/orcl1/undo01.f’);
dbms_dnfs.clonedb_renamefile(‘/oraclone/img/b7_kdata_D-ORCL_I-1361577073_TS-USERS_FNO-4_07or5lce.img’, ‘/oraclone/orcl1/users01.f’);
end;
/

5) Abrir a base de dados:

alter database open resetlogs;

Em determinados casos, será necessário recorrer ao processo de recover:

recover database using backup controlfiles;

Um processo rápido, pois na prática não é feito um restore de datafiles, como em um processo tradicional.

Por questões de recursos, na minha VM criei 2 clones, orcl1 e orcl2. A instância orcl é o ambiente que deu origem.

clone_instances

Após a execução do processo demonstrado, as instâncias clonadas possuem os datafiles:

clone_orcl1_dtf

clone_orcl2_df

No filesystem/mount point via NFS, vemos os datafiles:

clone_orcl1_orcl2

Reparem que ocupam 16kb em média.

Na instância orcl1, executei o comando:

create table teste tablespace users as select * from dba_objects union all select * from dba_objects;

Se reparem, apenas o datafile do tablespace USERS da instância orcl1 cresceu, passou de 5251072 bytes para 23601152 bytes:
clone_orcl1_after_ctas

PS: Ahhh…não esquece de adicionar pelo menos um tablespace temporário após a clonagem 🙂

Para mais detalhes, existe a nota do Metalink “Clone your dNFS Production Database for Testing (Doc ID 1210656.1)” com mais informações.

2 comentários em “Clonar uma BD Oracle

  1. Viva Márcio,
    Muito bom post.

    Uma dúvida que não sei se tiveste oportunidade de tirar a limpo sobre o TEMP tablespace.
    Se usares o RMAN para restore e recovery duma BD, o TEMP tablespace é recriado automaticamente quando a BD é open. É recriado com os parâmetros que existem no controlfile.

    No caso que apresentaste, provavelmente se na criação do controlfile especificares o TEMP, é possível (segunda lógica) que ele seja recriado automaticamente quando abrires a BD.

    Faz sentido?
    Obrigado,
    Luís

    1. Certo, o duplicate database ou restore actualmente já pode recriar o temporário, neste processo como não ocorre um restore, pois ele utiliza apontadores para as imagens dos datafiles que estão em backup. No minha VM não me criou:

      SQL> select file_name from dba_data_files;

      FILE_NAME
      ——————————————————————————–
      /oraclone/orcl2/users01.f
      /oraclone/orcl2/undo01.f
      /oraclone/orcl2/sysaux01.f
      /oraclone/orcl2/system01.f

      SQL> select * from dba_temp_files;

      no rows selected

      🙂

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s