Oracle Database 12c: RMAN 12c Recuperação de tabelas (Parte I)

Por Joel Perez , Wissem El Khlifi & Rodrigo Mufalani
Publicado en Setembro 2013

Através do presente artigo vamos ter a oportunidade de visualizar e nos aprofundar no tema Recuperação de tabelas provenientes de backups físicos realizados com o utilitário RMAN (Oracle Recovery Manager).

O “Oracle Database 12c” é a nova versão do gerenciador de banco de dados – RDBMS – da Oracle Corporation, e nós usuários da tecnologia Oracle nos perguntamos: “Que tipo de novas funcionalidades a Oracle poderia adicionar? De que forma a Oracle poderia nos surpreender, como sempre fez a cada versão lançada. Ela não só nos surpreendeu com novas funcionalidades, mas com uma nova arquitetura que nos leva a outra época… “à era do Cloud Computing” …

Pessoalmente tive a oportunidade de trabalhar com tecnologia Oracle como DBA desde a versão Oracle 8. O Oracle 8i que foi a primeira versão de banco de dados voltada para a Internet, o 9i também voltado para a internet com maiores recursos disponíveis, me recordo que um dos recursos de maior importância foi a introdução do Real Application Clusters 9i (RAC9i), “nascia a era RAC…”, O Oracle 10g nos surpreendeu com o conceito de ASM e seu conceito de Grid, 11g e 11gR2 sobretudo com melhorias de alto nível relacionadas ao RAC e Dataguard…, O Oracle 12c… Cloud Computing, com mais 500 novas funcionalidades, as quais iremos cobrindo gradualmente através de artigos e outros elementos de ajuda.

Entremos no material… O momento de implantação de uma estratégia de backup e recuperação são diferentes e há muitos fatores a considerar para se estabelecer uma estratégia eficaz. E como sempre é apresentado em conferências, artigos e outros… “Jamais será capaz de implementar uma estratégia de backup eficaz se não é um expert na hora de uma recuperação…”, Quer dizer… A implementação de uma estratégia de recuperação eficaz se baseia em estabelecer as condições e mecanismos para disponibilizar a qualquer momento os itens necessários para uma recuperação rápida e efetiva da base de dados de forma completa ou parcial.

O momento de implementar uma estratégia de recuperação de base de dados deve ser levado em conta os fatores para uma recuperação completa ou parcial da base de dados (BD).Quando se faz uma referência a uma recuperação parcial poderíamos estabelecer que a parcialidade poderia estar focada em: Recuperação completa da estrutura de BD com exceção de alguns “tablespaces”, TSPITR (Tablespace Point-in-Time Recovery) ou parcialidade de seus (objetos) fazendo uso do Oracle “Flashback”.

Antes da versão Oracle Database 12cR1 a recuperação de um objeto não era possível de forma direta a partir de um backup com o RMAN. A metodologia normal consistia em realizar um “restore/recover” total ou parcial da base BD, após isso era necessário executar um outro processo para a extração do objeto e/ou dado a ser restaurado. Alguns mecanismos aplicados poderiam ser os seguintes:

• Export/Import
• Insert-Select direto com “Database links”
• Outros

Algumas dificuldades e implicações com este método estavam baseadas em:

Espaço temporário para o armazenamento do novo BD: De forma normal, a opção mais rápida e comum seria restaurar o BD completo até um determinado ponto de tempo. Sob essas condições isto exigia a disponibilidade de espaço total e uma dificuldade maior se o banco de dados original for grande e não se dispusesse do espaço necessário. Se tiver um pouco mais de experiência em termos de técnicas de restauração poderia se pensar em uma restauração completa com “Skip” daqueles tablespaces que não possuem a informação desejada e assim economizar espaço para restauração dos “datafiles”desejados.

Técnica de Extração manual: Para o presente caso, a técnica manual (Export/Import) não representaria maior dificuldade de execução, mas, está baseado em passos adicionais como exportar a tabela e importar a mesma ou criar “Database links” entre o BD restaurado e o BD destino e etc. Com a nova funcionalidade de recuperação de tabelas do RMAN Database 12c podemos realizar o processo de forma direta com somente uma linha de comando.

Para executar a tarefa utilizando a nova funcionalidade do Oracle 12c é fundamental ter um backup completo dos “tablespaces”:

  • UNDO
  • SYSTEM
  • SYSEXT (caso exista)
  • Necessidade de recuperação de um número pequeno e específico de objetos (tabelas) em um determinado ponto do tempo. Tal como foi assinalado anteriormente, este procedimento poderia ser executado utilizando a técnica de TSPITR, porém, a restauração estaria limitada em seu menor grão em nível de Tablespace, implicando assim na restauração de objeto(s) indesejado(s) juntamente com o(s) que necessita.
  • Recuperação de tabelas que sofreram corrupções lógicas ou tabelas que foram removidas do BD com a opção “PURGE” o que implica que a tabela não esteja disponível na Recyclebin do BD.
  • Quando os blocos do objeto (tabela) foram removidos do “Undo Tablespace” por causa da política de retenção de Undo, e a funcionalidade “Flashback Table” não será capaz de recuperar a mesma.
  • Posteriormente a aplicação de uma DDL (Data Definition Language) e a estrutura da tabela pode ter sido modificada e essas mudanças invalidam a recuperação utilizando “Flashback Table”. “Flashback Table” tem a capacidade de recuperar os dados de uma tabela que disponha da mesma estrutura original no momento que houver uma operação não desejada como um “DELETE” em registros que não deveriam ser deletados ou um “UPDATE” em informações que não deveriam ser atualizadas ou qualquer outra operação que deseja reverter mesmo após um commit.

    Para a recuperação de tabelas vamos utilizar nosso já conhecido comando “RECOVER”,porém, esta vez com a nova funcionalidade do “Oracle Database 12c”. Para executar essa tarefa de recuperação será necessário dispor previamente das seguintes informações:
  • Nome da(s) tabela(s) e/ou partição(es) a serem recuperadas;
  • Ponto no tempo (Data com hora, minutos e segundos) desejado para a recuperação;
  • Especificar que a tabela será importada no BD “Target”;


  • O RMAN utiliza todas essas informações para automatizar o processo de recuperação de tabelas e/ou partições especificadas. Como parte do processo de recuperação, o RMAN cria uma base de dados auxiliar para abrigar os objetos a serem restaurados.

    Os passos para executar a recuperação de tabelas pelo RMAN são os seguintes:
  • Determinar qual backup (backupset) tem a tabela que deseja restaurar com o objetivo de levar a mesma até um ponto no tempo. Internamente o processo que se estabelece utiliza a mesma filosofia de quando desejamos restaurar uma determinada Tablespace de um BD em um determinado ponto no tempo (TSPITR).
  • Criar o BD auxiliar e recuperar a(s) tabela(s) e/ou partição(es) da(s) tabela(s) especificadas no comando “RECOVER”. A localização dos “datafiles” poderá ser especificada de diversas maneiras as quais abordaremos em outra edição dessa mesma série de artigos, entretanto, em nosso exemplo prático realizaremos especificando o caminho completo para os datafiles do BD auxiliar.
  • O processo de recuperação gera um “Data Pump Export Dump File” com o conteúdo da(s) tabela(s) e/ou partição(es) especificadas para serem recuperadas
  • Opcionalmente poderíamos adicionar cláusulas para renomear a(s) tabela(s) e/ou partição(es) no BD Target. O banco de dados “Target” é a origem de onde os dados foram perdidos ou corrompidos de alguma maneira indesejada.

Vejamos um exemplo prático desta impressionante nova funcionalidade do Oracle 12c.

Objetivo: Gerar o “Data Pump Export Dump File” de uma tabela para ser recuperada a partir de um backup realizado com o “RMAN”. Para o presente cenário, somente será gerado o “Data Pump Export Dump File” e não ativaremos a opção de importar o(s) objeto(s) no banco de dados “Target”. O nome do “Pluggable BD” utilizado em nosso exemplo será: ORAWISS12C

Iniciaremos...

Modo “Mount” & “Open” do BD

Vamos realizar uma conexão com o BD “ORAWISS12C” o qual está no modo “MOUNT”, procedendo posteriormente a sua abertura e então ele ficará no modo “OPEN” ou “READ WRITE”.

sandbox1(orawiss):/home/oracle>sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Wed Jun 26 13:31:36 2013

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

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit ProductionWith 
the Partitioning, Automatic Storage Management, OLAP, Advanced Analyticsand Real 
Application Testing options

SQL> select con_id,dbid,NAME,OPEN_MODE from v$pdbs;

    CON_ID       DBID NAME                           OPEN_MODE
---------- ---------- ------------------------------ ----------
         2 4061740350 PDB$SEED                       READ ONLY
         3 1574282659 ORAWISS12C                     MOUNTED

SQL> alter PLUGGABLE database ORAWISS12C open;

Pluggable database altered.

SQL> select con_id,dbid,NAME,OPEN_MODE from v$pdbs;

    CON_ID       DBID NAME                           OPEN_MODE
---------- ---------- ------------------------------ ----------
         2 4061740350 PDB$SEED                       READ ONLY
         3 1574282659 ORAWISS12C                     READ WRITE

SQL>

Criação:

Criação dos recursos (usuário, tablespace e tabela) necessários para o cenário:

SQL>  alter session set container=ORAWISS12C;

Session altered.

SQL> create user wissem identified by wissem;

User created.

SQL>

SQL> grant dba to wissem;

Grant succeeded.

SQL>
SQL> CREATE TABLESPACE TBS_REC DATAFILE AUTOEXTEND ON MAXSIZE 100M;

Tablespace created.

SQL>

SQL> create table wissem.test_rec(ID NUMBER) TABLESPACE TBS_REC;

Table created.

SQL>
SQL>  insert into wissem.test_rec values (1);

1 row created.

SQL> commit;

Commit complete.

SQL>

Realizando o backup do BD

sandbox1(orawiss):/home/oracle>rman

Recovery Manager: Release 12.1.0.1.0 - Production on Wed Jun 26 14:43:35 2013

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

RMAN> CONNECT TARGET "sys AS SYSBACKUP";

target database Password:
connected to target database: ORAWISS (DBID=3257067578)

RMAN> BACKUP PLUGGABLE DATABASE ORAWISS12C;

Starting backup at 06/26/2013 14:44:36
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=270 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00009 
name=+DATA/ORAWISS/E011004AA64F0CF9E0433514DA0A096B/DATAFILE/sysaux.275.819112037
input datafile file number=00008 
name=+DATA/ORAWISS/E011004AA64F0CF9E0433514DA0A096B/DATAFILE/system.274.819112037
input datafile file number=00012 
name=+DATA/ORAWISS/E011004AA64F0CF9E0433514DA0A096B/DATAFILE/tbs_tst.290.819120929
input datafile file number=00013 
name=+DATA/ORAWISS/E011004AA64F0CF9E0433514DA0A096B/DATAFILE/tbs_rec.287.819121381
input datafile file number=00010 
name=+DATA/ORAWISS/E011004AA64F0CF9E0433514DA0A096B/DATAFILE/users.277.819112065
channel ORA_DISK_1: starting piece 1 at 06/26/2013 14:44:38
channel ORA_DISK_1: finished piece 1 at 06/26/2013 14:44:45
piece
handle=+DATA/ORAWISS/E011004AA64F0CF9E0433514DA0A096B/BACKUPSET/2013_06_26/
nnndf0_tag20130626t144437_0.298.819125079 tag=TAG20130626T144437 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:07
Finished backup at 06/26/2013 14:44:45

Starting Control File and SPFILE Autobackup at 06/26/2013 14:44:45
piece handle=+DATA/ORAWISS/AUTOBACKUP/2013_06_26/s_819125085.301.819125085 comment=NONE
Finished Control File and SPFILE Autobackup at 06/26/2013 14:44:46

RMAN>

Perda da Tabela WISSEM.TEST_REC

Para o presente cenário a tabela em questão será excluída propositalmente. Tal como foi mencionado na parte inicial do artigo, no caso que estamos explicando de implementação de uma recuperação de uma tabela acidentalmente eliminada (DROP) ou corrompida logicamente etc, e a mesma necessite de uma restauração/recuperação em um determinado ponto no tempo, utilizando para tal tarefa um backup físico do BD realizado com o Oracle RMAN 12c.

sandbox1(orawiss):/home/oracle>sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Wed Jun 26 14:45:21 2013

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

Connected to:Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit ProductionWith 
the Partitioning, Automatic Storage Management, OLAP, Advanced Analyticsand 
Real Application Testing options

SQL> alter session set container=ORAWISS12C;

Session altered.

SQL> DROP TABLE wissem.test_rec PURGE;

Table dropped.

SQL> select * from wissem.test_rec;
select * from wissem.test_rec
                     *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit 
ProductionWith the Partitioning, Automatic Storage Management, OLAP, Advanced 
Analyticsand Real Application Testing options

sandbox1(orawiss):/home/oracle>

Recuperação:

Procederemos com a execução do comando “RECOVER” com a nova opção que é o objeto principal do presente artigo. Para o estudo de caso apresentado somente será gerado o “Data Pump Export Dump File” o qual poderá ser utilizado posteriormente para realizar o “Import” da tabela a ser recuperada. É importante ressaltar a opção no comando “NOTABLEIMPORT” que indica que a tabela não será importada no BD “Target”.

Antes da execução vamos checar a sintaxe do comando que será utilizado:

RMAN> RECOVER TABLE username.tablename 
      UNTIL TIME 'TIMESTAMP…' 
      AUXILIARY DESTINATION '/u01/tablerecovery' 	
      DATAPUMP DESTINATION '/u01/dpump' 		
      DUMP FILE 'tablename.dmp' 		
      NOTABLEIMPORT    
      REMAP TABLE 'username.tablename':'username.new_table_name';

TABLE username.tablename: Tabela que será recuperada
UNTIL TIME 'TIMESTAMP…': Momento até onde a tabela será recuperada
AUXILIARY DESTINATION: Diretório onde o BD auxiliar será criado
DATAPUMP DESTINATION: Diretório onde será gerado o “Data Pump Export Dump File”
DUMP FILE: Nome do “Data Pump Export Dump File” a ser gerado
NOTABLEIMPORT: Opção de controle para que a(s) tabela(s) não sejam importadas no BD “Target”
REMAP TABLE 'username.tablename': 'username.new_table_name': Opção para renomear a tabela que será restaurada no BD “Target” em outro momento.

Execução

sandbox1(orawiss):/home/oracle>rman

Recovery Manager: Release 12.1.0.1.0 - Production on Wed Jun 26 15:11:52 2013

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

RMAN> CONNECT TARGET "sys AS SYSBACKUP";

target database Password:
connected to target database: ORAWISS (DBID=3257067578)

RMAN>

RMAN> RECOVER TABLE WISSEM.TEST_REC OF PLUGGABLE DATABASE ORAWISS12C UNTIL TIME 
"to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')" AUXILIARY DESTINATION 
'/tmp' DATAPUMP DESTINATION '/tmp' DUMP FILE 'tst_dump.dmp' NOTABLEIMPORT;

Starting recover at 06/26/2013 15:22:08
using channel ORA_DISK_1
RMAN-05026: WARNING: presuming following set of tablespaces applies to specified 
Point-in-Time

List of tablespaces expected to have UNDO segments
Tablespace SYSTEM
Tablespace UNDOTBS1

Creating automatic instance, with SID='eErl'

initialization parameters used for automatic instance:
db_name=ORAWISS
db_unique_name=eErl_pitr_ORAWISS12C_ORAWISS
compatible=12.1.0.0.0
db_block_size=8192
db_files=200
sga_target=1G
processes=80
diagnostic_dest=/opt/app/oracle
db_create_file_dest=/tmp
log_archive_dest_1='location=/tmp'
enable_pluggable_database=true
_clone_one_pdb_recovery=true
#No auxiliary parameter file used

starting up automatic instance ORAWISS

Oracle instance started

Total System Global Area    1068937216 bytes

Fixed Size                     2296576 bytes
Variable Size                281019648 bytes
Database Buffers             780140544 bytes
Redo Buffers                   5480448 bytes
Automatic instance created

contents of Memory Script:
{
# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD: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';
}
executing Memory Script

executing command: SET until clause

Starting restore at 06/26/2013 15:22:21
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=82 device type=DISK

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: reading from backup piece 
+DATA/ORAWISS/AUTOBACKUP/2013_06_26/s_819125085.301.819125085
channel ORA_AUX_DISK_1: piece 
handle=+DATA/ORAWISS/AUTOBACKUP/2013_06_26/s_819125085.301.819125085 
tag=TAG20130626T144445
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:05
output file name=/tmp/ORAWISS/controlfile/o1_mf_8wphvkt9_.ctl
Finished restore at 06/26/2013 15:22:26

sql statement: alter database mount clone database

sql statement: alter system archive log current

contents of Memory Script:
{
# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD: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  4 to new;
set newname for clone datafile  3 to new;
set newname for clone datafile  8 to new;
set newname for clone datafile  9 to new;
set newname for clone tempfile  1 to new;
set newname for clone tempfile  3 to new;
# switch all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile  1, 4, 3, 8, 9;
switch clone datafile all;
}
executing Memory Script

executing command: SET until clause

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

renamed tempfile 1 to /tmp/ORAWISS/datafile/o1_mf_temp_%u_.tmp in control file
renamed tempfile 3 to /tmp/ORAWISS/datafile/o1_mf_temp_%u_.tmp in control file

Starting restore at 06/26/2013 15:22:35
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to 
/tmp/ORAWISS/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00004 to 
/tmp/ORAWISS/datafile/o1_mf_undotbs1_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00003 to 
/tmp/ORAWISS/datafile/o1_mf_sysaux_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece 
+DATA/ORAWISS/BACKUPSET/2013_06_26/nnndf0_tag20130626t123856_0.282.819117537
channel ORA_AUX_DISK_1: piece 
handle=+DATA/ORAWISS/BACKUPSET/2013_06_26/nnndf0_tag20130626t123856_0.282.819117537
tag=TAG20130626T123856
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:25
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00008 to 
/tmp/ORAWISS/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00009 to 
/tmp/ORAWISS/datafile/o1_mf_sysaux_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece 
+DATA/ORAWISS/E011004AA64F0CF9E0433514DA0A096B/BACKUPSET/2013_06_26/
nnndf0_tag20130626t144437_0.298.819125079
channel ORA_AUX_DISK_1: piece 
handle=+DATA/ORAWISS/E011004AA64F0CF9E0433514DA0A096B/BACKUPSET/2013_06_26/
nnndf0_tag20130626t144437_0.298.819125079 tag=TAG20130626T144437
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15
Finished restore at 06/26/2013 15:23:15

datafile 1 switched to datafile copy
input datafile copy RECID=8 STAMP=819127395 file 
name=/tmp/ORAWISS/datafile/o1_mf_system_8wphvvn0_.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=9 STAMP=819127395 file 
name=/tmp/ORAWISS/datafile/o1_mf_undotbs1_8wphvvnm_.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=10 STAMP=819127395 file 
name=/tmp/ORAWISS/datafile/o1_mf_sysaux_8wphvvnd_.dbf
datafile 8 switched to datafile copy
input datafile copy RECID=11 STAMP=819127395 file 
name=/tmp/ORAWISS/datafile/o1_mf_system_8wphwnrj_.dbf
datafile 9 switched to datafile copy
input datafile copy RECID=12 STAMP=819127395 file 
name=/tmp/ORAWISS/datafile/o1_mf_sysaux_8wphwnrb_.dbf

contents of Memory Script:
{
# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')";
# online the datafiles restored or switched
sql clone "alter database datafile  1 online";
sql clone "alter database datafile  4 online";
sql clone "alter database datafile  3 online";
sql clone 'ORAWISS12C' "alter database datafile
 8 online";
sql clone 'ORAWISS12C' "alter database datafile
 9 online";
# recover and open database read only
recover clone database tablespace  "SYSTEM", "UNDOTBS1", "SYSAUX", 
"ORAWISS12C":"SYSTEM", "ORAWISS12C":"SYSAUX";
sql clone 'alter database open read only';
}
executing Memory Script

executing command: SET until clause

sql statement: alter database datafile  1 online

sql statement: alter database datafile  4 online

sql statement: alter database datafile  3 online

sql statement: alter database datafile  8 online

sql statement: alter database datafile  9 online

Starting recover at 06/26/2013 15:23:16
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 15 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_15.279.819117567
archived log for thread 1 with sequence 16 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_16.278.819123911
archived log for thread 1 with sequence 17 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_17.294.819123955
archived log for thread 1 with sequence 18 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_18.296.819123981
archived log for thread 1 with sequence 19 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_19.295.819124251
archived log for thread 1 with sequence 20 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_20.297.819124297
archived log for thread 1 with sequence 21 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_21.299.819124453
archived log for thread 1 with sequence 22 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_22.286.819125213
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_15.279.819117567 thread=1 
sequence=15
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_16.278.819123911 thread=1 
sequence=16
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_17.294.819123955 thread=1 
sequence=17
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_18.296.819123981 thread=1 
sequence=18
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_19.295.819124251 thread=1 
sequence=19
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_20.297.819124297 thread=1 
sequence=20
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_21.299.819124453 thread=1 
sequence=21
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_22.286.819125213 thread=1 
sequence=22
media recovery complete, elapsed time: 00:00:05
Finished recover at 06/26/2013 15:23:22

sql statement: alter database open read only

contents of Memory Script:
{
sql clone 'alter pluggable database  ORAWISS12C open read only';
}
executing Memory Script

sql statement: alter pluggable database  ORAWISS12C open read only

contents of Memory Script:
{
sql clone "create spfile from memory";
shutdown clone immediate;
startup clone nomount;
sql clone "alter system set  control_files =
  ''/tmp/ORAWISS/controlfile/o1_mf_8wphvkt9_.ctl'' comment=
 ''RMAN set'' scope=spfile";
shutdown clone immediate;
startup clone nomount;
# mount database
sql clone 'alter database mount clone database';
}
executing Memory Script

sql statement: create spfile from memory

database closed
database dismounted
Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area    1068937216 bytes

Fixed Size                     2296576 bytes
Variable Size                285213952 bytes
Database Buffers             775946240 bytes
Redo Buffers                   5480448 bytes

sql statement: alter system set  control_files =   
''/tmp/ORAWISS/controlfile/o1_mf_8wphvkt9_.ctl'' comment= ''RMAN set'' scope=spfile

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area    1068937216 bytes

Fixed Size                     2296576 bytes
Variable Size                285213952 bytes
Database Buffers             775946240 bytes
Redo Buffers                   5480448 bytes

sql statement: alter database mount clone database

contents of Memory Script:
{
# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')";
# set destinations for recovery set and auxiliary set datafiles
set newname for datafile  13 to new;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile  13;
switch clone datafile all;
}
executing Memory Script

executing command: SET until clause

executing command: SET NEWNAME

Starting restore at 06/26/2013 15:24:01
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=15 device type=DISK

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00013 to 
/tmp/EERL_PITR_ORAWISS12C_ORAWISS/datafile/o1_mf_tbs_rec_%u_.dbf
channel ORA_AUX_DISK_1: reading from backup piece 
+DATA/ORAWISS/E011004AA64F0CF9E0433514DA0A096B/BACKUPSET/2013_06_26/
nnndf0_tag20130626t144437_0.298.819125079
channel ORA_AUX_DISK_1: piece 
handle=+DATA/ORAWISS/E011004AA64F0CF9E0433514DA0A096B/BACKUPSET/2013_06_26/
nnndf0_tag20130626t144437_0.298.819125079 tag=TAG20130626T144437
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 06/26/2013 15:24:03

datafile 13 switched to datafile copy
input datafile copy RECID=14 STAMP=819127443 file 
name=/tmp/EERL_PITR_ORAWISS12C_ORAWISS/datafile/o1_mf_tbs_rec_8wphylkm_.dbf

contents of Memory Script:
{
# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')";
# online the datafiles restored or switched
sql clone 'ORAWISS12C' "alter database datafile
 13 online";
# recover and open resetlogs
recover clone database tablespace  "ORAWISS12C":"TBS_REC", "SYSTEM", "UNDOTBS1", 
"SYSAUX", "ORAWISS12C":"SYSTEM", "ORAWISS12C":"SYSAUX" delete archivelog;
alter clone database open resetlogs;
}
executing Memory Script

executing command: SET until clause

sql statement: alter database datafile  13 online

Starting recover at 06/26/2013 15:24:03
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 22 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_22.286.819125213
archived log file 
name=+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_22.286.819125213 thread=1 
sequence=22
media recovery complete, elapsed time: 00:00:00
Finished recover at 06/26/2013 15:24:05

database opened

contents of Memory Script:
{
sql clone 'alter pluggable database  ORAWISS12C open';
}
executing Memory Script

sql statement: alter pluggable database  ORAWISS12C open

contents of Memory Script:
{
# create directory for datapump import
sql 'ORAWISS12C' "create or replace directory
TSPITR_DIROBJ_DPDIR as ''
/tmp''";
# create directory for datapump export
sql clone 'ORAWISS12C' "create or replace directory
TSPITR_DIROBJ_DPDIR as ''
/tmp''";
}
executing Memory Script

sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/tmp''

sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/tmp''

Performing export of tables...
   EXPDP> Starting "SYS"."TSPITR_EXP_eErl_eomi":
   EXPDP> Estimate in progress using BLOCKS method...
   EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
   EXPDP> Total estimation using BLOCKS method: 64 KB
   EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE
   EXPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
   EXPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
   EXPDP> . . exported "WISSEM"."TEST_REC"                         5.031 KB       1 rows
   EXPDP> Master table "SYS"."TSPITR_EXP_eErl_eomi" successfully loaded/unloaded
   EXPDP> ******************************************************************************
   EXPDP> Dump file set for SYS.TSPITR_EXP_eErl_eomi is:
   EXPDP>   /tmp/tst_dump.dmp
   EXPDP> Job "SYS"."TSPITR_EXP_eErl_eomi" successfully completed at Wed Jun 26 
   15:24:46 2013 elapsed 0 00:00:21
Export completed

Not performing table import after point-in-time recovery

Removing automatic instance
shutting down automatic instance
Oracle instance shut down
Automatic instance removed
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_temp_8wphxho3_.tmp deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_temp_8wphxcsy_.tmp deleted
auxiliary instance file 
/tmp/EERL_PITR_ORAWISS12C_ORAWISS/onlinelog/o1_mf_3_8wphyp2g_.log deleted
auxiliary instance file 
/tmp/EERL_PITR_ORAWISS12C_ORAWISS/onlinelog/o1_mf_2_8wphyost_.log deleted
auxiliary instance file 
/tmp/EERL_PITR_ORAWISS12C_ORAWISS/onlinelog/o1_mf_1_8wphyolx_.log deleted
auxiliary instance file 
/tmp/EERL_PITR_ORAWISS12C_ORAWISS/datafile/o1_mf_tbs_rec_8wphylkm_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_sysaux_8wphwnrb_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_system_8wphwnrj_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_sysaux_8wphvvnd_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_undotbs1_8wphvvnm_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_system_8wphvvn0_.dbf deleted
auxiliary instance file /tmp/ORAWISS/controlfile/o1_mf_8wphvkt9_.ctl deleted
Finished recover at 06/26/2013 15:24:48

RMAN>

RMAN> exit

Recovery Manager complete.


Durante a execução puderam se observar detalhes importantes que farão com que você leitor possa entender os processos internos realizados.

Vejamos detalhes do mesmo:

• Execução do comando “RECOVER TABLE”

RMAN> RECOVER TABLE WISSEM.TEST_REC OF PLUGGABLE DATABASE ORAWISS12C UNTIL TIME 
"to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')" AUXILIARY DESTINATION 
'/tmp' DATAPUMP DESTINATION '/tmp' DUMP FILE 'tst_dump.dmp' NOTABLEIMPORT;

• Criação automática do BD Auxiliar (Neste caso SID=’eErl’)

Creating automatic instance, with SID='eErl'

initialization parameters used for automatic instance:
db_name=ORAWISS
db_unique_name=eErl_pitr_ORAWISS12C_ORAWISS
compatible=12.1.0.0.0
db_block_size=8192
db_files=200
sga_target=1G
processes=80
diagnostic_dest=/opt/app/oracle
db_create_file_dest=/tmp
log_archive_dest_1='location=/tmp'
enable_pluggable_database=true
_clone_one_pdb_recovery=true

• Restauração dos “Controlfiles” para iniciar o processo de recuperação

# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')";
# restore the controlfile
restore clone controlfile;
# mount the controlfile

• Processo de Restauração de “Tablespaces”

# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD: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  4 to new;
set newname for clone datafile  3 to new;
set newname for clone datafile  8 to new;
set newname for clone datafile  9 to new;
set newname for clone tempfile  1 to new;
set newname for clone tempfile  3 to new;
# switch all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile  1, 4, 3, 8, 9;
switch clone datafile all;

• Restauração de “Datafiles” no caminho indicada pelo parâmetro “AUXILIARY DESTINATION”

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to 
/tmp/ORAWISS/datafile/o1_mf_system_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00004 to 
/tmp/ORAWISS/datafile/o1_mf_undotbs1_%u_.dbf
channel ORA_AUX_DISK_1: restoring datafile 00003 to 
/tmp/ORAWISS/datafile/o1_mf_sysaux_%u_.dbf

• Recuperação “Until Time” do BD Auxiliar

Starting recover at 06/26/2013 15:23:16
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 15 is already on disk as file 
+DATA/ORAWISS/ARCHIVELOG/2013_06_26/thread_1_seq_15.279.819117567
…

# set requested point in time
set until  time "to_date('2013-06-26:14:45:00','YYYY-MM-DD:HH24:MI:SS')";
# set destinations for recovery set and auxiliary set datafiles
set newname for datafile  13 to new;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile  13;
switch clone datafile all;

• Geração do “Data Pump Export Dump File”

# create directory for datapump export
sql clone 'ORAWISS12C' "create or replace directory
TSPITR_DIROBJ_DPDIR as ''
/tmp''";
}
executing Memory Script

sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/tmp''

sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/tmp''

Performing export of tables...
   EXPDP> Starting "SYS"."TSPITR_EXP_eErl_eomi":
   EXPDP> Estimate in progress using BLOCKS method...
   EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
   EXPDP> Total estimation using BLOCKS method: 64 KB
   EXPDP> Processing object type TABLE_EXPORT/TABLE/TABLE
   EXPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
   EXPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
   EXPDP> . . exported "WISSEM"."TEST_REC"            5.031 KB       1 rows
   EXPDP> Master table "SYS"."TSPITR_EXP_eErl_eomi" successfully loaded/unloaded
   EXPDP> ******************************************************************************
   EXPDP> Dump file set for SYS.TSPITR_EXP_eErl_eomi is:
   EXPDP>   /tmp/tst_dump.dmp
   EXPDP> Job "SYS"."TSPITR_EXP_eErl_eomi" successfully completed at Wed Jun 26 
   15:24:46 2013 elapsed 0 00:00:21
Export completed

Not performing table import after point-in-time recovery

“Data Pump Export Dump File” resultante: EXPDP> /tmp/tst_dump.dmp

• Remoção automática dos componentes do BD “Auxiliar”

Removing automatic instance
shutting down automatic instance
Oracle instance shut down
Automatic instance removed
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_temp_8wphxho3_.tmp deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_temp_8wphxcsy_.tmp deleted
auxiliary instance file 
/tmp/EERL_PITR_ORAWISS12C_ORAWISS/onlinelog/o1_mf_3_8wphyp2g_.log deleted
auxiliary instance file 
/tmp/EERL_PITR_ORAWISS12C_ORAWISS/onlinelog/o1_mf_2_8wphyost_.log deleted
auxiliary instance file 
/tmp/EERL_PITR_ORAWISS12C_ORAWISS/onlinelog/o1_mf_1_8wphyolx_.log deleted
auxiliary instance file 
/tmp/EERL_PITR_ORAWISS12C_ORAWISS/datafile/o1_mf_tbs_rec_8wphylkm_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_sysaux_8wphwnrb_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_system_8wphwnrj_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_sysaux_8wphvvnd_.dbf deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_undotbs1_8wphvvnm_.dbf 
deleted
auxiliary instance file /tmp/ORAWISS/datafile/o1_mf_system_8wphvvn0_.dbf deleted
auxiliary instance file /tmp/ORAWISS/controlfile/o1_mf_8wphvkt9_.ctl deleted
Finished recover at 06/26/2013 15:24:48

Conclusão

Assim como mostrado no decorrer deste artigo, esta nova funcionalidade nos presenteia com a facilidade de recuperar tabelas e/ou partições com um processo direto otimizando o uso de recursos como: disco, memória e outros componentes relacionados ao processo.

O comando “RECOVER TABLE” não somente tem impacto na ação direta que realiza, mas também como a troca de conceito atual onde muitas empresas executam backups lógicos para prevenir no caso de uma recuperação de alguns objetos sem ter que restaurar a base completa.

Antes de finalizar o artigo vamos analisar um quadro comparativo das vantagens que possui o novo comando “RECOVER TABLE” com o antigo TSPITR (Tablespace Point-in-Time Recovery)

 

Atividade
TSPITR
“RECOVER TABLE”
Criação de um BD para a Recuperação
Deve ser criado manualmente com o DBCA (Database Configuration Assistant)
O BD auxiliar é criado automaticamente.
Configuração Parâmetros (SPfile & Init)
O DBA precisará de tempo para escolher valores modestos com o objetivo de não sobrecarregar o sistema operacional do BD de produção com o novo BD que será usado para a restauração.
Os valores para realizar esta tarefa são configurados otimamente como parte do processo, não desperdiçando recursos.
Proceso de “Restore” do BD
O DBA precisará de tempo para escolher se fará o restore no mesmo servidor ou se irá restaurar em um outro servidor alternativo. Se optar pelo mesmo servidor do original o método ideal seria utilizar o RMAN “Duplicate” para evitar complicações de trocas de nomes com o novo BD e o de original. Se decidir usar um outro servidor poderia escolher o mesmo nome do BD de produção ou usar o um outro nome alternativo. Deve-se destacar que pode haver risco danos no BD original ocasionados por falha humana na execução do comando “RMAN Duplicate” existindo estas 2condições: • Estando o BD original com seus “datafiles” armazenados em “filesystem”; • Valores de conversão mal configurados ( DB_FILE_NAME_CONVERT & LOG_FILE_NAME_CONVERT ); Se essas configurações não forem bem feitas poderia haver risco de dano nos datafiles do BD original e eles acabarem sendo sobrescritos. Se o DBA decidisse executar “RMAN Duplicate” no mesmo servidor de produção seria aconselhável que o mesmo tivesse um nível de alto “expertise” evitando falhas humanas.
O nome do BD auxiliar é ajustado automaticamente com parte do processo, não existe risco algum de realizar o procedimento no mesmo servidor de produção sempre atendando ao uso da cláusula “NOTABLEIMPORT” para evitar sobrepor dados no ambiente de produção.
Restauração de “Tablespaces”
O DBA terá de gastar um pouco de tempo para determinar em qual “tablespace” a tabela a ser restaurada está abrigada. No modo ótimo poderá se utilizar o “RESTORE DATABASE” realizando “skip” de tablespaces não desejadas, restaurando apenas os tablespaces de sistema (System, Sysaux, Undo, etc…) e os “tablespaces” que contenham a ou as tabelas a serem recuperadas. É importante destacar que no tablespace de dados onde se encontram as tabelas a serem recuperadas podem existir outros objetos que também serão recuperados como parte do processo sem necessidade, o que demanda tempo de restauração e espaço em disco.
O processo de “Restore/Recover” é automático, restaurando somente os “tablespaces” de sistema e aqueles que contenham a(s) tabela(s) a serem recuperadas, porém só é restaurado no tablespace os objetos alvo da restauração, sendo assim não há desperdício de tempo e nem de espaço em disco.
Geração de “Data Pump Export Dump File”
O DBA através de um processo manual deverá criar um DIRECTORY no Oracle com o comando (“Create Directory…” ) e realizar manualmente o processo de exportar e/ou importar a tabela no BD original, que também é chamado “Target”
O processo de criação doDIRECTORY, o “export” e o “import” são automáticos e é tudo configurável através do comando “RECOVER TABLE”
Remoção do BD
O DBA deverá remover o BD manualmente ou através do DBCA.
O processo do comando “RECOVER TABLE” remove o BD auxiliar automaticamente.

 


Joel é um DBA expert com mais de 12 anos de experiência, especializado nas áreas de bases de dados com especial ênfase em soluções de alta disponibilidade (RAC, Dataguard, e outros). É um palestrante habitual em eventos de Oracle como: OTN LAD TOUR e outros. É o primeiro latino-americano a ser nomeado "OTN Expert " no ano de 2003 e é Oracle ACE Director.

Wissem é um DBA Sr. com mais de 12 anos de experiência, especializado nas soluções RAC & Dataguard. Atualmente trabalha para “Schneider Electric / APC Global operations”. Wissem trabalhou também para várias empresas internacionais líderes em seus sectores como Bancos, Telecomunicações, Internet e Energia. Wissem foi o primer Oracle ACE na Espanha e é um OCP DBA.

Mufalani é um DBA Sr. com mais de 8 anos de experiência, começou com o Oracle 8i, mas teve a oportunidade de dar suporte a Oracle 7.3.4 em diante. É especialista em banco de dados Oracle com foco principal em Performance & Tuning e RAC. É palestrante em eventos de Oracle como: OTN LAD TOUR e outros.Atualmente trabalha como consultor diversas empresas no segmento de variados ramos como: Educação, Saúde, Tecnologia, Seguros e etc. Foi o terceiro Oracle ACE a ser nomeado no Brasil e é OCP DBA nas versões 10g e 11g.