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.
RMAN DUPLICATE (usando backup)
RMAN DUPLICATE (usando backup)
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 no estado NOMOUNT como demonstrado abaixo:
C:\>oradim -new -sid TESTE -syspwd minhasenha
Instância criada.
C:\>set ORACLE_SID=TESTE
Realizada a criação do serviço, irei iniciar a instância no estado NOMOUNT. Neste ponto, esta 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
RMAN DUPLICATE (Usando o Active Database)
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 como fiz na primeira abordagem:
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 como 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, de forma a poder inicializar a instância TESTE2 (auxiliar) no estado NOMOUNT. Precisaremos também criar um arquivo de senha como demonstrado a seguir.
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á poderei inicializar a instância TESTE2 no estado 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, realizarei a conexão com a instância de origem BD02 e com a 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
45 comentários:
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?
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 ...
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
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 ...
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.
Olá Loraine,
Foi um prazer ajudá-la ;-)
Abraços e até mais ...
Olá Eduardo, tudo bem?
Parabéns pelo artigo, realmente essa nova feature do 11g é muito interessante, legal a abordagem. :)
Um abraço!
Valeu Eduardo, me ajudou de mais este post.
O duplicate de forma ativa, causa algum impacto no banco de origem (banco que está sendo clonado)?
Olá Everaldo,
O único impacto que vejo está relacionado ao processo de cópia/envio dos datafiles para o banco clone. Se o banco de dados clone estiver em uma máquina remota, então haverá um consumo maior de banda de rede no momento da cópia.
Obrigado pela visita e até mais...
Legatti
Legatti, parabéns pelo artigo!! Excelente. Ficou uma dúvida. O banco de dados clone ficará exatamente igual ao banco de dados de origem?
Obrigado
Marcelo
Olá Marcelo,
Ótima pergunta. O RMAN duplicate nada mais faz do que um "incomplete recovery", ou seja, os arquivos de redo log online não são copiados como parte do processo de clonagem. Segundo a documentação, o archive log mais recente será aplicado no banco clone.
Abraços e até mais...
Legatti
Mais uma dúvida, há muita diferença de duplicar um banco rac com asm para single files system? versao 11.1.0.7
Olá Everaldo,
Os passos são semelhantes. Os parâmetros db_file_name_convert e log_file_name_convert deverão ser utilizados para indicar a localização de destino dos data files, redo log files do banco clone (seja ele ASM ou file system). Ao criar o arquivo de inicialização da instância auxiliar, lembrar de comentar ou retirar os parâmetros relacionados à instância RAC.
Caso você tenha acesso ao My Oracle Support (Metalink), existem alguns artigos relacionados a esse tema. Notes 382669.1 e 840647.1
Abraços
Legatti
Eduardo, boa tarde tudo bem?
Seu blog tem me ajudado muito, tenho aprendido muito com ele, parabens.
Tentei simular esse artigo para teste em um banco 10g, até o momento do duplicate target database to teste foi blz, porém ao executar esse comando deu o erro abaixo para todos os datafiles:
[oracle@vm]~/oradata> rman target sys/*****@orcl auxiliary /
connected to target database: ORCL (DBID=1347688869)
connected to auxiliary database: TESTE (not mounted)
RMAN-05001: auxiliary filename /u01/app/oracle/oradata/orcl/example01.dbf conflicts with a file used by the target database
O que devo ter feito de errado?
Obrigado.
Abraços!
Renan
Olá Renan,
Verifique se você setou corretamente os parâmetros db_file_name_convert e log_file_name_convert. Bom, dependendo de algumas tentativas mal sucedidas, a instância auxiliar pode ter continuado em uso. Ao realizar os procedimentos, certifique-se de não deixar vestígios da tentativa mal sucedida realizada anteriormente.
Abraços
Legatti
Legatti,
Grato pelo retorno, limpei tudo que ele criou na pasta admin/ do banco teste, abaixo segue meu arquivo de parametro, ja vi, revi e não consegui identificar onde esta a falha.
orcl.__db_cache_size=427819008
orcl.__java_pool_size=4194304
orcl.__large_pool_size=4194304
orcl.__shared_pool_size=167772160
orcl.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/teste/adump'
*.background_dump_dest='/u01/app/oracle/admin/teste/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/teste/control01.ctl','/u01/app/oracle/oradata/teste/control02.ctl','/u01/app/oracle/oradata/teste/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/teste/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='teste'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.job_queue_processes=10
*.log_archive_dest_1='location=/u01/app/oracle/flash_recovery_area/ORCL'
*.open_cursors=300
*.pga_aggregate_target=201326592
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=605028352
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/teste/udump'
*.db_file_name_convert =('\oradata\orcl\','\oradata\teste\')
*.log_file_name_convert =('\oradata\orcl\','\oradata\teste\')
Grato
Renan
Olá Renan,
Você está usando o Linux, certo? Faça a alteração:
de
*.db_file_name_convert =('\oradata\orcl\','\oradata\teste\')
*.log_file_name_convert =('\oradata\orcl\','\oradata\teste\')
para
*.db_file_name_convert =('/oradata/orcl/','/oradata/teste/')
*.log_file_name_convert =('/oradata/orcl/','/oradata/teste/')
e faça o teste novamente ;-)
Abraços
Legatti
renan utilize o set newname.
run {
set newname for tempfile 1 to '/oradata/clone/temp01.dbf';
set newname for tempfile 2 to '/oradata/clone/temp02.dbf';
set newname for tempfile 3 to '/oradata/clone/temp03.dbf';
set newname for tempfile 4 to '/oradata/clone/temp04.dbf';
set newname for tempfile 5 to '/oradata/clone/temp05.dbf';
set newname for tempfile 6 to '/oradata/clone/temp06.dbf';
set newname for tempfile 7 to '/oradata/clone/temp07.dbf';
duplicate target database to clone;
}
Olá Everaldo,
A idéia que o DUPLICATE faça isso pra nós ;-)
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
;
}
Abraços e até mais ...
Legatti
Pois eh Legatti, até eu receber esse erro. tava usando a 11.1.7 , coloquei este comando e ta rolando até agora e lá se vão 5 horas, pelo menos passou deste erro. abraço.
Legatti,
Estou usando linux sim, putz que vacilo meu, copiei do seu artigo e esqueci de alterar a /, aff.
Isso porque li e reli umas 4x o arquivo de parametro.
Obrigado pela ajuda e desculpa pela falha.
Everaldo,
Obrigado pela ajuda, funcionou alterando as \ para /.
Renan
Olá Everaldo,
Se você está clonando o banco em outro servidor e quer manter a mesma estrutura, você tem que usar a cláusula NOFILENAMECHECK.
Veja a documentação do DUPLICATE:
"If you want the duplicate filenames to be the same as the target filenames, and if the databases are in different hosts, then you must specify NOFILENAMECHECK."
Abraços e até mais
Legatti
Legatti,
Caso meu banco de origem esteja em modo NOARCHIVELOG não consigo fazer o DUPLICATE DATABASE com ele OPEN? Terei que deixar em MOUNT?
Grato
Renan
Obrigado.
abraço
Olá Renan,
No caso do banco de dados estar operando no modo NOARCHIVELOG, para o duplicate (ACTIVE 11g) funcionar, o mesmo precisa estar no mínimo em MOUNT. Se não for usar a opção ACTIVE do 11g, então se não me engano, tanto faz.
Abraços
Legatti
Legatti, fiz alguns clonagens, mas porem alguns funcionam , outros nao. os q nao funcionam, me retornam o erro: ORA-01547: advertência: RECOVER obteve êxito mas OPEN RESETLOGS obteria erro abaixo
ORA-01194: o arquivo 1 necessita de mais recuperação para ser consistente
ORA-01110: 1 do arquivo de dados: '/oradata/orcl/system.213.87171'. e tb o erro
RMAN-06560: ADVERTÊNCIA: o conjunto de backup com a chave 4870 será lido 2 vezes
RMAN-06560: ADVERTÊNCIA: o conjunto de backup com a chave 4869 será lido 2 vezes
RMAN-06560: ADVERTÊNCIA: o conjunto de backup com a chave 4868 será lido 2 vezes
RMAN-06560: ADVERTÊNCIA: o conjunto de backup com a chave 4867 será lido 2 vezes
RMAN-06560: ADVERTÊNCIA: o conjunto de backup com a chave 4872 será lido 2 vezes. porém ha espaço em disco e utilizo o duplicate usando backup ful do banco de dados feito pelo rman, sem especificar uma hora para que ele abra o banco de dados.
poderia ajudar?
Olá Anônimo,
Os backup estão válidos? Já tentou fazer um novo backup antes de realizar o DUPLICATE? O erro é RMAN-06560 é muito genérico.
Cause: This message should be followed by one or more 6562 messages.
Action: Check the accompanying messages.
Please add more information about this Error
Portanto, tente analisar as mensagens com atenção e tente verificar o que possa estar acontecendo.
Abraços
Legatti
qual a diferença de usar o duplicate conectando no banco target, no catalogo e depois na auxiliar ao invés do catálogo? ao
invés de conectar somente no target e auxiliar?
ex: rman TARGET sys/password@orcl CATALOG rman/password@catalogo AUXILIARY /
duplicate target database to xxxx;
para
rman TARGET password@orcl AUXILIARY /
duplicate target database to xxxx;
Olá Anônimo,
O CATALOG é opcional. Se estiver conectando apenas no banco TARGET, as informações de backup e meta dados virão apenas do control file. Se conectado nos dois (TARGET e CATALOG) então as informações poderão vir de um ou de outro.
Abraços
Legatti
Legatti, recebo um erro no duplicate q sempre fala pra aumentar o maxsize no duplicate. onde fica esse maxsize e como alterá-lo. tem um exempplo? o erro é este RMAN-06560, RMAN-06561.
obrigado.
Olá Anônimo,
Esse erro é muito estranho para o duplicate:
RMAN-06561 - available space must be larger than number kb
Cause
The recovery failed because it requires more disk space. One of the following could have caused this error:
1) The MAXSIZE option is used but is not large enough to restore files.
2) Files should be restored to recovery area, but available disk space is not large enough to restore files.
Action
One of the following:
1) Increase the MAXSIZE parameter and retry the command.
2) Free up disk space in the recovery area.
Bom, você não está usando em nenhum momento a cláusula MAXSIZE, que pode ser utilizado no comando "recover database", então não há como aumentar o valor desse parâmetro, já que o mesmo não é usado. Acredito que você possa estar tendo algum problema em relação a Flash Recovery Area na instância auxiliar. Faça alguns testes como aumentar o valor do parâmetro db_recovery_file_dest_size no init.ora da instância auxiliar. Um outro teste seria remover completamente do init.ora da instância auxiliar os parâmetros db_recovery_file_dest e db_recovery_file_dest_size.
Abraços e até mais
Legatti
Boa tarde Eduardo...
Tenho uma dúvida que está 'martelando' e queria sua ajuda quanto a isso.
Cenário: Tenho uma base BD01 em um servidor Windows Server 2003 com Oracle 10g. Quero atualizar tanto o BD01 quanto o SO (Oracle 11g e Windows Server 2008 R2). Primeiramente, é criado um server paralelo, com SO e BD atualizado(BD02). Qual o melhor procedimento para transportar os dados do BD01(antigo) para o BD02(atualizado). Via impdp/expdp ou RMAN? Visto que a base tem um tamanho de 20GB. Se pelo RMAN, seria backup as copy, clone database? Tenho muita dúvida quanto a isso.
Muito obrigado desde ja pela ajuda. Tiro muitas dúvidas através do seu BLOG. Textos bem explicados, boa didática. Parabéns.
Olá José Augusto,
Para o seu cenário eu recomendo utilizar a técnica de exportação/importação através do expdp/impdp mesmo. É mais tranquilo e seguro. O banco de dados não é tão grande assim (20 GB) para que seja necessário usar uma outra técnica. Caso a base de dados fosse realmente maior, aí sim, poderia utilizar o DUPLICATE do RMAN para então fazer o upgrade do banco de dados no novo servidor.
Obrigado e atém mais...
Legatti
Boa tarde Eduardo belo post parabéns..
Tenho uma difícil missão pela frente e queria saber se já passou por essa situação. Vou migrar uma base da versão 10.2.0.5 para 11r2 e queria aproveitar esse momento para migrar de file system para ASM. Sabe me falar se consigo clonar uma base que roda em file system para uma outra máquina + instância ASM ? Imagino que depois a migração de versão deve ser padrão que já fiz algumas vezes (DBUA). Minha intenção é montar uma estrutura paralela (com os mesmos recursos de hardware) para poder fazer testes de performance e só então, decidir por usar ou não ASM já que não sou obrigado pois minha base não está em RAC. Vale ressaltar que a única forma de migrar minha base é com o RMAN pois, com expdp o tempo de export/import tona a atividade inviável.
Att,
Bruno
Olá Bruno,
Ainda não fiz este tipo de procedimento. (Non-ASM to ASM) via DUPLICATE. Mas acredito que seja possível sim. Você faz o upgrade para o 11g e depois faz o DUPLICATE na qual a instância auxiliar já vai estar preparada para com o ASM, etc.
Pesquise no Google o texto abaixo que você vai achar alguns links de pessoas que já passaram por isso.
"RMAN: how to duplicate a non-ASM active database to an ASM database"
Abraços e até mais
Legatti
Boa tarde,
Eduardo.
Excelente post, muito bacana.
Cara estou em um cenário que preciso fazer um duplicate e estou com algumas duvidas.
Seguindo seu post, tenho um database chamado ctginst1 (origem) e um database chamado TESTE1 (destino).
Quando eu carrego as variaveis de ambiente do TESTE1 e digito (rman target sys/senha@ctginst1 auxiliary /) me retorna as seguintes mensagens de erro:
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00554: initialization of internal recovery manager package failed
RMAN-04005: error from target database:
ORA-01017: invalid username/password; logon denied
[oracle@cciora12:TESTE1 ~]$
Erro de senha não é porque quando somente me conecto sem o @ctginst1 auxiliary / consigo perfeitamente me conectar.
A minha duvida é se preciso criar o catalogo para o banco TESTE1 e dar os privilégios pertinentes ou em que passo estou errando, porque se faço o processo inverso ou seja clonar o banco TESTE1 para o banco CTGINST1 ele se conecta perfeitamente.
Agradeço pela ajuda.
Atenciosamente,
Sandro
Olá Sandro,
Certifique-se de que a senha do usuário SYS que você está digitando está correta, ou seja, se é a mesma que está gravada no arquivo de senhas. Existe uma diferença em conectar usando um serviço TNS e conectar localmente através da autenticação do sistema operacional (OS authentication). Localmente, a conexão é feita usando autenticação do sistema operacional, ou seja, qualquer senha que você colocar vai conectar. Usando um serviço TNS, a senha tem que se a correta. Exemplos:
[oracle@linux1 dbs]$ orapwd file=orapwBD01 password=senhacerta entries=10 force=y
Conectando localmente via OS Authentication
[oracle@linux1 dbs]$ export ORACLE_SID=BD01
[oracle@linux1 dbs]$ sqlplus / as sysdba
Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning option
conectou!!!
[oracle@linux1 dbs]$ sqlplus sys/senhaerrada as sysdba
Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning option
conectou!!!
[oracle@linux1 dbs]$ rman target /
Gerenciador de Recuperaão: Release 11.2.0.3.0 - Production on Sex Jul 3 22:22:00 2015
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
conectado ao banco de dados de destino: BD01 (DBID=3071087724)
conectou!!!
[oracle@linux1 dbs]$ rman target sys/senhaerrada
Gerenciador de Recuperaão: Release 11.2.0.3.0 - Production on Sex Jul 3 22:22:30 2015
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
conectado ao banco de dados de destino: BD01 (DBID=3071087724)
conectou!!!
Conectando via serviço TNS
[oracle@linux1 dbs]$ cat /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
LINUX1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = linux1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = BD01)
)
)
[oracle@linux1 dbs]$ sqlplus sys/senhacerta@linux1 as sysdba
Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning option
connectou!!!
[oracle@linux1 dbs]$ sqlplus sys/senhaerrada@linux1 as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Sex Jul 3 22:27:25 2015
Copyright (c) 1982, 2011, Oracle. All rights reserved.
ERROR:
ORA-01017: senha/nome do usurio invlido; log-on negado
[oracle@linux1 dbs]$ sqlplus sys/senhacerta@linux1 as sysdba
Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning option
conectou!!!
[oracle@linux1 dbs]$ rman target sys/senhacerta@linux1
Gerenciador de Recuperaão: Release 11.2.0.3.0 - Production on Sex Jul 3 22:27:50 2015
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
conectado ao banco de dados de destino: BD01 (DBID=3071087724)
conectou!!!
[oracle@linux1 dbs]$ rman target sys/senhaerrada@linux1
Gerenciador de Recuperaão: Release 11.2.0.3.0 - Production on Sex Jul 3 22:28:12 2015
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00554: inicializaão do pacote do recovery manager interno falhou
RMAN-04005: erro no banco de dados de destino:
ORA-01017: senha/nome do usurio invlido; log-on negado
Abraços,
Legatti
bom dia Eduardo.
primeiramente gostaria de parabenizar o excelente trabalho realizado.
o conhecimento só é valido quando é compartilhado.
preciso aqui de uma ajudinha.
fiz o processo de duplicate database para um servidor remoto, após o tremino do processo notei
que o controlfile do servidor remoto estava com o DBNAME do "target" BDPRD, no caso, minha base de produção.
entao gerei um arquivo txt do controlfile atraves do comando "alter database backup controlfile to trace"
e fiz as alterações substituindo o dbname BDPRD para DBCLONE, instancia do servidor remoto.
obs:
durante o duplicate foram transferidos os datafiles para o servidor remoto mas
nao os arquivos de log.
após a criaçao do novo controlfile o banco pode ser montado, porém ao tentar abrir o banco recebo o erro abaixo.
SQL> ALTER DATABASE OPEN RESETLOGS;
ALTER DATABASE OPEN RESETLOGS
*
ERROR at line 1:
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1:
'E:\ORADATA\DBCLONE\DATAFILE\O1_MF_SYSTEM_BTFRZO9Z_.DBF'
acha que é possivel conseguir abrir o banco ou sera preciso realizar todo processo novamente desde o inicio.
desde ja agradeço.
Um abraço!
Olá Anderson,
Acho melhor você fazer o duplicate de novo. Se por algum motivo você precisar renomear o banco de dados, use o utilitário DBNEWID.
http://eduardolegatti.blogspot.com.br/2010/12/dbnewid-alterando-o-nome-de-um-banco-de.html?m=1
Abraços,
Legatti
ótima explicação parabéns!!!
Porém fiquei com um pequeno problema... Perdi alguns archives iniciais da base e ao realizar o duplicate não consigo abrir a base, pois retorna erro do ORA-1152: file 2 was not restored from a sufficiently old backup. Como devo proceder? Gerai mais archivelogs da base e realizei o duplicate novamente, porém o erro persiste...
Obrigado e parabéns novamente!!!
Excelente blog!!!
Olá Guilherme,
Como assim, perdeu archives? O Oracle é 11g? Você está fazendo o duplicate usando um backup ou usando o método ACTIVE DATABASE? Quais erros estão acontecendo exatamente e em qual estapa do duplicate?
Se você está usando o método de utilizar um backup recente, verifique se você incluiu archivelogs neste backup. ex: RMAN> backup full database plus archivelog
O ideal é o duplicate finalizar com sucesso sem nenhum problema, agora se o erro persiste, você vai ter que quebrar a cabeça para ver o que está acontecendo.
Já tentou aplicar os archivelogs faltantes na mão conforme exemplo abaixo? É uma tentativa, mas o ideal é você tentar fazer com que o Duplicate finalize com sucesso sem nenhuma intervenção manual ;-)
SQL> connect / as sysdba;
SQL> recover database until cancel using backup controlfile;
.. Informe o caminho dos archivelogs
.. Depois de aplicar, digiete "cancel"
SQL> alter database open resetlogs;
Abraços,
Legatti
Olá Eduardo,
O Oracle é 11g r2. Estou testando com active database. O Erro acontece ao final do processo de duplicate (ORA-1152: file 2 was not restored from a sufficiently old backup) juntamente com o erro ORA-01110 (indicando o datafile com "problema"). Como é uma base de teste, acabei excluindo alguns archives por não achar necessários e verifiquei que com isso acabou gerando esse erro ao realizar o procedimento de duplciate...
Para realizar o duplicate com active database é necessário ter todos archives da base?
Para solucionar o meu problema você tem alguma dica? Gerei mais archives para tentar solucionar o problema, realizei o duplicate novamente, mas não adiantou, acredito que ficar gerando archives não irá solucionar...
Obrigado!
Abs
Olá Guilherme,
Deve ser alguma configuração no seu ambiente. O seu banco está configurado para usar a FLASH RECOVERY AREA. Se não, acho bom configurá-la? O destino do banco clone tem a mesma estrutura do banco de origem? Se não, você usou corretamente os parâmetros *.db_file_name_convert e *.log_file_name_convert? A barra (\) Windows é diferente de Linux/Unix (/). Se for possível, tente fazer o clone colocando o banco de dados de origem no estado MOUNT para ver se acontece o mesmo erro. Se acontecer o mesmo erro, veja se você consegue realizar o duplicate sem utilizar a opção ACTIVE. Faça um backup FULL e siga os passos.
Lembre-se de que dependendo de algumas tentativas mal sucedidas, a instância auxiliar pode ainda ter ficado em uso. Ao realizar os procedimentos novamente, certifique-se de não ter deixado vestígios da tentativa mal sucedida realizada anteriormente.
Abraços,
Legatti
Excelente conteúdo do do post, gostaria apenas de adicionar duas informações que só consegui usar com active database:
1 - Utilizei mesma senha para o target e para o auxiliary
2 - o ini dos dois estavam sem a configuração *.db_recovery_file_dest e
*.db_recovery_file_dest_size, tem que estar configurado pelo menos no auxiliary
Grande abraço e parabéns.
Postar um comentário