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


domingo, 4 de março de 2012

RMAN - RECOVER DROP TABLESPACE (10g vs 11g)

Por Eduardo Legatti

Olá,

Imagine um dia estressante em uma situação aonde o DBA, responsável por administrar vários ambientes de banco de dados, ao achar que estava conectado a um banco de dados de TESTE, acaba por executar o comando DROP TABLESPACE ... de forma consciente. Após alguns segundos o telefone toca, o DBA atende e alguém do outro lado da linha diz que o sistema responsável por processar a folha de pagamento começou a apresentar vários erros de banco de dados dizendo que as tabelas não existiam, etc... O DBA, então, diz ao operador do sistema para aguardar na linha um momento pois iria averiguar se havia algum problema com o banco de dados. O DBA conecta no banco de dados de PRODUÇÃO para ver o que poderia estar ocorrendo e, após alguns minutos, descobre o real motivo do problema. Neste momento o DBA já com a boca seca, suando frio e com o coração a 1000 batimentos por minuto, diz com a voz trêmula ao operador do sistema que realmente há um problema no banco de dados e que retornaria mais tarde. Bom, a continuação da estória fica a cargo da imaginação de cada um, mas realmente situações como essas não são impossíveis de acontecer no dia a dia de um DBA.

Bom, já que no Oracle 10g e versões anteriores não se pode realizar um TSPITR (Tablespace Point-in-Time Recovery) em uma tablespace que foi dropada e, supondo que o banco de dados em questão utiliza uma estratégia de backup com o RMAN, o nosso amigo DBA poderá ter duas opções para voltar a tablespace acidentalmente excluída:
  1. Realizar um DBPITR (Database Point-in-Time Recovery) de forma a voltar o banco de dados até o momento antes da tablespace ter sido dropada
  2. Restaurar um backup em uma outra máquina, realizar uma recuperação incompleta (DBPITR) de forma a voltar o banco de dados até o momento antes da tablespace ter sido dropada, exportar as tabelas e importá-las novamente no ambiente de produção após a recriação da tablespace

Em se tratando de Oracle 11g, a grande novidade é a possibilidade de realizar um TSPITR, mesmo em uma tablespace que foi dropada. Seria mais ou menos realizar o procedimento da opção 2, só que de forma simples e automatizada. Vale a pena salientar que o TSPITR (Recuperação Pontual de Tablespace) é uma funcionalidade que fornece ao DBA a opção de recuperar um conjunto de dados em um ponto específico no tempo sem afetar o restante do banco de dados.

No mais, neste artigo irei demonstrar através de exemplos práticos com o RMAN os procedimentos necessários para realizarmos a recuperação de uma tablespace que foi dropada. Farei uso do Oracle 10g e do Oracle 11g afim de comparar as duas abordagens.

Abaixo, irei começar com a simulação no Oracle 10g. utilizarei o banco de dados BD01 e a tablespace alvo será a TBS_01.
C:\>sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Dom Mar 4 13:54:12 2012

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

Conectado a:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> create table scott.t1 tablespace tbs_01 as select 1 id from dual;

Tabela criada.

Acima, criei uma tabela T1 na tablespace TBS_01. Essa tablespace será dropada mais a frente. Neste momento irei realizar um backup completo utilizando o RMAN conforme demonstrado abaixo:
RMAN> backup database plus archivelog;
Iniciando backup em 04/03/2012 13:54:30
log atual arquivado
canal alocado: ORA_DISK_1
canal ORA_DISK_1: sid=142 devtype=DISK
canal ORA_DISK_1: iniciando conjunto de backups de log de arquivamento
canal ORA_DISK_1: especificando log(s) de arquivamento no conjunto de backups
thread do log arquivado de entrada=1 sequência=4 RECID=1 STAMP=5777201
canal ORA_DISK_1: iniciando o componente 1 em 04/03/2012 13:54:35
canal ORA_DISK_1: componente 1 finalizado em 04/03/2012 13:54:36
handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD01\BACKUPSET\2012_03_04\O1_MF_HNNDF_TAG20120304T157522_7MGOZVRF_.
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:00:01
Finalizado backup em 04/03/2012 13:54:37

Iniciando backup em 04/03/2012 13:54:38
canal alocado: 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
fno=00001 name=E:\ORACLE\ORADATA\BD01\SYSTEM01.DBF do arquivo de dados de entrada
fno=00002 name=E:\ORACLE\ORADATA\BD01\UNDOTBS01.DBF do arquivo de dados de entrada
fno=00003 name=E:\ORACLE\ORADATA\BD01\SYSAUX01.DBF do arquivo de dados de entrada
fno=00004 name=E:\ORACLE\ORADATA\BD01\USERS01.DBF do arquivo de dados de entrada
fno=00005 name=E:\ORACLE\ORADATA\BD01\TBS01.DBF do arquivo de dados de entrada
canal ORA_DISK_1: iniciando o componente 1 em 04/03/2012 13:54:40
canal ORA_DISK_1: componente 1 finalizado em 04/03/2012 13:55:18
handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD01\BACKUPSET\2012_03_04\O1_MF_NNNDF_TAG20120304T135522_7MZOZVRF_.BKP tag=TAG20120304T135522 comentário=NONE
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:00:38
Finalizado backup em 04/03/2012 13:55:19

Iniciando backup em 04/03/2012 13:55:20
log atual arquivado
utilizando o canal ORA_DISK_1
canal ORA_DISK_1: iniciando conjunto de backups de log de arquivamento
canal ORA_DISK_1: especificando log(s) de arquivamento no conjunto de backups
log de arquivamento thread de entrada=1 sequência=5 RECID=2 STAMP=5777306
canal ORA_DISK_1: iniciando o componente 1 em 04/03/2012 13:55:21
canal ORA_DISK_1: componente 1 finalizado em 04/03/2012 13:55:22
handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD01\BACKUPSET\2012_03_04\O1_MF_JNNNN_TAG20120304T214107_7N5T14FO_.BKP tag=TAG20120180T214107 comentário=NONE
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:00:01
Finalizado backup em 04/03/2012 13:55:49

Iniciando Control File and SPFILE Autobackup em 04/03/2012 13:55:58
handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD01\AUTOBACKUP\2012_03_04\O1_MF_S_775576558_7MZP0ZNZ_.BKP comentário=NONE
Finalizado Control File and SPFILE Autobackup em 04/03/2012 13:56:00

Com o backup finalizado, irei dropar a tablespace TBS_01 e os datafiles associados.
SQL> drop tablespace tbs_01 including contents and datafiles;

Tablespace eliminado.

Para finalizar, irei criar uma tabela T2 na tablespace USERS conforme abaixo:
SQL> create table scott.t2 tablespace users as select 1 id from dual;

Tabela criada.

Pronto. Então, como poderemos recuperar a tablespace TBS_01? Conforme falado no início do artigo, irei utilizar a opção 1, ou seja, realizar um DBPITR mas, para tanto, precisamos saber o horário em que a tablespace TBS_01 foi dropada. Abaixo, o arquivo de log de alerta nos mostra que a tablespace foi dropada às 13:56:57 e, portanto, deveremos voltar o banco de dados até este horário.

Arquivo de Alerta
=================
Dom Mar 04 13:56:57 2012
drop tablespace tbs_01 including contents and datafiles
Dom Mar 04 13:56:59 2012
Deleted file E:\ORACLE\ORADATA\BD01\TBS01.DBF
Starting control autobackup
Dom Mar 04 13:57:01 2012
Control autobackup written to DISK device
handle 'O1_MF_S_775576619_7MZP2WTC_.BKP'
Completed: drop tablespace tbs_01 including contents and datafiles

Apenas para fins de informação, se tentarmos restaurar a tablespace TBS_01 com o comando RESTORE abaixo, obteremos o erro RMAN-20202, pois o controlfile atual não tem mais informações sobre a mesma.
RMAN> restore tablespace tbs_01;

Iniciando restore em 04/03/2012
usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação
canal alocado: ORA_DISK_1
canal ORA_DISK_1: sid=142 devtype=DISK
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: falha do comando restore em 04/03/2012 14:05:52
RMAN-20202: tablespace not found in the recovery catalog
RMAN-06019: não foi possível traduzir nome do tablespace "TBS_01"

Se tentarmos realizar um TSPITR, também não teremos sucesso pois no Oracle 10g esse método é válido apenas para tablespaces que fazem parte do banco de dados, conforme demonstração abaixo:
RMAN> run{
2> recover tablespace tbs_01
3> until time "to_date('04/03/2012 13:56:57','DD/MM/YYYY HH24:MI:SS')"
4> auxiliary destination 'e:\auxiliary';
5> }
Iniciando recover em 04/03/2012 14:07:00
usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação
canal alocado: ORA_DISK_1
canal ORA_DISK_1: sid=154 devtype=DISK
RMAN-05026: ADVERTÊNCIA: pressupõe-se que o conjunto de tablespaces a seguir se aplica a um ponto específico no tempo

Espera-se que a lista de tablespaces tenha segmentos UNDO
tablespace SYSTEM
tablespace UNDOTBS1

Criando uma instância automática, com SID='iwej'

parâmetros de inicialização usados para instância automática:
db_name=BD01
compatible=10.2.0.1.0
db_block_size=8192
db_files=200
db_unique_name=tspitr_BD01_iwej
large_pool_size=1M
shared_pool_size=110M
#No auxiliary parameter file used
db_create_file_dest=e:\auxiliary
control_files=e:\auxiliary/cntrl_tspitr_BD01_iwej.f

inicializando instância automática BD01

instância Oracle iniciada

Total da Área Global do Sistema 201326592 bytes

Fixed Size 1248092 bytes
Variable Size 146801828 bytes
Database Buffers 50331648 bytes
Redo Buffers 2945024 bytes
Instância automática criada

Removendo instância automática
desativando instância automática
encerramento de instância Oracle
Instância automática removida
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: falha do comando recover em 04/03/2012 14:07:20
RMAN-20202: tablespace not found in the recovery catalog
RMAN-06019: não foi possível traduzir nome do tablespace "TBS_01"

Portanto, será necessário restaurar um backup do controlfile em um momento do tempo em que a tablespace TBS_01 não havia sido dropada.
RMAN> list backup of controlfile;

Lista de Conjuntos de Backup
============================

BS Key Type LV Size Device Type Elapsed Time Horário de Conclusão
------- ---- -- ---------- ----------- ------------ --------------------
4 Full 6.80M DISK 00:00:02 04/03/2012 13:56:00
Chave BP: 4 Status: AVAILABLE Compactado: NO Tag: TAG20120304T135558
Nome do Componente: AUTOBACKUP\2012_03_04\O1_MF_S_775576558_7MZP0ZNZ_.BKP
Arquivo de Controle Incluído: SCN Ckp: 151690 Tempo Ckp: 04/03/2012 13:55:58

BS Key Type LV Size Device Type Elapsed Time Horário de Conclusão
------- ---- -- ---------- ----------- ------------ --------------------
5 Full 6.80M DISK 00:00:00 04/03/2012 13:57:00
Chave BP: 5 Status: AVAILABLE Compactado: NO Tag: TAG20120304T135659
Nome do Componente: AUTOBACKUP\2012_03_04\O1_MF_S_775576619_7MZP2WTC_.BKP
Arquivo de Controle Incluído: SCN Ckp: 151737 Tempo Ckp: 04/03/2012 13:57:00

Acima, podemos ver que Backupset 4 contém um backup do controlfile que poderemos utilizar para restaurar e recuperar a tablespace TBS_01. Neste caso irei restaurar o controlfile do backup piece O1_MF_S_775576558_7MZP0ZNZ_.BKP conforme demonstrado abaixo:

C:\>rman target /

Gerenciador de Recuperação: Release 10.2.0.1.0 - Production on Dom Mar 4 14:15:02 2012

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

conectado ao banco de dados de destino: BD01 (DBID=3041825321)

RMAN> shutdown immediate;

usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação
banco de dados fechado
banco de dados desmontado
encerramento de instância Oracle

RMAN> startup nomount

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

Total da Área Global do Sistema 209715200 bytes

Fixed Size 1248140 bytes
Variable Size 67110004 bytes
Database Buffers 138412032 bytes
Redo Buffers 2945024 bytes


RMAN> restore controlfile from 'AUTOBACKUP\2012_03_04\O1_MF_S_775576558_7MZP0ZNZ_.BKP';

Iniciando restore em 04/03/2012 14:25:59
usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação
canal alocado: ORA_DISK_1
canal ORA_DISK_1: sid=157 devtype=DISK

canal ORA_DISK_1: restaurando arquivo de controle
canal ORA_DISK_1: restauração concluída, tempo decorrido: 00:00:05
nome do arquivo de saída=E:\ORACLE\ORADATA\BD01\CONTROL01.CTL
nome do arquivo de saída=E:\ORACLE\ORADATA\BD01\CONTROL02.CTL
nome do arquivo de saída=E:\ORACLE\ORADATA\BD01\CONTROL03.CTL
Finalizado restore em 04/03/2012 14:26:05

Após restaurado o backup do controlfile, poderemos montar (MOUNT) o banco de dados e verificar se o mesmo contém informações da tablespace TBS_01.
RMAN> alter database mount;

banco de dados montado
canal liberado: ORA_DISK_1

RMAN> report schema;

Iniciando implicit crosscheck backup em 04/03/2012 14:26:24
canal alocado: ORA_DISK_1
canal ORA_DISK_1: sid=156 devtype=DISK
Fez a verificação cruzada de 1 objetos
Finalizado implicit crosscheck backup em 04/03/2012 14:26:25

Iniciando implicit crosscheck copy em 04/03/2012 14:26:25
utilizando o canal ORA_DISK_1
Finalizado implicit crosscheck copy em 04/03/2012 14:26:25

procurando todos os arquivos na área de recuperação
catalogando arquivos...
catalogação concluída

Lista de Arquivos Catalogados
=============================
Nome do Arquivo: AUTOBACKUP\2012_03_04\O1_MF_S_775576558_7MZP0ZNZ_.BKP
Nome do Arquivo: AUTOBACKUP\2012_03_04\O1_MF_S_775576619_7MZP2WTC_.BKP

RMAN-06139: ADVERTÊNCIA: o arquivo de controle não está atualizado para REPORT SCHEMA
Relatório do esquema do banco de dados

Lista de Arquivos de Dados Permanentes
======================================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------- ------- ------------------------------------
1 300 SYSTEM *** E:\ORACLE\ORADATA\BD01\SYSTEM01.DBF
2 200 UNDOTBS1 *** E:\ORACLE\ORADATA\BD01\UNDOTBS01.DBF
3 120 SYSAUX *** E:\ORACLE\ORADATA\BD01\SYSAUX01.DBF
4 5 USERS *** E:\ORACLE\ORADATA\BD01\USERS01.DBF
5 0 TBS_01 *** E:\ORACLE\ORADATA\BD01\TBS01.DBF

Bom, confirmado que o controlfile contém informações da tablespace TBBS_01, abaixo irei tentar realizar uma tentativa desesperada de recuperação da tablespace:
RMAN> restore tablespace tbs_01;
Iniciando restore em 04/03/2012 14:28:16
utilizando o canal ORA_DISK_1

canal ORA_DISK_1: iniciando restauração de conjunto de backups de arquivo de dados
canal ORA_DISK_1: especificando arquivo(s) de dados para restauração a partir do conjunto de backups
restaurando arquivo de dados 00005 para E:\ORACLE\ORADATA\BD01\TBS01.DBF
canal ORA_DISK_1: lendo da parte de backup E:\ORACLE\FLASH_RECOVERY_AREA\BD01\BACKUPSET\2012_03_04\O1_MF_NNNDF_TAG20120304T135522_7MZOZVRF_.BKP
canal ORA_DISK_1: restaurada a parte de backup 1
handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD01\BACKUPSET\2012_03_04\O1_MF_NNNDF_TAG20120304T135522_7MZOZVRF_.BKP tag=TAG20120304T135522
canal ORA_DISK_1: restauração concluída, tempo decorrido: 00:00:01
Finalizado restore em 04/03/2012 14:28:18

RMAN> recover tablespace tbs_01;

Iniciando recover em 04/03/2012 14:35:00
utilizando o canal ORA_DISK_1

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: falha do comando recover em 04/03/2012 14:35:00
RMAN-06067: RECOVER DATABASE solicitado com um backup ou criado um arquivo de controle

Podemos verificar acima que o restore foi feito, mas o recover não pôde ser realizado, pois após a restauração de um backup de controlfile, apenas o comando RECOVER DATABASE poderia ser executado. Neste caso, precisarei executar uma recuperação incompleta (incomplete recovery) utilizando o método DBPITR. Irei recuperar o banco de dados até a hora 13:56:57 que foi o momento anterior à execução do comando que dropou a tablespace TBS_01, conforme informação no log do arquivo de alerta.
RMAN> run {set until time "to_date('04/03/2012 13:56:57','DD/MM/YYYY HH24:MI:SS')";
2> restore database;
3> recover database;
4> }
executando comando: SET until clause
usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação

Iniciando restore em 04/03/2012 14:40:12
canal alocado: ORA_DISK_1
canal ORA_DISK_1: sid=159 devtype=DISK

ignorando o arquivo de dados 5; já restaurado para o arquivo E:\ORACLE\ORADATA\BD01\TBS01.DBF
canal ORA_DISK_1: iniciando restauração de conjunto de backups de arquivo de dados
canal ORA_DISK_1: especificando arquivo(s) de dados para restauração a partir do conjunto de backups
restaurando arquivo de dados 00001 para E:\ORACLE\ORADATA\BD01\SYSTEM01.DBF
restaurando arquivo de dados 00002 para E:\ORACLE\ORADATA\BD01\UNDOTBS01.DBF
restaurando arquivo de dados 00003 para E:\ORACLE\ORADATA\BD01\SYSAUX01.DBF
restaurando arquivo de dados 00004 para E:\ORACLE\ORADATA\BD01\USERS01.DBF
canal ORA_DISK_1: lendo da parte de backup E:\ORACLE\FLASH_RECOVERY_AREA\BD01\BACKUPSET\2012_03_04\O1_MF_NNNDF_TAG20120304T135522_7MZOZVRF_.BKP
canal ORA_DISK_1: restaurada a parte de backup 1
handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD01\BACKUPSET\2012_03_04\O1_MF_NNNDF_TAG20120304T135522_7MZOZVRF_.BKP tag=TAG20120304T135522
canal ORA_DISK_1: restauração concluída, tempo decorrido: 00:00:25
Finalizado restore em 04/03/2012 14:40:39

Iniciando recover em 04/03/2012 14:40:39
utilizando o canal ORA_DISK_1

iniciar recuperação de mídia

log de arquivamento thread 1 seqüência 5 já está no disco como arquivo E:\ORACLE\ORADATA\BD01\REDO03.LOG
nome do arquivo de log de arquivamento=E:\ORACLE\ORADATA\BD01\REDO03.LOG thread=1 seqüência=5
recuperação da mídia concluída, tempo decorrido: 00:00:02
Finalizado recover em 04/03/2012 14:40:45

Pronto. Agora poderemos abrir o banco de dados com a opção de RESETLOGS.
RMAN> alter database open resetlogs;

banco de dados aberto

SQL> select file_id,file_name,status from dba_data_files;

FILE_ID FILE_NAME STATUS
---------- ------------------------------------ ---------
1 E:\ORACLE\ORADATA\BD01\SYSTEM01.DBF AVAILABLE
2 E:\ORACLE\ORADATA\BD01\UNDOTBS01.DBF AVAILABLE
3 E:\ORACLE\ORADATA\BD01\SYSAUX01.DBF AVAILABLE
4 E:\ORACLE\ORADATA\BD01\USERS01.DBF AVAILABLE
5 E:\ORACLE\ORADATA\BD01\TBS01.DBF AVAILABLE

Abaixo, podemos verificar que a tabela T1 que reside na tablespace TBS_01 foi recuperada com sucesso.
SQL> select * from scott.t1;

ID
----------
1

No entanto, poderemos ver abaixo que a tabela T2 que residia na tablespace USERS foi perdida no processo de DBPITR, pois a mesma foi criada após a exclusão da tablespace TBS_01. Portanto, a utilização desse método poderá acarretar a perda de muitas transações no seu banco de dados. Para o nosso amigo DBA, dependendo das demais aplicações em uso no banco de dados, a opção mais segura seria executar os procedimento da opção 2.
SQL> select * from scott.t2;
select * from scott.t2
*
ERRO na linha 1:
ORA-00942: a tabela ou view não existe

Bom, e em relação ao Oracle 11g? Simularei o mesmo cenário. Neste caso utilizarei o banco de dados BD02 e a tablespace TBS_02 como alvo. No mais, veremos como será simples voltar a tablespace dropada sem nenhuma perda de dados para o restante do banco de dados.
C:\>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Dom Mar 4 15:38:11 2012

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 table scott.t1 tablespace tbs_02 as select 1 id from dual;

Tabela criada.

Acima, criei uma tabela T1 na tablespace TBS_02. Essa tablespace será dropada mais a frente. Neste momento irei realizar um backup completo utilizando o RMAN conforme demonstrado abaixo:
RMAN> backup database plus archivelog;
Iniciando backup em 04/03/2012 15:41:03
log atual arquivado
usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação
canal alocado: ORA_DISK_1
canal ORA_DISK_1: SID=38 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=14 RECID=1 STAMP=775777265
canal ORA_DISK_1: iniciando o componente 1 em 04/03/2012 15:41:08
canal ORA_DISK_1: componente 1 finalizado em 04/03/2012 15:41:09
handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD02\BACKUPSET\2012_03_04\O1_MF_ANNNN_TAG20120220T214107_7N5T14FO_.BKP tag=TAG20120220T214107 comentário=NONE
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:00:01
Finalizado backup em 04/03/2012 15:41:09

Iniciando backup em 04/03/2012 15:41:09
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 do arquivo de dados de entrada
número do arquivo=00002 nome=E:\ORACLE\ORADATA\BD02\SYSAUX01.DBF do arquivo de dados de entrada
número do arquivo=00003 nome=E:\ORACLE\ORADATA\BD02\UNDOTBS01.DBF do arquivo de dados de entrada
número do arquivo=00004 nome=E:\ORACLE\ORADATA\BD02\USERS01.DBF do arquivo de dados de entrada
número do arquivo=00005 nome=E:\ORACLE\ORADATA\BD02\TBS02.DBF do arquivo de dados de entrada
canal ORA_DISK_1: iniciando o componente 1 em 04/03/2012 15:41:11
canal ORA_DISK_1: componente 1 finalizado em 04/03/2012 15:41:46
handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD02\BACKUPSET\2012_03_04\O1_MF_NNNDF_TAG20120220T214110_7N5T18OH_.BKP tag=TAG20120220T214110 comentário=NONE
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:00:35
Finalizado backup em 04/03/2012 15:41:46

Iniciando backup em 04/03/2012 15:41:46
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=15 RECID=2 STAMP=775777306
canal ORA_DISK_1: iniciando o componente 1 em 04/03/2012 15:41:47
canal ORA_DISK_1: componente 1 finalizado em 04/03/2012 15:41:48
handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD02\BACKUPSET\2012_03_04\O1_MF_ANNNN_TAG20120220T214146_7N5T2CNJ_.BKP tag=TAG20120220T214146 comentário=NONE
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:00:01
Finalizado backup em 04/03/2012 15:41:48

Iniciando Control File and SPFILE Autobackup em 04/03/2012 15:41:48
handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD02\AUTOBACKUP\2012_03_04\O1_MF_S_775777308_7N5T2G3X_.BKP comentário=NONE
Finalizado Control File and SPFILE Autobackup em 04/03/2012 15:41:51

Com o backup finalizado, irei dropar a tablespace TBS_02 e os datafiles associados.
SQL> drop tablespace tbs_02 including contents and datafiles;

Tablespace eliminado.

Agora irei criar uma tabela T2 na tablespace USERS conforme abaixo:
SQL> create table scott.t2 tablespace users as select 1 id from dual;

Tabela criada.

Pronto. No Oracle 11g poderemos recuperar a tablespace TBS_02 com o banco de dados aberto utilizando o método TSPITR sem afetar o restante do banco de dados. Abaixo, o arquivo de log de alerta nos mostra que a tablespace TBS_02 foi dropada às 15:45:02 e, portanto, deveremos voltar a mesma até este horário.
C:\>adrci

ADRCI: Release 11.2.0.1.0 - Production on Dom Mar 4 15:56:50 2012

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

ADR base = "e:\oracle"
adrci> show homes
ADR Homes:
diag\clients\user_legatti\host_3288277335_76
diag\rdbms\bd02\bd02
diag\tnslsnr\micro\listener
adrci> set home diag\rdbms\bd02\bd02
adrci> show alert -tail -p "message_text like 'drop%'"
2012-03-04 15:45:02.734000 -03:00
drop tablespace tbs_01 including contents and datafiles
2012-03-04 15:45:07.281000 -03:00
drop tablespace tbs_02 including contents and datafiles

Para poder realizar o TSPITR, irei criar o diretório de destino que será utilizado para uso da instância auxiliar:

E:\>mkdir auxiliary

A partir daí será possível recuperar a tablespace TBS_02 realizando uma recuperação incompleta utilizando o método TSPITR com o RMAN conforme demonstrado abaixo:
C:\>rman target /

Gerenciador de Recuperação: Release 11.2.0.1.0 - Production on Dom Mar 4 16:09:25 2012

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

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

RMAN> run{
2> recover tablespace tbs_02
3> until time "to_date('04/03/2012 15:45:02','DD/MM/YYYY HH24:MI:SS')"
4> auxiliary destination 'e:\auxiliary';
5> }

Iniciando recover em 04/03/2012 16:09:33
usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação
canal alocado: ORA_DISK_1
canal ORA_DISK_1: SID=28 tipo de dispositivo=DISK
RMAN-05026: ADVERTÊNCIA: pressupõe-se que o conjunto de tablespaces a seguir se aplica a um ponto específico no tempo

Espera-se que a lista de tablespaces tenha segmentos UNDO
Tablespace SYSTEM
Tablespace UNDOTBS1

Criando uma instância automática, com SID='culD'

parâmetros de inicialização usados para instância automática:
db_name=BD02
db_unique_name=culD_tspitr_BD02
compatible=11.2.0.0.0
db_block_size=8192
db_files=200
sga_target=280M
processes=50
db_create_file_dest=e:\auxiliary
log_archive_dest_1='location=e:\auxiliary'
#No auxiliary parameter file used

inicializando instância automática BD02

instância Oracle iniciada

Total da Área Global do Sistema 292933632 bytes

Fixed Size 1374164 bytes
Variable Size 100665388 bytes
Database Buffers 184549376 bytes
Redo Buffers 6344704 bytes
Instância automática criada

Lista de tablespaces que foram eliminados do banco de dados de destino:
Tablespace tbs_02

conteúdo do Script de Memória:
{
# set requested point in time
set until time "to_date('04/03/2012 15:45:02','DD/MM/YYYY HH24:MI:SS')";
# restore the controlfile
restore clone controlfile;
# mount the controlfile
sql clone 'alter database mount clone database';
# archive current online log
sql 'alter system archive log current';
# avoid unnecessary autobackups for structural changes during TSPITR
sql 'begin dbms_backup_restore.AutoBackupFlag(FALSE); end;';
}
executando Script de Memória

executando comando: SET until clause

Iniciando restore em 04/03/2012 16:10:37
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 de arquivo de dados
canal ORA_AUX_DISK_1: restaurando arquivo de controle
canal ORA_AUX_DISK_1: lendo da parte de backup E:\ORACLE\FLASH_RECOVERY_AREA\BD02\AUTOBACKUP\2012_03_04\O1_MF_S_775777308_7N5T2G3X_.BKP
canal ORA_AUX_DISK_1: handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD02\AUTOBACKUP\2012_03_04\O1_MF_S_775777308_7N5T2G3X_.BKP tag=TAG20120220T214148
canal ORA_AUX_DISK_1: restaurada a parte de backup 1
canal ORA_AUX_DISK_1: restauração concluída, tempo decorrido: 00:00:02
nome do arquivo de saída=E:\AUXILIARY\BD02\CONTROLFILE\O1_MF_7N5VRH6C_.CTL
Finalizado restore em 04/03/2012 16:10:40

instrução sql: alter database mount clone database

instrução sql: alter system archive log current

instrução sql: begin dbms_backup_restore.AutoBackupFlag(FALSE); end;

conteúdo do Script de Memória:
{
# set requested point in time
set until time "to_date('04/03/2012 15:45:02','DD/MM/YYYY HH24:MI:SS')";
# set destinations for recovery set and auxiliary set datafiles
set newname for clone datafile 1 to new;
set newname for clone datafile 3 to new;
set newname for clone datafile 2 to new;
set newname for clone tempfile 1 to new;
set newname for datafile 5 to
"E:\ORACLE\ORADATA\BD02\TBS02.DBF";
# switch all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile 1, 3, 2, 5;
switch clone datafile all;
}
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

arquivo temporário renomeado 1 para E:\AUXILIARY\BD02\DATAFILE\O1_MF_TEMP_%U_.TMP no arquivo de controle

Iniciando restore em 04/03/2012 16:10:49
utilizando o canal ORA_AUX_DISK_1

canal ORA_AUX_DISK_1: iniciando restauração de conjunto de backups de arquivo de dados
canal ORA_AUX_DISK_1: especificando arquivo(s) de dados para restauração a partir do conjunto de backups
canal ORA_AUX_DISK_1: restaurando o arquivo de dados 00001 em E:\AUXILIARY\BD02\DATAFILE\O1_MF_SYSTEM_%U_.DBF
canal ORA_AUX_DISK_1: restaurando o arquivo de dados 00003 em E:\AUXILIARY\BD02\DATAFILE\O1_MF_UNDOTBS1_%U_.DBF
canal ORA_AUX_DISK_1: restaurando o arquivo de dados 00002 em E:\AUXILIARY\BD02\DATAFILE\O1_MF_SYSAUX_%U_.DBF
canal ORA_AUX_DISK_1: restaurando o arquivo de dados 00005 em E:\ORACLE\ORADATA\BD02\TBS02.DBF
canal ORA_AUX_DISK_1: lendo da parte de backup E:\ORACLE\FLASH_RECOVERY_AREA\BD02\BACKUPSET\2012_03_04\O1_MF_NNNDF_TAG20120220T214110_7N5T18OH_.BKP
canal ORA_AUX_DISK_1: handle de componente=E:\ORACLE\FLASH_RECOVERY_AREA\BD02\BACKUPSET\2012_03_04\O1_MF_NNNDF_TAG20120220T214110_7N5T18OH_.BKP tag=TAG20120220T214110
canal ORA_AUX_DISK_1: restaurada a parte de backup 1
canal ORA_AUX_DISK_1: restauração concluída, tempo decorrido: 00:00:56
Finalizado restore em 04/03/2012 16:11:47

arquivo de dados 1 alternado para a cópia do arquivo de dados
cópia do arquivo de dados de entrada RECID=4 STAMP=775779107 file name=E:\AUXILIARY\BD02\DATAFILE\O1_MF_SYSTEM_7N5VRW98_.DBF
arquivo de dados 3 alternado para a cópia do arquivo de dados
cópia do arquivo de dados de entrada RECID=5 STAMP=775779107 file name=E:\AUXILIARY\BD02\DATAFILE\O1_MF_UNDOTBS1_7N5VRWK2_.DBF
arquivo de dados 2 alternado para a cópia do arquivo de dados
cópia do arquivo de dados de entrada RECID=6 STAMP=775779107 file name=E:\AUXILIARY\BD02\DATAFILE\O1_MF_SYSAUX_7N5VRWG5_.DBF

conteúdo do Script de Memória:
{
# set requested point in time
set until time "to_date('04/03/2012 15:45:02','DD/MM/YYYY HH24:MI:SS')";
# online the datafiles restored or switched
sql clone "alter database datafile 1 online";
sql clone "alter database datafile 3 online";
sql clone "alter database datafile 2 online";
sql clone "alter database datafile 5 online";
# recover and open resetlogs
recover clone database tablespace "TBS_02", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog;
alter clone database open resetlogs;
}
executando Script de Memória

executando comando: SET until clause

instrução sql: alter database datafile 1 online

instrução sql: alter database datafile 3 online

instrução sql: alter database datafile 2 online

instrução sql: alter database datafile 5 online

Iniciando recover em 04/03/2012 16:11:49
utilizando o canal ORA_AUX_DISK_1

iniciar recuperação de mídia

o log arquivado para thread 1 com sequência 15 já está no disco como arquivo E:\ORACLE\FLASH_RECOVERY_AREA\BD02\ARCHIVELOG\2012_03_04\O1_MF_1_15_7N5T2BNJ_.ARC
o log arquivado para thread 1 com sequência 16 já está no disco como arquivo E:\ORACLE\FLASH_RECOVERY_AREA\BD02\ARCHIVELOG\2012_03_04\O1_MF_1_16_7N5VRPSD_.ARC
nome do arquivo de log arquivado=E:\ORACLE\FLASH_RECOVERY_AREA\BD02\ARCHIVELOG\2012_03_04\O1_MF_1_15_7N5T2BNJ_.ARC thread=1 sequência=15
nome do arquivo de log arquivado=E:\ORACLE\FLASH_RECOVERY_AREA\BD02\ARCHIVELOG\2012_03_04\O1_MF_1_16_7N5VRPSD_.ARC thread=1 sequência=16
recuperação da mídia concluída, tempo decorrido: 00:00:02
Finalizado recover em 04/03/2012 16:11:57

banco de dados aberto

conteúdo do Script de Memória:
{
# make read only the tablespace that will be exported
sql clone 'alter tablespace TBS_02 read only';
# create directory for datapump import
sql "create or replace directory TSPITR_DIROBJ_DPDIR as ''
e:\auxiliary''";
# create directory for datapump export
sql clone "create or replace directory TSPITR_DIROBJ_DPDIR as ''
e:\auxiliary''";
}
executando Script de Memória

instrução sql: alter tablespace TBS_02 read only

instrução sql: create or replace directory TSPITR_DIROBJ_DPDIR as ''e:\auxiliary''

instrução sql: create or replace directory TSPITR_DIROBJ_DPDIR as ''e:\auxiliary''

Exportando metadados...
EXPDP> Iniciando "SYS"."TSPITR_EXP_culD":
EXPDP> Processando o tipo de objeto TRANSPORTABLE_EXPORT/PLUGTS_BLK
EXPDP> Processando o tipo de objeto TRANSPORTABLE_EXPORT/TABLE
EXPDP> Processando o tipo de objeto TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
EXPDP> Tabela-mestre "SYS"."TSPITR_EXP_culD" carregada/descarregada com sucesso
EXPDP> ******************************************************************************
EXPDP> Conjunto de arquivos de dump para SYS.TSPITR_EXP_culD é:
EXPDP> E:\AUXILIARY\TSPITR_CULD_31389.DMP
EXPDP> ******************************************************************************
EXPDP> Os arquivos de dados necessários para o tablespace transportável TBS_02:
EXPDP> E:\ORACLE\ORADATA\BD02\TBS02.DBF
EXPDP> O job "SYS"."TSPITR_EXP_culD" foi concluído com sucesso em 16:13:50
Exportação concluída

conteúdo do Script de Memória:
{
# shutdown clone before import
shutdown clone immediate
}
executando Script de Memória

banco de dados fechado
banco de dados desmontado
encerramento de instância Oracle

Importando metadados...
IMPDP> Tabela-mestre "SYS"."TSPITR_IMP_culD" carregada/descarregada com sucesso
IMPDP> Iniciando "SYS"."TSPITR_IMP_culD":
IMPDP> Processando o tipo de objeto TRANSPORTABLE_EXPORT/PLUGTS_BLK
IMPDP> Processando o tipo de objeto TRANSPORTABLE_EXPORT/TABLE
IMPDP> Processando o tipo de objeto TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
IMPDP> O job "SYS"."TSPITR_IMP_culD" foi concluído com sucesso em 16:14:33
Importação concluída

conteúdo do Script de Memória:
{
# make read write and offline the imported tablespaces
sql 'alter tablespace TBS_02 read write';
sql 'alter tablespace TBS_02 offline';
# enable autobackups after TSPITR is finished
sql 'begin dbms_backup_restore.AutoBackupFlag(TRUE); end;';
}
executando Script de Memória

instrução sql: alter tablespace TBS_02 read write

instrução sql: alter tablespace TBS_02 offline

instrução sql: begin dbms_backup_restore.AutoBackupFlag(TRUE); end;

Removendo instância automática
Instância automática removida
arquivo da instância auxiliar E:\AUXILIARY\BD02\DATAFILE\O1_MF_TEMP_7N5VV71G_.TMP deletado
arquivo da instância auxiliar E:\AUXILIARY\BD02\ONLINELOG\O1_MF_3_7N5VV14W_.LOG deletado
arquivo da instância auxiliar E:\AUXILIARY\BD02\ONLINELOG\O1_MF_2_7N5VTZM1_.LOG deletado
arquivo da instância auxiliar E:\AUXILIARY\BD02\ONLINELOG\O1_MF_1_7N5VTXSW_.LOG deletado
arquivo da instância auxiliar E:\AUXILIARY\BD02\DATAFILE\O1_MF_SYSAUX_7N5VRWG5_.DBF deletado
arquivo da instância auxiliar E:\AUXILIARY\BD02\DATAFILE\O1_MF_UNDOTBS1_7N5VRWK2_.DBF deletado
arquivo da instância auxiliar E:\AUXILIARY\BD02\DATAFILE\O1_MF_SYSTEM_7N5VRW98_.DBF deletado
arquivo da instância auxiliar E:\AUXILIARY\BD02\CONTROLFILE\O1_MF_7N5VRH6C_.CTL deletado
Finalizado recover em 04/03/2012 16:14:40

Perfeito. A recuperação foi realizada com sucesso.
C:\>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Dom Mar 4 16:15:42 2012

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 status,tablespace_name from dba_tablespaces;

STATUS TABLESPACE_NAME
--------- ------------------------------
ONLINE SYSTEM
ONLINE SYSAUX
ONLINE UNDOTBS1
ONLINE TEMP
ONLINE USERS
OFFLINE TBS_02

6 linhas selecionadas.

Para finalizar, irei alterar o status da tablespace TBS_02 recém-recuperada para ONLINE.
SQL> alter tablespace tbs_02 online;

Tablespace alterado.

Abaixo, veremos as tabelas T1 (TBS_02) e T2 (USERS) respectivamente.
SQL> select * from scott.t1;

ID
----------
1

SQL> select * from scott.t2;

ID
----------
1




12 comentários:

David Siqueira disse...

Edu, incrivel esse artigo gostei muito mesmo. Sou suspeito para falar de RMAN porque desde que aprendi a trabalhar com ele, sempre me surpreendo. Excelente material, excelente artigo com uma didatica impressionante. Parabéns Edu abração meu velho.

Eduardo Legatti disse...

Olá Grande David,

Realmente o RMAN também vem me surpreendendo a cada dia!

Mais uma vez, obrigado pela visita e pelo comentário.

Abraços e até mais ...

Rodrigo Santana disse...

Realmente fantástico Eduardo. Parabéns pelo artigo!!

Abraço.

Eduardo Legatti disse...

Olá Rodrigo,

Obrigado pela visita!

Abraços e até mais ...

Unknown disse...

Olá Eduardo,
Apenas uma dúvida, o DB de homologação esta com problema no utilitário expdp, já abri chamado junto a Oracle até agora nada, vou fazer um procedimento no DB, porém o db esta em modo noarchivelog, até onde sei o rman grava os registros do backup para fazer recovery dentro de tabelas ou do catálogo ou do próprio db.
Seria possível fazer um backup offline apenas de algumas tablespace e se possível fazer um restore no DB com mesmo SID, neste caso será um novo DB com mesmo SID porém tabelas (tablespace) novas, não terá informações do backup. Não sei se tem a possibilidade de fazer um mapeamento deste backup para o DB para um restore.
Abraços.

Eduardo Legatti disse...

Olá Wender,

O RMAN guarda informações de backups físicos no "Control File" do próprio banco de dados e opcionalmente em um catálogo de recuperação criado em um outro banco de dados. Em um banco de dados operando no modo NOARCHIVELOG, o RMAN só consegue fazer cold backup, ou seja, o banco precisa estar no estado MOUNT. O recurso de "tablespaces transportáveis" existe desde a versão do Oracle 8i. Não vai ser via RMAN que você fará isso. Dá uma pesquisada sobre esse assunto. No mais, se o que você realmente quer é fazer um "dump", lembre-se de que os utilitários exp/imp ainda existem. Se Export Datapump "expdp" está dando problema, talvez o "exp" resolva até que você consiga recriar as packages do Datapump.

Abraços

Legatti

Unknown disse...

Bem lembrado Eduardo,
tinha me esquecido que na versão 11g este utilitário permaneceu mesmo com o Data Pump. Bom de fato isso irá resolver meu problema visto que até o momento o problema com o Expdp permanece e acredito que não será resolvido.

Obrigado.

FERNANDES disse...

Olá Eduardo, bom dia
Tive um problema ao executar o procedimento, tentei restabelecer uma tbs de 500gb, o processo foi executado com sucesso até a abertura da instancia auxiliar, após isso o procedimento emitiu o seguinte comando: 'sql statement: alter tablespace BI_DW_ALELO_DATA read only' e ao executa-lo o processo foi abortado com o seguinte erro:
------
RMAN-03002: failure of recover command at 12/30/2016 07:37:54
RMAN-03015: error occurred in stored script Memory Script
RMAN-03009: failure of sql command on clone_default channel at 12/30/2016 07:37:08
RMAN-11003: failure during parse/execution of SQL statement: alter tablespace tbs_x read only
ORA-00604: error occurred at recursive SQL level 1
ORA-00376: file 4 cannot be read at this time
ORA-01110: data file 4: '+DATA/orcl/datafile/users.264.123098456'
------
Não entendo o motivo de fazer referencia a tbs (users) uma vez que nenhum objeto da tbs (tbs_x) tem referencia em outras tablespaces.

Obrigado

[]'s

Eduardo Legatti disse...

Olá Roberto,

Tem certeza que não tem nenhuma referência? Uma FK, etc?? Pesquise sobre a procedure TS_PITR_CHECK para fazer uma checagem desses pré requisitos.

Se realmente não existe referência nenhuma referência para a tablespace USERS, veja se é possível fazer uma simulação incluindo a tablespace USERS no TSPITR.

Abraços,

Legatti

Diegosouzac disse...

Parabéns meu Amigo!! Sou iniciante no mundo da Oracle e gosto muito do Rman, seu artigo foi esclarecedor!!! Que continue sempre assim!! Abraçosss

Diegosouzac disse...

Parabéns pelo artigo meu Amigo!! Muito esclarecedor para quem é iniciante no Rman assim como eu... Abraçoss

Eduardo Legatti disse...

Olá Diego,

Obrigado pela visita!!

Abraços

Legatti

Postagens populares