Para melhor visualização, recomendo resolução de no mínimo 1024 x 768 e navegador Mozilla Firefox

quarta-feira, 6 de julho de 2011

Clonando um banco de dados Oracle com o RMAN - DUPLICATE DATABASE

Olá,

Neste artigo irei demonstrar na prática como clonar um banco de dados Oracle no mesmo servidor através do comando DUPLICATE DATABASE do RMAN. Irei realizar alguns passos de forma a mostrar a clonagem com o uso de um backup previamente feito pelo RMAN que, aliás, é fundamental e obrigatório para realização da clonagem nas versões Oracle 10g e anteriores. Uma outra abordagem que farei, será a de mostrar os passos para a realização da clonagem sem a utilização de um backup através de um novo recurso do comando duplicate database no RMAN do Oracle 11g chamando de ACTIVE DATABASE. Para mostrar as duas abordagens, usarei o Oracle 11g Rel2 instalado em uma máquina sob o sistema operacional Windows. Já vou adiantando que a clonagem via o comando duplicate database pode ser feita em bancos que estejam operando nos modos NOARCHIVELOG ou ARCHIVELOG. No caso de bancos operando no modo NOARCHIVELOG, o banco de origem deverá estar no mínimo em estado MOUNT e a instância auxiliar deverá estar no estado NOMOUNT.

No primeiro cenário, irei clonar o banco de dados BD02 para TESTE. O primeiro passo é criar os diretórios necessários nos devidos locais de forma que eles possam ficar iguais aos diretórios do banco de dados de origem como admin\TESTE\adump e, no meu caso, oradata\TESTE. Nesta primeira abordagem irei realizar a clonagem utilizando um backup do banco de dados BD02 previamente realizado pelo RMAN como demonstrado abaixo. No caso, o banco de dados de origem BD02 está operando no modo ARCHIVELOG.
C:\>rman target /

Recovery Manager: Release 11.2.0.1.0 - Production on Qua Jul 6 20:33:30 2011

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

conectado ao banco de dados de destino: BD02 (DBID=2693065298)

RMAN> backup full database plus archivelog;

Iniciando backup em 06/07/11
log atual arquivado
usar o arquivo de controle do banco de dados de destino em vez do catálogo
canal alocado: ORA_DISK_1
canal ORA_DISK_1: SID=29 tipo de dispositivo=DISK
canal ORA_DISK_1: iniciando conjunto de backups de log arquivado
canal ORA_DISK_1: especificando log(s) arquivado no conjunto de backups
thread do log arquivado de entrada=1 sequência=16 RECID=1 STAMP=754598030
canal ORA_DISK_1: iniciando o componente 1 em 06/07/11
canal ORA_DISK_1: componente 1 finalizado em 06/07/11
handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD02\BACKUPSET\2011_07_06
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:00:01
Finalizado backup em 06/07/11

Iniciando backup em 06/07/11
utilizando o canal ORA_DISK_1
canal ORA_DISK_1: iniciando conjunto de backup completo de arquivo de dados
canal ORA_DISK_1: especificando arquivo[s] de dados no conjunto de backups
número do arquivo=00001 nome=E:\ORACLE\ORADATA\BD02\SYSTEM01.DBF
número do arquivo=00002 nome=E:\ORACLE\ORADATA\BD02\SYSAUX01.DBF
número do arquivo=00003 nome=E:\ORACLE\ORADATA\BD02\UNDOTBS01.DBF
número do arquivo=00004 nome=E:\ORACLE\ORADATA\BD02\USERS01.DBF
número do arquivo=00005 nome=E:\ORACLE\ORADATA\BD02\TBS01.DBF
número do arquivo=00006 nome=E:\ORACLE\ORADATA\BD02\TBS02.DBF
número do arquivo=00007 nome=E:\ORACLE\ORADATA\BD02\TBS03.DBF
canal ORA_DISK_1: iniciando o componente 1 em 06/07/11
canal ORA_DISK_1: componente 1 finalizado em 06/07/11
handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD02\BACKUPSET\2011_07_06
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:00:25
canal ORA_DISK_1: iniciando conjunto de backup completo de arquivo de dados
canal ORA_DISK_1: especificando arquivo[s] de dados no conjunto de backups
incluindo arquivo de controle atual no conjunto de backups
incluindo SPFILE atual do conjunto de backups
canal ORA_DISK_1: iniciando o componente 1 em 06/07/11
canal ORA_DISK_1: componente 1 finalizado em 06/07/11
handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD02\BACKUPSET\2011_07_06
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:00:01
Finalizado backup em 06/07/11

Iniciando backup em 06/07/11
log atual arquivado
utilizando o canal ORA_DISK_1
canal ORA_DISK_1: iniciando conjunto de backups de log arquivado
canal ORA_DISK_1: especificando log(s) arquivado no conjunto de backups
thread do log arquivado de entrada=1 sequência=17 RECID=2 STAMP=754598064
canal ORA_DISK_1: iniciando o componente 1 em 06/07/11
canal ORA_DISK_1: componente 1 finalizado em 06/07/11
handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD02\BACKUPSET\2011_07_06\
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:00:01
Finalizado backup em 06/07/11

Após a criação do backup pelo RMAN, irei conectar no banco de dados de origem e criar um arquivo de inicialização (pfile) na qual o editarei conforme exemplo a seguir.
C:\>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Qua Jul 6 20:35:47 2011

Copyright (c) 1982, 2010, Oracle. All rights reserved.

Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create pfile from spfile;

Arquivo criado.

Conteúdo do arquivo de inicialização após a edição
--------------------------------------------------

*.audit_file_dest='E:\oracle\admin\TESTE\adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='E:\oracle\oradata\TESTE\control01.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='TESTE'
*.db_recovery_file_dest='E:\oracle\flash_recovery_area'
*.db_recovery_file_dest_size=107374182400
*.diagnostic_dest='E:\oracle'
*.memory_target=320864256
*.nls_language='BRAZILIAN PORTUGUESE'
*.nls_territory='BRAZIL'
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
*.db_file_name_convert =('\oradata\BD02\','\oradata\TESTE\')
*.log_file_name_convert =('\oradata\BD02\','\oradata\TESTE\')

Após a criação do arquivo initTESTE.ora, sua edição e cópia para o local apropriado em %ORACLE_HOME%\database, irei criar um serviço no Windows para poder inicializar a instância em NOMOUNT como demonstrado abaixo:
C:\>oradim -new -sid TESTE -syspwd minhasenha
Instância criada.

C:\>set ORACLE_SID=TESTE

Após a criação do serviço, irei iniciar a instância em estado NOMOUNT. Neste ponto, essa será a minha instância auxiliar.
C:\>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Qua Jul 6 20:44:21 2011

Copyright (c) 1982, 2010, Oracle. All rights reserved.

Conectado a uma instância inativa.

SQL> startup nomount
Instância ORACLE iniciada.

Total System Global Area 322228224 bytes
Fixed Size 1374360 bytes
Variable Size 209717096 bytes
Database Buffers 104857600 bytes
Redo Buffers 6279168 bytes

Está tudo pronto para iniciarmos o processo de clonagem. Abaixo irei conectar na instância BD02. Para tanto, será necessário que tenha um serviço no arquivo TNSNAMES.ORA que aponte para a instância de origem BD02. Já que no prompt do DOS eu executei o comando set ORACLE_SID=TESTE, então no comando abaixo a parte auxiliary / irá se conectar na instância auxiliar TESTE.
C:\>rman target sys/manager@BD02 auxiliary /

Recovery Manager: Release 11.2.0.1.0 - Production on Qua Jul 6 21:08:20 2011

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

conectado ao banco de dados de destino: BD02 (DBID=2693065298)
conectado ao banco de dados auxiliar: TESTE (não montado)

Agora é só iniciar o processo de clonagem com o comando abaixo e o RMAN fará todo o trabalho para nós.

RMAN> duplicate target database to TESTE;

Iniciando Duplicate Db em 06/07/11
usar o arquivo de controle do banco de dados de destino em vez do catálogo
canal alocado: ORA_AUX_DISK_1
canal ORA_AUX_DISK_1: SID=19 tipo de dispositivo=DISK

conteúdo do Script de Memória:
{
sql clone "create spfile from memory";
}
executando Script de Memória

instrução sql: create spfile from memory

conteúdo do Script de Memória:
{
shutdown clone immediate;
startup clone nomount;
}
executando Script de Memória

encerramento de instância Oracle

conectado ao banco de dados auxiliar (não iniciado)
instância Oracle iniciada

Total da Área Global do Sistema 322228224 bytes

Fixed Size 1374360 bytes
Variable Size 218105704 bytes
Database Buffers 96468992 bytes
Redo Buffers 6279168 bytes

conteúdo do Script de Memória:
{
sql clone "alter system set db_name =
''BD02'' comment=
''Modified by RMAN duplicate'' scope=spfile";
sql clone "alter system set db_unique_name =
''TESTE'' comment=
''Modified by RMAN duplicate'' scope=spfile";
shutdown clone immediate;
startup clone force nomount
restore clone primary controlfile;
alter clone database mount;
}
executando Script de Memória

instrução sql: alter system set db_name = ''BD02''
comment= ''Modified by RMAN duplicate'' scope=spfile

instrução sql: alter system set db_unique_name = ''TESTE''
comment= ''Modified by RMAN duplicate'' scope=spfile

encerramento de instância Oracle

instância Oracle iniciada

Total da Área Global do Sistema 322228224 bytes

Fixed Size 1374360 bytes
Variable Size 218105704 bytes
Database Buffers 96468992 bytes
Redo Buffers 6279168 bytes

Iniciando restore em 06/07/11
canal alocado: ORA_AUX_DISK_1
canal ORA_AUX_DISK_1: SID=18 tipo de dispositivo=DISK

canal ORA_AUX_DISK_1: iniciando restauração de conjunto de backups
canal ORA_AUX_DISK_1: restaurando arquivo de controle
canal ORA_AUX_DISK_1: lendo backup E:\ORACLE\FLASH_RECOVERY_AREA\BD02\BACKUPSET
canal ORA_AUX_DISK_1: handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD02
canal ORA_AUX_DISK_1: restaurada a parte de backup 1
canal ORA_AUX_DISK_1: restauração concluída, tempo decorrido: 00:00:01
nome do arquivo de saída=E:\ORACLE\ORADATA\TESTE\CONTROL01.CTL
Finalizado restore em 06/07/11

banco de dados montado

conteúdo do Script de Memória:
{
set until scn 222488;
set newname for datafile 1 to
"E:\ORACLE\ORADATA\TESTE\SYSTEM01.DBF";
set newname for datafile 2 to
"E:\ORACLE\ORADATA\TESTE\SYSAUX01.DBF";
set newname for datafile 3 to
"E:\ORACLE\ORADATA\TESTE\UNDOTBS01.DBF";
set newname for datafile 4 to
"E:\ORACLE\ORADATA\TESTE\USERS01.DBF";
set newname for datafile 5 to
"E:\ORACLE\ORADATA\TESTE\TBS01.DBF";
set newname for datafile 6 to
"E:\ORACLE\ORADATA\TESTE\TBS02.DBF";
set newname for datafile 7 to
"E:\ORACLE\ORADATA\TESTE\TBS03.DBF";
restore
clone database
;
}
executando Script de Memória
executando comando: SET until clause

executando comando: SET NEWNAME
executando comando: SET NEWNAME
executando comando: SET NEWNAME
executando comando: SET NEWNAME
executando comando: SET NEWNAME
executando comando: SET NEWNAME
executando comando: SET NEWNAME

Iniciando restore em 06/07/11
utilizando o canal ORA_AUX_DISK_1

canal ORA_AUX_DISK_1: iniciando restauração de backups de arquivo de dados
canal ORA_AUX_DISK_1: especificando arquivo(s) para restauração
canal ORA_AUX_DISK_1: restaurando em E:\ORACLE\ORADATA\TESTE\SYSTEM01.DBF
canal ORA_AUX_DISK_1: restaurando em E:\ORACLE\ORADATA\TESTE\SYSAUX01.DBF
canal ORA_AUX_DISK_1: restaurando em E:\ORACLE\ORADATA\TESTE\UNDOTBS01.DBF
canal ORA_AUX_DISK_1: restaurando em E:\ORACLE\ORADATA\TESTE\USERS01.DBF
canal ORA_AUX_DISK_1: restaurando em E:\ORACLE\ORADATA\TESTE\TBS01.DBF
canal ORA_AUX_DISK_1: restaurando em E:\ORACLE\ORADATA\TESTE\TBS02.DBF
canal ORA_AUX_DISK_1: restaurando em E:\ORACLE\ORADATA\TESTE\TBS03.DBF
canal ORA_AUX_DISK_1: lendo backup E:\ORACLE\FLASH_RECOVERY_AREA\BD02\
canal ORA_AUX_DISK_1: handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD02\
canal ORA_AUX_DISK_1: restaurada a parte de backup 1
canal ORA_AUX_DISK_1: restauração concluída, tempo decorrido: 00:00:45
Finalizado restore em 06/07/11

conteúdo do Script de Memória:
{
switch clone datafile all;
}
executando Script de Memória

arquivo de dados 1 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE\SYSTEM01.DBF
arquivo de dados 2 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE\SYSAUX01.DBF
arquivo de dados 3 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE\UNDOTBS01.DBF
arquivo de dados 4 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE\USERS01.DBF
arquivo de dados 5 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE\TBS01.DBF
arquivo de dados 6 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE\TBS02.DBF
arquivo de dados 7 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE\TBS03.DBF

conteúdo do Script de Memória:
{
set until scn 222488;
recover
clone database
delete archivelog
;
}
executando Script de Memória

executando comando: SET until clause

Iniciando recover em 06/07/11
utilizando o canal ORA_AUX_DISK_1

iniciar recuperação de mídia

o log arquivado para thread 1 com sequência 17 já está no disco
recuperação da mídia concluída, tempo decorrido: 00:00:01
Finalizado recover em 06/07/11

conteúdo do Script de Memória:
{
shutdown clone immediate;
startup clone nomount;
sql clone "alter system set db_name =
''TESTE'' comment=
''Reset to original value by RMAN'' scope=spfile";
sql clone "alter system reset db_unique_name scope=spfile";
shutdown clone immediate;
startup clone nomount;
}
executando Script de Memória

banco de dados desmontado
encerramento de instância Oracle

conectado ao banco de dados auxiliar (não iniciado)
instância Oracle iniciada

Total da Área Global do Sistema 322228224 bytes

Fixed Size 1374360 bytes
Variable Size 218105704 bytes
Database Buffers 96468992 bytes
Redo Buffers 6279168 bytes

instrução sql: alter system set db_name = ''TESTE''
comment= ''Reset to original value by RMAN'' scope=spfile

instrução sql: alter system reset db_unique_name scope=spfile

encerramento de instância Oracle

conectado ao banco de dados auxiliar (não iniciado)
instância Oracle iniciada

Total da Área Global do Sistema 322228224 bytes

Fixed Size 1374360 bytes
Variable Size 218105704 bytes
Database Buffers 96468992 bytes
Redo Buffers 6279168 bytes

instrução: CREATE CONTROLFILE REUSE SET DATABASE "TESTE" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ( 'E:\ORACLE\ORADATA\TESTE\REDO01.LOG' ) SIZE 50 M REUSE,
GROUP 2 ( 'E:\ORACLE\ORADATA\TESTE\REDO02.LOG' ) SIZE 50 M REUSE,
GROUP 3 ( 'E:\ORACLE\ORADATA\TESTE\REDO03.LOG' ) SIZE 50 M REUSE
DATAFILE
'E:\ORACLE\ORADATA\TESTE\SYSTEM01.DBF'
CHARACTER SET WE8MSWIN1252


conteúdo do Script de Memória:
{
set newname for tempfile 1 to
"E:\ORACLE\ORADATA\TESTE\TEMP01.DBF";
switch clone tempfile all;
catalog clone datafilecopy "E:\ORACLE\ORADATA\TESTE\SYSAUX01.DBF",
"E:\ORACLE\ORADATA\TESTE\UNDOTBS01.DBF",
"E:\ORACLE\ORADATA\TESTE\USERS01.DBF",
"E:\ORACLE\ORADATA\TESTE\TBS01.DBF",
"E:\ORACLE\ORADATA\TESTE\TBS02.DBF",
"E:\ORACLE\ORADATA\TESTE\TBS03.DBF";
switch clone datafile all;
}
executando Script de Memória

executando comando: SET NEWNAME

arquivo temporário renomeado 1 para
E:\ORACLE\ORADATA\TESTE\TEMP01.DBF no arquivo de controle

cópia do arquivo de dados catalogado
nome do arquivo de cópia=E:\ORACLE\ORADATA\TESTE\SYSAUX01.DBF
cópia do arquivo de dados catalogado
nome do arquivo de cópia=E:\ORACLE\ORADATA\TESTE\UNDOTBS01.DBF
cópia do arquivo de dados catalogado
nome do arquivo de cópia=E:\ORACLE\ORADATA\TESTE\USERS01.DBF
cópia do arquivo de dados catalogado
nome do arquivo de cópia=E:\ORACLE\ORADATA\TESTE\TBS01.DBF
cópia do arquivo de dados catalogado
nome do arquivo de cópia=E:\ORACLE\ORADATA\TESTE\TBS02.DBF
cópia do arquivo de dados catalogado
nome do arquivo de cópia=E:\ORACLE\ORADATA\TESTE\TBS03.DBF

arquivo de dados 2 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE\SYSAUX01.DBF
arquivo de dados 3 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE\UNDOTBS01.DBF
arquivo de dados 4 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE\USERS01.DBF
arquivo de dados 5 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE\TBS01.DBF
arquivo de dados 6 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE\TBS02.DBF
arquivo de dados 7 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE\TBS03.DBF

conteúdo do Script de Memória:
{
Alter clone database open resetlogs;
}
executando Script de Memória

banco de dados aberto
Finalizado Duplicate Db em 06/07/11

Pronto. A clonagem foi realizada e poderemos conectar no banco de dados TESTE como demonstrado abaixo.
C:\>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Qua Jul 6 21:16:54 2011

Copyright (c) 1982, 2010, Oracle. All rights reserved.

Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select open_mode,name,created from v$database;

OPEN_MODE NAME CREATED
-------------------- --------------------- ----------
READ WRITE TESTE 06/07/2011

SQL> select file_name from dba_data_files;

FILE_NAME
------------------------------------------------
E:\ORACLE\ORADATA\TESTE\SYSTEM01.DBF
E:\ORACLE\ORADATA\TESTE\SYSAUX01.DBF
E:\ORACLE\ORADATA\TESTE\UNDOTBS01.DBF
E:\ORACLE\ORADATA\TESTE\USERS01.DBF
E:\ORACLE\ORADATA\TESTE\TBS01.DBF
E:\ORACLE\ORADATA\TESTE\TBS02.DBF
E:\ORACLE\ORADATA\TESTE\TBS03.DBF

7 linhas selecionadas.

SQL> select file_name from dba_temp_files;

FILE_NAME
------------------------------------------------
E:\ORACLE\ORADATA\TESTE\TEMP01.DBF

A próxima abordagem será demonstrar a clonagem sem que seja necessário a realização prévia de um backup. Isto só é possível utilizando o Oracle 11g. Neste caso, irei clonar novamente o banco de dados BD02 só que agora como TESTE2. Após a criação dos diretórios necessários, irei realizar a modificação no arquivo de inicialização (pfile) gerado da mesma forma com fiz na primeira abordagem:
Conteúdo do arquivo de inicialização após a edição
--------------------------------------------------

*.audit_file_dest='E:\oracle\admin\TESTE2\adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='E:\oracle\oradata\TESTE2\control01.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='TESTE2'
*.db_recovery_file_dest='E:\oracle\flash_recovery_area'
*.db_recovery_file_dest_size=107374182400
*.diagnostic_dest='E:\oracle'
*.memory_target=320864256
*.nls_language='BRAZILIAN PORTUGUESE'
*.nls_territory='BRAZIL'
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
*.db_file_name_convert =('\oradata\BD02\','\oradata\TESTE2\')
*.log_file_name_convert =('\oradata\BD02\','\oradata\TESTE2\')

Diferente da primeira abordagem, precisaremos editar o arquivo LISTENER.ORA de forma a registrar a instância clone conforme demonstrado abaixo:
Conteúdo do arquivo listener.ora
--------------------------------

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = E:\oracle\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = TESTE2)
(ORACLE_HOME = E:\oracle\product\11.2.0\dbhome_1)
(SID_NAME = TESTE2)
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = micro)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)

ADR_BASE_LISTENER = E:\oracle

Precisaremos também adicionar um serviço no arquivo TNSNAMES.ORA para a instância TESTE2 conforme o exemplo abaixo:
Conteúdo do arquivo tnsnames.ora
--------------------------------

TESTE2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = micro)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = TESTE2)
)
)

Após realizados os passos acima, irei criar um serviço no Windows da mesma forma que foi realizada na primeira abordagem, afim de poder inicializar a instância TESTE2 (auxiliar) em NOMOUNT. Precisaremos também criar um arquivo de senha.
C:\>oradim -new -sid TESTE2 -syspwd minhasenha
Instância criada.

C:\>orapwd file=E:\oracle\product\11.2.0\dbhome_1\database\pwdTESTE2.ora
password=minhasenha

Pronto. Agora já poderemos inicializar a instância TESTE2 em NOMOUNT como demonstrado abaixo:
C:\>set ORACLE_SID=TESTE2

C:\>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Qua Jul 6 21:25:37 2011

Copyright (c) 1982, 2010, Oracle. All rights reserved.

Conectado a uma instância inativa.

SQL> startup nomount
Instância ORACLE iniciada.

Total System Global Area 322228224 bytes
Fixed Size 1374360 bytes
Variable Size 209717096 bytes
Database Buffers 104857600 bytes
Redo Buffers 6279168 bytes

Através do comando abaixo, poderemos no conectar na instância de origem BD02 e na instância auxiliar TESTE2 para dar início à clonagem de forma online.
C:\>rman target sys/manager@BD02 auxiliary sys/minhasenha@TESTE2

Recovery Manager: Release 11.2.0.1.0 - Production on Qua Jul 6 21:36:59 2011

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

conectado ao banco de dados de destino: BD02 (DBID=2693065298)
conectado ao banco de dados auxiliar: TESTE2 (não montado)

Agora é só iniciar o processo de clonagem utilizando a cláusula from active database do comando DUPLICATE abaixo, e o RMAN fará todo o trabalho para nós de forma online sem a necessidade de utilização de um backup realizado previamente.

RMAN> duplicate target database to TESTE2 from active database;

Iniciando Duplicate Db em 06/07/11
usar o arquivo de controle do banco de dados de destino em vez do catálogo
canal alocado: ORA_AUX_DISK_1
canal ORA_AUX_DISK_1: SID=19 tipo de dispositivo=DISK

conteúdo do Script de Memória:
{
sql clone "create spfile from memory";
}
executando Script de Memória

instrução sql: create spfile from memory

conteúdo do Script de Memória:
{
shutdown clone immediate;
startup clone nomount;
}
executando Script de Memória

encerramento de instância Oracle

conectado ao banco de dados auxiliar (não iniciado)
instância Oracle iniciada

Total da Área Global do Sistema 322228224 bytes

Fixed Size 1374360 bytes
Variable Size 218105704 bytes
Database Buffers 96468992 bytes
Redo Buffers 6279168 bytes

conteúdo do Script de Memória:
{
sql clone "alter system set db_name =
''BD02'' comment=
''Modified by RMAN duplicate'' scope=spfile";
sql clone "alter system set db_unique_name =
''TESTE2'' comment=
''Modified by RMAN duplicate'' scope=spfile";
shutdown clone immediate;
startup clone force nomount
backup as copy current controlfile auxiliary format
'E:\ORACLE\ORADATA\TESTE2\CONTROL01.CTL';
alter clone database mount;
}
executando Script de Memória

instrução sql: alter system set db_name = ''BD02''
comment= ''Modified by RMAN duplicate'' scope=spfile

instrução sql: alter system set db_unique_name = ''TESTE2''
comment= ''Modified by RMAN duplicate'' scope=spfile

encerramento de instância Oracle

instância Oracle iniciada

Total da Área Global do Sistema 322228224 bytes

Fixed Size 1374360 bytes
Variable Size 218105704 bytes
Database Buffers 96468992 bytes
Redo Buffers 6279168 bytes

Iniciando backup em 06/07/11
canal alocado: ORA_DISK_1
canal ORA_DISK_1: SID=37 tipo de dispositivo=DISK
canal ORA_DISK_1: iniciando cópia de arquivo de dados
copiando arquivo de controle atual
nome do arquivo=E:\ORACLE\PRODUCT\11.2.0\DBHOME_1\DATABASE\SNCFBD02.ORA
canal ORA_DISK_1: cópia de arquivo de dados concluída; decorrido: 00:00:03
Finalizado backup em 06/07/11

banco de dados montado

conteúdo do Script de Memória:
{
set newname for datafile 1 to
"E:\ORACLE\ORADATA\TESTE2\SYSTEM01.DBF";
set newname for datafile 2 to
"E:\ORACLE\ORADATA\TESTE2\SYSAUX01.DBF";
set newname for datafile 3 to
"E:\ORACLE\ORADATA\TESTE2\UNDOTBS01.DBF";
set newname for datafile 4 to
"E:\ORACLE\ORADATA\TESTE2\USERS01.DBF";
set newname for datafile 5 to
"E:\ORACLE\ORADATA\TESTE2\TBS01.DBF";
set newname for datafile 6 to
"E:\ORACLE\ORADATA\TESTE2\TBS02.DBF";
set newname for datafile 7 to
"E:\ORACLE\ORADATA\TESTE2\TBS03.DBF";
backup as copy reuse
datafile 1 auxiliary format
"E:\ORACLE\ORADATA\TESTE2\SYSTEM01.DBF" datafile
2 auxiliary format
"E:\ORACLE\ORADATA\TESTE2\SYSAUX01.DBF" datafile
3 auxiliary format
"E:\ORACLE\ORADATA\TESTE2\UNDOTBS01.DBF" datafile
4 auxiliary format
"E:\ORACLE\ORADATA\TESTE2\USERS01.DBF" datafile
5 auxiliary format
"E:\ORACLE\ORADATA\TESTE2\TBS01.DBF" datafile
6 auxiliary format
"E:\ORACLE\ORADATA\TESTE2\TBS02.DBF" datafile
7 auxiliary format
"E:\ORACLE\ORADATA\TESTE2\TBS03.DBF";
sql 'alter system archive log current';
}
executando Script de Memória

executando comando: SET NEWNAME
executando comando: SET NEWNAME
executando comando: SET NEWNAME
executando comando: SET NEWNAME
executando comando: SET NEWNAME
executando comando: SET NEWNAME
executando comando: SET NEWNAME

Iniciando backup em 06/07/11
utilizando o canal ORA_DISK_1
canal ORA_DISK_1: iniciando cópia de arquivo de dados
nome=E:\ORACLE\ORADATA\BD02\SYSTEM01.DBF do arquivo de dados de entrada
nome do arquivo de saída=E:\ORACLE\ORADATA\TESTE2\SYSTEM01.DBF
canal ORA_DISK_1: cópia de arquivo de dados concluída; decorrido: 00:01:15
canal ORA_DISK_1: iniciando cópia de arquivo de dados
número do arquivo=00002 nome=E:\ORACLE\ORADATA\BD02\SYSAUX01.DBF
nome do arquivo de saída=E:\ORACLE\ORADATA\TESTE2\SYSAUX01.DBF
canal ORA_DISK_1: cópia de arquivo de dados concluída; decorrido: 00:00:55
canal ORA_DISK_1: iniciando cópia de arquivo de dados
número do arquivo=00003 nome=E:\ORACLE\ORADATA\BD02\UNDOTBS01.DBF
nome do arquivo de saída=E:\ORACLE\ORADATA\TESTE2\UNDOTBS01.DBF
canal ORA_DISK_1: cópia de arquivo de dados concluída; decorrido: 00:00:25
canal ORA_DISK_1: iniciando cópia de arquivo de dados
número do arquivo=00004 nome=E:\ORACLE\ORADATA\BD02\USERS01.DBF
nome do arquivo de saída=E:\ORACLE\ORADATA\TESTE2\USERS01.DBF
canal ORA_DISK_1: cópia de arquivo de dados concluída; decorrido: 00:00:04
canal ORA_DISK_1: iniciando cópia de arquivo de dados
número do arquivo=00005 nome=E:\ORACLE\ORADATA\BD02\TBS01.DBF
nome do arquivo de saída=E:\ORACLE\ORADATA\TESTE2\TBS01.DBF
canal ORA_DISK_1: cópia de arquivo de dados concluída; decorrido: 00:00:03
canal ORA_DISK_1: iniciando cópia de arquivo de dados
número do arquivo=00006 nome=E:\ORACLE\ORADATA\BD02\TBS02.DBF
nome do arquivo de saída=E:\ORACLE\ORADATA\TESTE2\TBS02.DBF
canal ORA_DISK_1: cópia de arquivo de dados concluída; decorrido: 00:00:03
canal ORA_DISK_1: iniciando cópia de arquivo de dados
número do arquivo=00007 nome=E:\ORACLE\ORADATA\BD02\TBS03.DBF
nome do arquivo de saída=E:\ORACLE\ORADATA\TESTE2\TBS03.DBF
canal ORA_DISK_1: cópia de arquivo de dados concluída; decorrido: 00:00:03
Finalizado backup em 06/07/11

instrução sql: alter system archive log current

conteúdo do Script de Memória:
{
backup as copy reuse
archivelog like "E:\ORACLE\FLASH_RECOVERY_AREA\BD02\ARCHIVELOG\2011_07_06\
O1_MF_1_18_707LDYHN_.ARC" auxiliary format
E:\ORACLE\FLASH_RECOVERY_AREA\TESTE2\ARCHIVELOG\2011_07_06\O1_MF_1_18_%U_.ARC;
catalog clone recovery area;
switch clone datafile all;
}
executando Script de Memória

Iniciando backup em 06/07/11
utilizando o canal ORA_DISK_1
canal ORA_DISK_1: iniciando cópia de log arquivado
thread do log arquivado de entrada=1 sequência=18 RECID=3 STAMP=754604271
nome do arquivo de saída=E:\ORACLE\FLASH_RECOVERY_AREA\TESTE2\ARCHIVELOG\
canal ORA_DISK_1: cópia de log arquivado concluída, decorrido: 00:00:01
Finalizado backup em 06/07/11

procurando todos os arquivos na área de recuperação

Lista de Arquivos Desconhecidos para o Banco de Dados
=====================================================
Nome do Arquivo: E:\ORACLE\FLASH_RECOVERY_AREA\TESTE2\ARCHIVELOG\2011_07_06\
O1_MF_1_18_ARCH_D-BD02_ID-2693065298_S-18_T-1_A-752966866_0FMFKM7G_.ARC
catalogando arquivos...
catalogação concluída

Lista de Arquivos Catalogados
=============================
Nome do Arquivo: E:\ORACLE\FLASH_RECOVERY_AREA\TESTE2\ARCHIVELOG\2011_07_06\
O1_MF_1_18_ARCH_D-BD02_ID-2693065298_S-18_T-1_A-752966866_0FMFKM7G_.ARC

arquivo de dados 1 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE2\SYSTEM01.DBF
arquivo de dados 2 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE2\SYSAUX01.DBF
arquivo de dados 3 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE2\UNDOTBS01.DBF
arquivo de dados 4 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE2\USERS01.DBF
arquivo de dados 5 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE2\TBS01.DBF
arquivo de dados 6 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE2\TBS02.DBF
arquivo de dados 7 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE2\TBS03.DBF

conteúdo do Script de Memória:
{
set until scn 226711;
recover
clone database
delete archivelog
;
}
executando Script de Memória

executando comando: SET until clause

Iniciando recover em 06/07/11
canal alocado: ORA_AUX_DISK_1
canal ORA_AUX_DISK_1: SID=21 tipo de dispositivo=DISK

iniciar recuperação de mídia

o log arquivado para thread 1 com sequência 18 já está no disco
nome do arquivo de log =E:\ORACLE\FLASH_RECOVERY_AREA\TESTE2\ARCHIVELOG\

recuperação da mídia concluída, tempo decorrido: 00:00:03
Finalizado recover em 06/07/11

conteúdo do Script de Memória:
{
shutdown clone immediate;
startup clone nomount;
sql clone "alter system set db_name =
''TESTE2'' comment=
''Reset to original value by RMAN'' scope=spfile";
sql clone "alter system reset db_unique_name scope=spfile";
shutdown clone immediate;
startup clone nomount;
}
executando Script de Memória

banco de dados desmontado
encerramento de instância Oracle

conectado ao banco de dados auxiliar (não iniciado)
instância Oracle iniciada

Total da Área Global do Sistema 322228224 bytes

Fixed Size 1374360 bytes
Variable Size 218105704 bytes
Database Buffers 96468992 bytes
Redo Buffers 6279168 bytes

instrução sql: alter system set db_name = ''TESTE2''
comment= ''Reset to original value by RMAN'' scope=spfile

instrução sql: alter system reset db_unique_name scope=spfile

encerramento de instância Oracle

conectado ao banco de dados auxiliar (não iniciado)
instância Oracle iniciada

Total da Área Global do Sistema 322228224 bytes

Fixed Size 1374360 bytes
Variable Size 218105704 bytes
Database Buffers 96468992 bytes
Redo Buffers 6279168 bytes

instrução: CREATE CONTROLFILE REUSE SET DATABASE "TESTE2" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ( 'E:\ORACLE\ORADATA\TESTE2\REDO01.LOG' ) SIZE 50 M REUSE,
GROUP 2 ( 'E:\ORACLE\ORADATA\TESTE2\REDO02.LOG' ) SIZE 50 M REUSE,
GROUP 3 ( 'E:\ORACLE\ORADATA\TESTE2\REDO03.LOG' ) SIZE 50 M REUSE
DATAFILE
'E:\ORACLE\ORADATA\TESTE2\SYSTEM01.DBF'
CHARACTER SET WE8MSWIN1252


conteúdo do Script de Memória:
{
set newname for tempfile 1 to
"E:\ORACLE\ORADATA\TESTE2\TEMP01.DBF";
switch clone tempfile all;
catalog clone datafilecopy "E:\ORACLE\ORADATA\TESTE2\SYSAUX01.DBF",
"E:\ORACLE\ORADATA\TESTE2\UNDOTBS01.DBF",
"E:\ORACLE\ORADATA\TESTE2\USERS01.DBF",
"E:\ORACLE\ORADATA\TESTE2\TBS01.DBF",
"E:\ORACLE\ORADATA\TESTE2\TBS02.DBF",
"E:\ORACLE\ORADATA\TESTE2\TBS03.DBF";
switch clone datafile all;
}
executando Script de Memória

executando comando: SET NEWNAME

arquivo temporário renomeado 1 para E:\ORACLE\ORADATA\TESTE2\TEMP01.DBF

cópia do arquivo de dados catalogado
nome do arquivo de cópia=E:\ORACLE\ORADATA\TESTE2\SYSAUX01.DBF
cópia do arquivo de dados catalogado
nome do arquivo de cópia=E:\ORACLE\ORADATA\TESTE2\UNDOTBS01.DBF
cópia do arquivo de dados catalogado
nome do arquivo de cópia=E:\ORACLE\ORADATA\TESTE2\USERS01.DBF
cópia do arquivo de dados catalogado
nome do arquivo de cópia=E:\ORACLE\ORADATA\TESTE2\TBS01.DBF
cópia do arquivo de dados catalogado
nome do arquivo de cópia=E:\ORACLE\ORADATA\TESTE2\TBS02.DBF
cópia do arquivo de dados catalogado
nome do arquivo de cópia=E:\ORACLE\ORADATA\TESTE2\TBS03.DBF

arquivo de dados 2 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE2\SYSAUX01.DBF
arquivo de dados 3 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE2\UNDOTBS01.DBF
arquivo de dados 4 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE2\USERS01.DBF
arquivo de dados 5 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE2\TBS01.DBF
arquivo de dados 6 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE2\TBS02.DBF
arquivo de dados 7 alternado para a cópia do arquivo de dados
cópia do arquivo de dados file name=E:\ORACLE\ORADATA\TESTE2\TBS03.DBF

conteúdo do Script de Memória:
{
Alter clone database open resetlogs;
}
executando Script de Memória

banco de dados aberto
Finalizado Duplicate Db em 06/07/11

Pronto. A clonagem foi realizada de forma online e poderemos conectar no banco de dados TESTE2 como demonstrado abaixo.
C:\>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Qua Jul 6 21:47:54 2011

Copyright (c) 1982, 2010, Oracle. All rights reserved.

Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select open_mode,name,created from v$database;

OPEN_MODE NAME CREATED
-------------------- --------------------- ----------
READ WRITE TESTE2 06/07/2011

SQL> select file_name from dba_data_files;

FILE_NAME
------------------------------------------------
E:\ORACLE\ORADATA\TESTE2\SYSTEM01.DBF
E:\ORACLE\ORADATA\TESTE2\SYSAUX01.DBF
E:\ORACLE\ORADATA\TESTE2\UNDOTBS01.DBF
E:\ORACLE\ORADATA\TESTE2\USERS01.DBF
E:\ORACLE\ORADATA\TESTE2\TBS01.DBF
E:\ORACLE\ORADATA\TESTE2\TBS02.DBF
E:\ORACLE\ORADATA\TESTE2\TBS03.DBF

7 linhas selecionadas.

SQL> select file_name from dba_temp_files;

FILE_NAME
------------------------------------------------
E:\ORACLE\ORADATA\TESTE2\TEMP01.DBF

7 comentários:

Leonardo Rezende disse...

Parabéns pelo artigo Eduardo.

Fiquei com algumas dúvidas... Esse novo recurso do 11g(clone online) pode ser feito em máquina diferentes? Hoje eu faço um DUPLICATE DATABASE em máquina diferentes, mantendo/sincronizado a mesma estrutura de diretórios do backup. O problema hoje é que eu atualizo diariamente essa cópia e restauro o banco completo. Gostaria de poder fazer isso gerando um incremental da produção para aplicar no TESTE. Alguma sugestão?

Eduardo Legatti disse...

Olá Leonardo,

O Duplicate active database pode ser utilizado para clonagem remota também. Você poderá checar a documentação oficial para maiores detalhes. Quanto ao seu problema, de forma incremental eu acho difícil. Tem que ver quao é relamente o objetivo do clone. Acredito que otruque está nos archivelogs gerados. Você teria que pensar em algo como o CLONE ser um STANDBY (em alguma parte do dia/ da noite) para ir aplicandos os archive que viria do PRIMÁRIO. É algo a se pensar... ;-) Boa sorte!

Abraços e até mais ...

Loraine disse...

Olá Eduardo, como vai? Tenho aprendido várias coisas no blog. A forma como escreve é muito clara. Parabéns! Gostaria de aproveitar para tirar uma dúvida de uma situação muito estranha que aconteceu no mês passado. O usuário executou vários deletes e updates em uma tela de uma aplicação em Delphi (16 operações ao todo). Depois entrou numa outra tela e imprimiu o relatório correspondente, ou seja, as operações tinham sido salvas no banco. Mas, um tempo depois foi consultá-las e elas haviam sumido.
Bom, pesquisamos pelo logminer e vimos que as 16 operações apareciam numa mesma transação (mesmo XID) e, ao final da décima sexta, foram todas desfeitas (rollback=1). Mas o usuário havia impresso o relatório, o que confirma que as operações foram salvas. Você já viu algo semelhante? Tem dois pontos nessa situação que me intrigam: Primeiro, que o commit foi feito pelo Delphi e segundo que cada operação deveria ser uma transação, pois na tela do delphi é executado um post(save) a cada operação. Não consigo entender por que no logminer consta como se as 16 operações fossem de uma única transação e muito menos por que foi feito esse rollback e as transações foram perdidas. Se souber me dar uma dica, agradeço. Abraços, Loraine

Eduardo Legatti disse...

Olá Loraine,

Tudo bem que a sua dúvida não tem nada a ver com o post em questão ;-) Bom, pelo que me lembro, um simples TDataset.post não era suficiente para comitar uma transação, a não ser que a aplicação fosse fechada. Por isso não tenha tanta certeza de que realmente um commit foi feito. Na época utilizava muito o artifício de "cache update" dos componentes TQuery/TTable e após abrir uma transação com o TDatabase.StartTransaction, chamava os métodos applyUpdates e commitUpdates e ao final TDatabase.commit. Lembre-se que TDataset.post não significa commit a não ser que você explicitamente chame o método TDatabase.commit. Uma coisa é certa, o relatório funcionou porque a transação e os dados estavam visíveis na sessão corrente. Já o que levou a acontecer o Rollback da transação eu não sei. A aplicação deu algum crash?? Teria que ter sido feito um teste abrindo a aplicação em uma outra estação e tirar o relatório de lá, aí teríamos certeza de que a transação foi comitada. O Logminer mostrou que a transação não foi comitada e isto é fato. Algum dia você faz o teste. Abra a aplicação, salve os dados, e depois desligue a máquina (a quente mesmo) sem sair da aplicação. Depois verifique se os dados realmente foram gravados no banco. No mais, deve-se avaliar a lógica da aplicação na questão de abertura e fechamento das transações para ver se realmente está tudo Ok. Outra coisa é, quem garante que os dados não foram apagados após a impressão do relatório?

Abraços e até mais ...

Loraine disse...

Olá Eduardo, obrigada pela sua resposta e desculpa eu ter entrado com esse assunto que nada tinha a ver com o seu post, mas é que não encontrei um post sobre o logminer. Bom, isso que você disse só reforça a nossa resposta de que a transação não foi comitada no Banco de Dados. estava com medo que pudesse ser algum bug do Oracle, mas pelo visto o pessoal está pensando que comitou as transações no Banco e isso não está sendo feito. Muito obrigada. Att.

Eduardo Legatti disse...

Olá Loraine,

Foi um prazer ajudá-la ;-)

Abraços e até mais ...

Rodrigo Santana disse...

Olá Eduardo, tudo bem?
Parabéns pelo artigo, realmente essa nova feature do 11g é muito interessante, legal a abordagem. :)
Um abraço!

Postagens populares

 
BlogBlogs.Com.Br