oracleBuenas! 🙂

Vendo inúmeras perguntas sobre o tema no grupo, e tendo uma atividade do tipo para executar, resolvi documentar passo-a-passo e transformar em um post.

Todo DBA já precisou replicar um banco. Seja ele um banco de PRD para atualizar ambiente de HLG, ou apenas duplicar um banco para executar um teste de aplicação de patch, enfim.

Irei compartilhar aqui minha forma favorita de executar essa tarefa! 🙂

– É necessário que o banco esteja em modo ARCHIVE.

1) Identificar a lista de datafiles do banco de origem:

17:07:41 nomedb>SELECT name FROM v$datafile;

NAME
--------------------------------------------------------
/u01/oradata/nomedb/system01.ora
/u01/oradata/nomedb/undotbs01.dbf
/u01/oradata/nomedb/forponto_data01.dbf
/u01/oradata/nomedb/drsys01.dbf
/u01/oradata/nomedb/mxhistorico_data.dbf
/u01/oradata/nomedb/mxrhprc_data.ora
/u01/oradata/nomedb/mxrhprc_index.ora
/u01/oradata/nomedb/mxrh_data.ora
/u01/oradata/nomedb/mxrh_index.ora
/u01/oradata/nomedb/perfstat_data01.ora
/u01/oradata/nomedb/sepat_dados.ora
/u01/oradata/nomedb/sepat_index.ora
/u01/oradata/nomedb/users01.ora
/u01/oradata/nomedb/ponto_data01.ora
/u01/oradata/nomedb/ponto_index01.ora
/u01/oradata/nomedb/ponto_hist_data01.ora
/u01/oradata/nomedb/ponto_hist_index01.dbf
/u01/oradata/nomedb/ponto_data02.ora
/u01/oradata/nomedb/ponto_index02.ora
/u01/oradata/nomedb/users02.ora
/u01/oradata/nomedb/ponto_data03.ora
/u01/oradata/nomedb/telemat_index01.dbf
/u01/oradata/nomedb/pexxi_data01.dbf
/u01/oradata/nomedb/pexxi_data02.dbf
/u01/oradata/nomedb/mxrh_data02.ora
/u01/oradata/nomedb/ponto_index03.ora
/u01/oradata/nomedb/mxrh_data03.ora
/u01/oradata/nomedb/ponto_index04.ora
/u01/oradata/nomedb/import_rh_data01.dbf
/u01/oradata/nomedb/import_rh_index01.dbf
/u01/oradata/nomedb/ponto_data04.ora
/u01/oradata/nomedb/ponto_data05.ora
/u01/oradata/nomedb/telemat_data201.dbf
/u01/oradata/nomedb/mxrhprc_index_02.dbf
/u01/oradata/nomedb/ponto_index05.ora
/u01/oradata/nomedb/undotbs02.dbf
/u01/oradata/nomedb/mxrh_data04.ora
/u01/oradata/nomedb/ponto_data06.dbf
/u01/oradata/nomedb/ponto_data_7.dbf
/u01/oradata/nomedb/telemat_data2_2.dbf
/u01/oradata/nomedb/sysaux01.dbf
/u01/oradata/nomedb/system_2.dbf
/u01/oradata/nomedb/telemat_index1_01.dbf
/u01/oradata/nomedb/telemat_data2_3.dbf
/u01/oradata/nomedb/ponto_data_8.dbf
/u01/oradata/nomedb/telemat_data2_4.dbf
/u01/oradata/nomedb/ponto_data_9.dbf
/u01/oradata/nomedb/mxrh_data_5.dbf
/u01/oradata/nomedb/ponto_audit2_16.dbf
/u01/oradata/nomedb/mxrhprc_index_3.dbf
/u01/oradata/nomedb/ponto_audit2_18.dbf
/u01/oradata/nomedb/ponto_index_6.dbf
/u01/oradata/nomedb/ponto_data_10.dbf
/u01/oradata/nomedb/ponto_audit2_17.dbf
/u01/oradata/nomedb/prodigeo_data01.dbf
/u01/oradata/nomedb/ponto_audit2_01.dbf
/u01/oradata/nomedb/ponto_audit2_02.dbf
/u01/oradata/nomedb/ponto_audit2_03.dbf
/u01/oradata/nomedb/ponto_audit2_04.dbf
/u01/oradata/nomedb/ponto_audit2_05.dbf
/u01/oradata/nomedb/ponto_audit2_06.dbf
/u01/oradata/nomedb/ponto_audit2_07.dbf
/u01/oradata/nomedb/ponto_audit2_08.dbf
/u01/oradata/nomedb/ponto_audit2_09.dbf
/u01/oradata/nomedb/ponto_audit2_10.dbf
/u01/oradata/nomedb/ponto_audit2_11.dbf
/u01/oradata/nomedb/ponto_audit2_12.dbf
/u01/oradata/nomedb/ponto_audit2_13.dbf
/u01/oradata/nomedb/ponto_audit2_14.dbf
/u01/oradata/nomedb/ponto_audit2_15.dbf
/u01/oradata/nomedb/ponto_data_11.dbf
/u01/oradata/nomedb/ponto_data_12.dbf
/u01/oradata/nomedb/ponto_index_7.dbf
/u01/oradata/nomedb/ponto_data_13.dbf
/u01/oradata/nomedb/ponto_data_14.dbf
/u01/oradata/nomedb/ponto_data_15.dbf
/u01/oradata/nomedb/ponto_data_16.dbf
/u01/oradata/nomedb/ponto_data_17.dbf
/u01/oradata/nomedb/ponto_index_8.dbf
/u01/oradata/nomedb/ponto_audit2_19.dbf
/u01/oradata/nomedb/mxrh_data_6.dbf
/u01/oradata/nomedb/ponto_data_18.dbf
/u01/oradata/nomedb/ponto_data_19.dbf
/u01/oradata/nomedb/ponto_data_20.dbf
/u01/oradata/nomedb/ponto_data_21.dbf
/u01/oradata/nomedb/ponto_data_22.dbf
/u01/oradata/nomedb/ponto_index_9.dbf
/u01/oradata/nomedb/ponto_data_23.dbf
/u01/oradata/nomedb/ponto_data_24.dbf
/u01/oradata/nomedb/ponto_data_25.dbf
/u01/oradata/nomedb/ponto_data_26.dbf
/u01/oradata/nomedb/ponto_data_27.dbf
/u01/oradata/nomedb/ponto_index_10.dbf
/u01/oradata/nomedb/ponto_data_28.dbf
/u01/oradata/nomedb/ponto_data_29.dbf
/u01/oradata/nomedb/ponto_data_30.dbf
/u01/oradata/nomedb/ponto_index_11.dbf
/u01/oradata/nomedb/ponto_data_31.dbf
/u01/oradata/nomedb/ponto_data_32.dbf
/u01/oradata/nomedb/ponto_data_33.dbf
/u01/oradata/nomedb/ponto_data_34.dbf
/u01/oradata/nomedb/ponto_data_35.dbf
/u01/oradata/nomedb/ponto_audit2_20.dbf
/u01/oradata/nomedb/ponto_audit2_21.dbf
/u01/oradata/nomedb/ponto_index_12.dbf
/u01/oradata/nomedb/ponto_audit2_22.dbf
/u01/oradata/nomedb/ponto_audit2_23.dbf
/u01/oradata/nomedb/data_DBSNMP_01.dbf
/u01/oradata/nomedb/ponto_audit2_24.dbf
/u01/oradata/nomedb/mxrhprc_data_02.ora
/u01/oradata/nomedb/ponto_audit2_25.dbf
/u01/oradata/nomedb/ponto_audit2_26.dbf
/u01/oradata/nomedb/ponto_index_13.dbf
/u01/oradata/nomedb/ponto_audit2_27.dbf
/u01/oradata/nomedb/ponto_index_14.dbf

115 linhas selecionadas.

Decorrido: 00:00:00.76
17:07:43 nomedb>

2) Identificar no banco de origem os últimos archives gerados. Os archives gerados após o ‘begin backup’ são os necessários para aplicar no banco destino e será necessário a cópia dos mesmos. Tome nota da sequence a partir da qual será necessário enviar para o banco destino:

SELECT sequence#,
To_char(next_time, 'DD-MON-YYYY HH24:MI:SS')
FROM (SELECT sequence#,
next_time
FROM v$archived_log
ORDER BY next_time DESC)
WHERE ROWNUM < 2
/

19:13:02 nomedb>SELECT sequence#,
19:13:02 2 To_char(next_time, 'DD-MON-YYYY HH24:MI:SS')
19:13:02 3 FROM (SELECT sequence#,
19:13:03 4 next_time
19:13:03 5 FROM v$archived_log
19:13:04 6 ORDER BY next_time DESC)
19:13:04 7 WHERE ROWNUM < 2
19:13:05 8 /

SEQUENCE# TO_CHAR(NEXT_TIME,'D
---------- --------------------
180735 07-NOV-2012 19:13:14

3) Execute o seguinte comando para colocar o banco em modo backup: (em bancos 9i é necessário realizar o comando por tablespace – “ALTER TABLESPACE nome BEGIN BACKUP;”)

19:14:05 nomedb>ALTER DATABASE BEGIN BACKUP;

Banco de dados alterado.

Decorrido: 00:00:00.98
19:14:10 nomedb>

4) Agora os datafiles podem ser copiados para o banco destino:

[root@hostname ~]# rsync -av --progress /u01/oradata/nomedb/* root@172.17.1.89:/u01/oradata/nomedb/
root@172.17.1.89's password:
arch_nomedb_16723_1_716515442.arc 100% 63MB 21.0MB/s 00:03
arch_nomedb_180701_1_732761793.arc 100% 61MB 20.2MB/s 00:03
arch_nomedb_180702_1_732761793.arc 100% 61MB 20.2MB/s 00:03
arch_nomedb_180703_1_732761793.arc 100% 61MB 20.2MB/s 00:03
...

Duas horas depois… 😀

5) Após a cópia, execute o comando para geração de alguns archives no banco origem:

21:15:05 nomedb>ALTER SYSTEM ARCHIVE LOG CURRENT;

Sistema alterado.

Decorrido: 00:00:01.60
21:15:10 nomedb>ALTER SYSTEM ARCHIVE LOG CURRENT;

Sistema alterado.

Decorrido: 00:00:00.29
21:15:11 nomedb>ALTER SYSTEM ARCHIVE LOG CURRENT;

Sistema alterado.

Decorrido: 00:00:00.28
21:15:12 nomedb>ALTER DATABASE END BACKUP;

Sistema alterado.

Decorrido: 00:00:00.42

6) Execute novamente no banco origem o select do passo 2 para verificar a sequence de archives atual. Os archives gerados entre a sequence do passo 2 e a sequence atual devem ser copiados para o banco destino. Nesse exemplo entre a sequence 180735 e a sequence 180750 conforme exemplo abaixo:

21:15:13 nomedb>SELECT sequence#,
21:15:33 2 To_char(next_time, 'DD-MON-YYYY HH24:MI:SS')
21:15:33 3 FROM (SELECT sequence#,
21:15:33 4 next_time
21:15:33 5 FROM v$archived_log
21:15:33 6 ORDER BY next_time DESC)
21:15:33 7 WHERE ROWNUM < 2
21:15:33 8 /

SEQUENCE# TO_CHAR(NEXT_TIME,'D
---------- --------------------
180750 07-NOV-2012 21:14:58

7) Faça uma cópia do pfile/spfile do banco origem para um pfile no banco destino. Utilizaremos pfile pro caso de ser necessário efetuar alguma alteração, como por exemplo, parâmetros de memória, caminho dos diretórios *dump, o nome do DB, etc…

8) No banco origem criamos um backup do controlfile para um trace com o seguinte comando:

SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE;

Database altered.

SQL>

O arquivo será gerado no udump (geralmente o último arquivo gerado, verifique com um editor de texto).
Na seção ‘RESETLOGS’ altere a opção ‘REUSE’ para ‘SET’. Caso seja necessário altere o nome do banco, caminho dos redos, datafiles, o que for necessário. Salve esse arquivo como create_control.sql

--CREATE CONTROLFILE REUSE DATABASE "nomedb" NORESETLOGS  ARCHIVELOG
 CREATE CONTROLFILE SET DATABASE "nomedb" RESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 8
MAXLOGHISTORY 11684
LOGFILE
GROUP 1 (
'/u01/oradata/nomedb/redo01a.log',
'/u01/oradata/nomedb/redo01b.log'
) SIZE 64M,
GROUP 2 (
'/u01/oradata/nomedb/redo02a.log',
'/u01/oradata/nomedb/redo02b.log'
) SIZE 64M,
GROUP 3 (
'/u01/oradata/nomedb/redo03a.log',
'/u01/oradata/nomedb/redo03b.log'
) SIZE 64M,
GROUP 4 (
'/u01/oradata/nomedb/redo04a.log',
'/u01/oradata/nomedb/redo04b.log'
) SIZE 64M
-- STANDBY LOGFILE
DATAFILE
'/u01/oradata/nomedb/system01.ora',
'/u01/oradata/nomedb/undotbs01.dbf',
'/u01/oradata/nomedb/forponto_data01.dbf',
'/u01/oradata/nomedb/drsys01.dbf',
'/u01/oradata/nomedb/mxhistorico_data.dbf',
'/u01/oradata/nomedb/mxrhprc_data.ora',
'/u01/oradata/nomedb/mxrhprc_index.ora',
'/u01/oradata/nomedb/mxrh_data.ora',
'/u01/oradata/nomedb/mxrh_index.ora',
'/u01/oradata/nomedb/perfstat_data01.ora',
'/u01/oradata/nomedb/sepat_dados.ora',
'/u01/oradata/nomedb/sepat_index.ora',
'/u01/oradata/nomedb/users01.ora',
'/u01/oradata/nomedb/ponto_data01.ora',
'/u01/oradata/nomedb/ponto_index01.ora',
'/u01/oradata/nomedb/ponto_hist_data01.ora',
'/u01/oradata/nomedb/ponto_hist_index01.dbf',
'/u01/oradata/nomedb/ponto_data02.ora',
'/u01/oradata/nomedb/ponto_index02.ora',
'/u01/oradata/nomedb/users02.ora',
'/u01/oradata/nomedb/ponto_data03.ora',
'/u01/oradata/nomedb/telemat_index01.dbf',
'/u01/oradata/nomedb/pexxi_data01.dbf',
'/u01/oradata/nomedb/pexxi_data02.dbf',
'/u01/oradata/nomedb/mxrh_data02.ora',
'/u01/oradata/nomedb/ponto_index03.ora',
'/u01/oradata/nomedb/mxrh_data03.ora',
'/u01/oradata/nomedb/ponto_index04.ora',
'/u01/oradata/nomedb/import_rh_data01.dbf',
'/u01/oradata/nomedb/import_rh_index01.dbf',
'/u01/oradata/nomedb/ponto_data04.ora',
'/u01/oradata/nomedb/ponto_data05.ora',
'/u01/oradata/nomedb/telemat_data201.dbf',
'/u01/oradata/nomedb/mxrhprc_index_02.dbf',
'/u01/oradata/nomedb/ponto_index05.ora',
'/u01/oradata/nomedb/undotbs02.dbf',
'/u01/oradata/nomedb/mxrh_data04.ora',
'/u01/oradata/nomedb/ponto_data06.dbf',
'/u01/oradata/nomedb/ponto_data_7.dbf',
'/u01/oradata/nomedb/telemat_data2_2.dbf',
'/u01/oradata/nomedb/sysaux01.dbf',
'/u01/oradata/nomedb/system_2.dbf',
'/u01/oradata/nomedb/telemat_index1_01.dbf',
'/u01/oradata/nomedb/telemat_data2_3.dbf',
'/u01/oradata/nomedb/ponto_data_8.dbf',
'/u01/oradata/nomedb/telemat_data2_4.dbf',
'/u01/oradata/nomedb/ponto_data_9.dbf',
'/u01/oradata/nomedb/mxrh_data_5.dbf',
'/u01/oradata/nomedb/ponto_audit2_16.dbf',
'/u01/oradata/nomedb/mxrhprc_index_3.dbf',
'/u01/oradata/nomedb/ponto_audit2_18.dbf',
'/u01/oradata/nomedb/ponto_index_6.dbf',
'/u01/oradata/nomedb/ponto_data_10.dbf',
'/u01/oradata/nomedb/ponto_audit2_17.dbf',
'/u01/oradata/nomedb/prodigeo_data01.dbf',
'/u01/oradata/nomedb/ponto_audit2_01.dbf',
'/u01/oradata/nomedb/ponto_audit2_02.dbf',
'/u01/oradata/nomedb/ponto_audit2_03.dbf',
'/u01/oradata/nomedb/ponto_audit2_04.dbf',
'/u01/oradata/nomedb/ponto_audit2_05.dbf',
'/u01/oradata/nomedb/ponto_audit2_06.dbf',
'/u01/oradata/nomedb/ponto_audit2_07.dbf',
'/u01/oradata/nomedb/ponto_audit2_08.dbf',
'/u01/oradata/nomedb/ponto_audit2_09.dbf',
'/u01/oradata/nomedb/ponto_audit2_10.dbf',
'/u01/oradata/nomedb/ponto_audit2_11.dbf',
'/u01/oradata/nomedb/ponto_audit2_12.dbf',
'/u01/oradata/nomedb/ponto_audit2_13.dbf',
'/u01/oradata/nomedb/ponto_audit2_14.dbf',
'/u01/oradata/nomedb/ponto_audit2_15.dbf',
'/u01/oradata/nomedb/ponto_data_11.dbf',
'/u01/oradata/nomedb/ponto_data_12.dbf',
'/u01/oradata/nomedb/ponto_index_7.dbf',
'/u01/oradata/nomedb/ponto_data_13.dbf',
'/u01/oradata/nomedb/ponto_data_14.dbf',
'/u01/oradata/nomedb/ponto_data_15.dbf',
'/u01/oradata/nomedb/ponto_data_16.dbf',
'/u01/oradata/nomedb/ponto_data_17.dbf',
'/u01/oradata/nomedb/ponto_index_8.dbf',
'/u01/oradata/nomedb/ponto_audit2_19.dbf',
'/u01/oradata/nomedb/mxrh_data_6.dbf',
'/u01/oradata/nomedb/ponto_data_18.dbf',
'/u01/oradata/nomedb/ponto_data_19.dbf',
'/u01/oradata/nomedb/ponto_data_20.dbf',
'/u01/oradata/nomedb/ponto_data_21.dbf',
'/u01/oradata/nomedb/ponto_data_22.dbf',
'/u01/oradata/nomedb/ponto_index_9.dbf',
'/u01/oradata/nomedb/ponto_data_23.dbf',
'/u01/oradata/nomedb/ponto_data_24.dbf',
'/u01/oradata/nomedb/ponto_data_25.dbf',
'/u01/oradata/nomedb/ponto_data_26.dbf',
'/u01/oradata/nomedb/ponto_data_27.dbf',
'/u01/oradata/nomedb/ponto_index_10.dbf',
'/u01/oradata/nomedb/ponto_data_28.dbf',
'/u01/oradata/nomedb/ponto_data_29.dbf',
'/u01/oradata/nomedb/ponto_data_30.dbf',
'/u01/oradata/nomedb/ponto_index_11.dbf',
'/u01/oradata/nomedb/ponto_data_31.dbf',
'/u01/oradata/nomedb/ponto_data_32.dbf',
'/u01/oradata/nomedb/ponto_data_33.dbf',
'/u01/oradata/nomedb/ponto_data_34.dbf',
'/u01/oradata/nomedb/ponto_data_35.dbf',
'/u01/oradata/nomedb/ponto_audit2_20.dbf',
'/u01/oradata/nomedb/ponto_audit2_21.dbf',
'/u01/oradata/nomedb/ponto_index_12.dbf',
'/u01/oradata/nomedb/ponto_audit2_22.dbf',
'/u01/oradata/nomedb/ponto_audit2_23.dbf',
'/u01/oradata/nomedb/data_DBSNMP_01.dbf',
'/u01/oradata/nomedb/ponto_audit2_24.dbf',
'/u01/oradata/nomedb/mxrhprc_data_02.ora',
'/u01/oradata/nomedb/ponto_audit2_25.dbf',
'/u01/oradata/nomedb/ponto_audit2_26.dbf',
'/u01/oradata/nomedb/ponto_index_13.dbf',
'/u01/oradata/nomedb/ponto_audit2_27.dbf',
'/u01/oradata/nomedb/ponto_index_14.dbf'
CHARACTER SET WE8ISO8859P1
;

9) No banco destino, sete o SID e execute um ‘STARTUP NOMOUNT;’

[orap01@hostnameNew ~]$ export ORACLE_SID=nomedb
[orap01@hostnameNew ~]$ sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.4.0 - Production on Wed Nov 7 21:18:35 2012

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

Connected to an idle instance.

SQL> startup nomount;
ORACLE instance started.

Total System Global Area 9663676416 bytes
Fixed Size 2099752 bytes
Variable Size 838862296 bytes
Database Buffers 8808038400 bytes
Redo Buffers 14675968 bytes

10) Execute o script create_controlfile.sql, criado no passo 8.

SQL> @create_control.sql

Control file created.

SQL>

11) Agora podemos executar o recover do banco. Nesse momento o banco irá solicitar os archives gerados entre o passo 2 e 6.
(digite AUTO para aplicar todos os archives gerados)

SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;
ORA-00279: change 108706819605 generated at 11/07/2012 19:14:31 needed for
thread 1
ORA-00289: suggestion :
/u01/oradata/nomedb/archive/arch_nomedb_180736_1_732761793.arc
ORA-00280: change 108706819605 for thread 1 is in sequence #180736
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
AUTO
ORA-00279: change 108706849918 generated at 11/07/2012 19:28:24 needed for
thread 1
ORA-00289: suggestion :
/u01/oradata/nomedb/archive/arch_nomedb_180737_1_732761793.arc
ORA-00280: change 108706849918 for thread 1 is in sequence #180737
ORA-00278: log file
'/u01/oradata/nomedb/archive/arch_nomedb_180736_1_732761793.arc' no longer
needed for this recovery

Quinze minutos depois… 🙂

12) Agora o banco pode ser aberto com a opção RESETLOGS:

SQL> ALTER DATABASE OPEN RESETLOGS;

13) Adicione tempfiles a tablespace temporária. Eles podem ser dimensionados conforme a necessidade:

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oradata/nomedb/temp01.dbf' SIZE 100M REUSE AUTOEXTEND OFF;

14) Caso necessário, altere o nome do banco:

21:35:20 nomedb> ALTER DATABASE RENAME global_name TO newbanco;
21:35:20 nomedb> SELECT * FROM global_name;

GLOBAL_NAME
-----------------------------------------
newbanco

Tudo isso ao som que segue:

É isso aí pessoal… cada um tem um jeito que acha melhor. Pessoalmente, acho esse o mais rápido, por não precisar fazer um restore via RMAN, apenas copiar de uma instance para a outra.

Devemos observar alguns detalhes como aumento do volume de geração de archives no período entre begin/end backup, assim como rotinas de backup de archives que possam limpar os mesmos.

Abraços!

Vitor Jr. – Infrastructure Team / Oracle 11g DBA Certified Professional – OCP /Oracle Certified Expert, Oracle Real Application Clusters 11g and Grid Infrastructure Administrator – OCE / Oracle Database 11g Performance Tuning Certified Expert – OCE / Oracle Exadata 11g Certified Implementation Specialist / Oracle Certified Associate, MySQL 5

&nbsp;