RMAN Database 12c: Recuperación de tablas ( Parte I )

Por Joel Pérez y Wissem El Khlifi
Publicado en julio 2013

Índice de contenidos

1. RMAN Database 12c: Recuperación de tablas ( Parte I )
2. RMAN Database 12c: Recuperación de tablas ( Parte II )
3. RMAN Database 12c: Recuperación de tablas ( Parte III )
4. RMAN Database 12c: Recuperación de tablas ( Parte IV )

Reciban estimados tecnólogos Oracle un cordial saludo. A través del presente artículo, tendremos la oportunidad de visualizar y adentrarnos un poco en el tema de recuperación de tablas provenientes de respaldos realizados con el utilitario RMAN ( Oracle Recovery Manager ).

“Database12c” la nueva versión de manejador de base de datos de Oracle Corporation, nosotros los tecnólogos Oracle nos preguntábamos “que mas…” podría Oracle adicionar como nuevas características?, de que forma Oracle nos iba a sorprender esta vez y como siempre, las nuevas características y nueva arquitectura no solo nos sorprenden sino que una vez mas nos llevan a otra era…, “Cloud Computing”…

Personalmente he tenido la oportunidad de trabajar con tecnología Oracle como DBA desde su versión 8. 8i la era del internet, 9i la era del internet con mayores elementos, recuerdo que uno de los componentes de mayor importancia fue la presentación de RAC9i “la era naciente de RAC…”, 10g nos sorprendió con el concepto de ASM… y filosofía Grid, 11g & 11g R2 sobre todo por sus mejoras de alto nivel relacionadas con RAC & Data Guard…, 12c… Cloud Computing, nuevas características… mas de 500 las cuales iremos cubriendo gradualmente a través de artículos y otros elementos de ayuda.

Entremos en materia… al momento de plantear una estrategia de respaldo y recuperación son diversos y múltiples los factores a tomar en cuenta para plantear y establecer una excelente estrategia. Y tal como siempre expreso en conferencias, artículos, y otros… “Jamás serás capaz de plantear una excelente estrategia de respaldo sino eres experto recuperando…”, es decir… el planteamiento de una excelente estrategia de recuperación se basa en establecer las condiciones y mecanismos, para poseer en cualquier momento en modo optimo los elementos necesarios para una recuperación rápida y efectiva de la base de datos en forma completa o parcial.

Al momento de plantear una estrategia de recuperación de base de datos se toma en cuenta los factores para una recuperación completa o parcial de la base de datos ( BBDD ), cuando se hace referencia a una recuperación parcial podríamos establecer que la parcialidad podria estar enfocada a: restauración completa de la estructura de la BBDD exceptuando “tablespaces”, TSPITR ( Tablespace Point-in-Time Recovery ) o parcialidad de su contenido ( objetos ) haciendo uso de Oracle “Flashback”.

Previo a la versión de base de datos 12cR1 la recuperación de un objeto no se podía realizar de forma directa desde un respaldo tomado con RMAN. La metodología usual consistía en realizar un “restore/recover” total o parcial de la BBDD y para así con un proceso posterior poder efectuar la extracción del mismo. Algunos mecanismos podrían ser los siguientes:

  • Export/Import
  • Insert-Select directo o con “Database links”
  • u otros

Algunas de las dificultades o implicaciones con el método anterior estaban basadas en:

Espacio para alojar la nueva BBDD: de forma regular la opción más rápida y común a implementar seria restaurar la BBDD completa hasta un determinado punto del tiempo. Bajo estas condiciones esto exigiría la disponibilidad del espacio total de la misma lo cual podría representar una dificultad si la BBDD original es de gran tamaño o si no se dispone del espacio necesario. Si se posee un poco mas de experiencia en términos de técnicas de restauración se podría pensar en la técnica de restauración total realizando el “skip” de todos aquellos tablespaces que no posean información deseada y asi ahorrar espacio de restauración de “datafiles”.

Técnica de Extracción manual: para el presente caso la técnica manual ( Export/Import ) no representaría mayor dificultad de llevado a cabo mas esta basado en pasos adicionales como exportar la tabla, importar la misma o crear “database links” entre la BBDD restaurada y la BBDD destino, etc

Con la nueva característica de recuperación de tablas y particiones de tablas de RMAN Database 12c podremos realizar el proceso de forma directa con una sola línea de comando.

Para llevar a cabo la tarea de utilizar la nueva característica es fundamental contar un respaldo full de los “tablespaces”:

  • UNDO
  • SYSTEM
  • SYSAUX
  • SYSEXT ( en caso de que existiese )

Y el “tablespace” correspondiente que posea la tabla o partición deseada a recuperar.

Los requisitos están basados en los elementos necesarios para conformar una nueva BBDD la cual será denominada como BBDD Auxiliar. La BBDD Auxiliar es una BBDD temporal creada para generar un “Data Pump export dump file” que será objeto de contenido de datos para la obtención finalmente del objeto deseado ( Tabla a Recuperar ). La BBDD Auxiliar no representa una BBDD que deba crearse previo al proceso de la ejecución del comando. La misma es creada de forma automática durante el proceso de “RECOVER” y los mecanismos de acción del mismo comando “RECOVER” remueven la misma al final del proceso.

La recuperación de tablas y/o particiones de tablas provenientes de un respaldo de RMAN son útiles en los siguientes escenarios:

  • Necesidad de recuperación de un número pequeño o específico de tablas a un determinado punto del tiempo. Tal como fue señalado en líneas anteriores, esto pudiese ser llevado a cabo con la técnica de TSPITR pero la restauración estaría limitada en su grado mas fino a realizarla a nivel de “tablespace” implicando así restauración de objetos no deseados.
  • Recuperación de tablas que han sido objeto de corrupciones lógicas o tablas que han sido removidas de la BBDD con opción regular o “purge” lo cual implica que la tabla ya no estaría disponible inclusive en el “recycle bin” de la BBDD.
  • Cuando el objeto ( tabla ) ha sido removido del “Undo” tablespace a causa de la política de retención del mismo, la característica “Flashback Table” no puede realizar la recuperación del mismo.
  • Posterior a la aplicación de una sentencia DDL ( Data Definition Languague ) la estructura de la tabla podría haber sufrido cambios, dichos cambios anulan la posibilidad de acción de recuperación utilizando la característica “Flashback Table”. “Flashback Table” posee la capacidad de recuperar datos sobre una tabla que aun disponga de la misma estructura original al momento de haber realizado la operación no deseada como borrar registros, actualizar registros no deseado o cualquier otra operación que se desee revertir.

Para la recuperación de tablas se utilizara el ya conocido comando “RECOVER” pero esta vez con funcionalidades nuevas propias de “Oracle Database 12c”. Para llevar a cabo la tarea de recuperación es necesario disponer de la siguiente información:

  • Nombre de la(s) tabla(s) y/o partición(es) a ser recuperadas
  • Punto en el tiempo ( Fecha con hora, minutos y segundos ) deseado para la recuperación
  • Especificar si la tabla será o no importada en la BBDD “target”

RMAN utiliza toda esta información para automatizar el proceso de recuperación de las tablas especificadas y/o particiones de tablas especificadas, como parte del proceso de recuperación, RMAN crea una base de datos auxiliar para alojar los objetos a ser restaurados.

Los pasos llevados a cabo por RMAN para la recuperación de tablas y/o particiones de tablas son los siguientes:

  • Determina cual respaldo ( backup sets ) poseen la tabla deseada a restaurar con el objetivo de llevarla al punto deseado en el tiempo. Internamente el proceso de búsqueda se establece bajo la misma filosofía como cuando deseamos restaurar la BBDD o un determinado “tablespace” a un determinado punto en el tiempo.
  • Crea la BBDD auxiliar y recupera en ella la(s)tabla(s) y/o partición(es) de tabla(s) especificadas en la sentencia de “RECOVER”. La locación de “datafiles” podrá ser especificada en diversos modos lo cual abordaremos en otra edición de esta misma serie de artículos, sin embargo en el ejemplo practico que realizaremos se especificara la ruta para los “datafiles” de la nueva BBDD auxiliar.
  • El proceso de recuperación genera un “Data Pump export dump file” con el contenido de la(s)tabla(s) y/o partición(es) de tabla(s) especificadas a ser recuperadas
  • Opcionalmente se podrían establecer las clausulas para renombrar tablas y/o particiones en la BBDD “target”. La BBDD “Target” es la BBDD original donde el objeto fue perdido o corrupto de alguna manera no deseada.

Veamos un ejemplo práctico de esta valiosa nueva característica.

Objetivo: Generar el “Data Pump export dump file” de una tabla a recuperar proveniente un respaldo realizado con “RMAN”. Para el presente escenario, solo se generara el “Data Pump export dump file”, no activaremos la opción de que el objeto deseado de recuperación sea importado en la BBDD “Target”

Nombre de BBDD “Pluggable” a ser usada en nuestro ejemplo: ORAWISS12C

Iniciemos...

Modo “Mount” & “Open” de la BBDD

Se establecerá conexión con la BBDD “ORAWISS12C” la cual se encuentra originalmente en estado “Mount”, procediendo posteriormente a su apertura.

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 Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and 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>

Creación

Creación de recursos ( usuario, “tablespace” & tabla ) necesarios para el escenario

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 el respaldo de la BBDD

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>

Perdida de Tabla

Para el presente caso la tabla será premeditadamente borrada. Tal como fue mencionada en la parte inicial del artículo, el caso que estamos desarrollando es el planteamiento de recuperación en caso de que una tabla sea accidentalmente borrada, corrupta, etc y la misma necesite ser recuperada/restaurada a un determinado punto del tiempo, disponiendo para la tarea un backup de la BBDD realizado con RMAN.

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 Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and 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 Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options
sandbox1(orawiss):/home/oracle>

Recuperación

Procederemos a la ejecución del comando “RECOVER” con la nueva opción objeto del presente artículo. Para el caso presente solo se generara el “Data Pump export dump file” el cual podrá ser utilizado posteriormente para el “Import” de la tabla a ser recuperada. Es importante resaltar la opción “NOTABLEIMPORT” lo cual indica que la tabla no será restaurada ( Importada ) en la BBDD “Target”

Antes de la ejecución veamos la sintaxis del comando a 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: Tabla objeto de recuperación
UNTIL TIME 'TIMESTAMP…': Tiempo hasta el cual se establecerá la recuperación de la tabla
AUXILIARY DESTINATION: Directorio de alojamiento para la BBDD Auxiliar a ser creada
DATAPUMP DESTINATION: Directorio de alojamiento para el “Data Pump export dump file” a ser generado
DUMP FILE: Nombre de “Data Pump export dump file” a ser generado
NOTABLEIMPORT: Opción de control para establecer el posible restaurado de la tabla y/o particiones en la BBDD “Target”
REMAP TABLE 'username.tablename': 'username.new_table_name': Opción para renombrar la tabla a restaurar en la BBDD “Target”

Ejecución

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 la ejecución se pudieron observar detalles importantes que harán que usted como lector pueda entender los procesos internos realizados. Veamos detalles del mismo:

• Ejecución del 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;

• Creación automática de la BBDD Auxiliar

Creating automatic instance, with SID='eErl'

• Establecimiento de Parámetros de Inicialización para la Instancia Auxiliar con bajo consumo de recursos

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


• Restaurado de “Controlfiles” para iniciar el proceso de recuperación

# 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

• Proceso de Restauracion 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;

• Restaurado de “Datafiles” en la ruta indicada por el 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

• Recuperación “Until Time” de la BBDD 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;

• Generacion del “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

• Remoción automática de los componentes de la BBDD “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

Conclusiones

Tal como se ha señalado en el desarrollo del artículo, esta nueva característica nos brinda la facilidad de recuperar tablas y/o particiones de tablas con un proceso directo haciendo uso optimo de recursos como: disco, memoria y otros relacionados con el proceso.

El comando “RECOVER TABLE” no solo tiene impacto en la acción directa que realiza, sino también en como lograra cambiar en concepto del papel que juegan los respaldos lógicos que muchas empresas llevaban a cabo para prevenir la posible recuperación de objetos sin tener que restaurar la BBDD completa.

Antes de finalizar el presente artículo veamos cuadro comparativo de las ventajas que posee el nuevo “RECOVER TABLE” con respecto a TSPITR ( Tablespace Point-in-Time Recovery )

Actividad TSPITR “RECOVER TABLE”
Creación de BBDD para la Recuperación Debe ser creada manualmente o con el DBCA ( Database Configuration Assistant ) La BBDD Auxiliar es creada automáticamente
Establecimiento de valores para Archivos de Parametros ( SPfile & Init ) El DBA tomara un tiempo para escoger valores modestos con el objetivo de no sobrecargar el sistema operativo a raíz de esta nueva BBDD a crear Los valores del archivo de parámetro de la instancia auxiliar son adjudicados de forma automática. Los valores automaticos escogidos son bajos, óptimos y suficientes para llevar a cabo la tarea
Proceso de “Restore” de la BBDD El DBA deberá tomar un tiempo para escoger si el restaurado se llevara a cabo en el mismo servidor donde esta alojada la BBDD de producción o en un servidor alterno. Si decidiese escoger el mismo servidor donde se encuentra la BBDD de producción el método ideal seria utilizar “RMAN Duplicate” para evitar complicaciones de cambios de nombres de la nueva BBDD. Si decidiese utilizar algún otro servidor podría escoger utilizar el mismo nombre de la BBDD de producción u otro alternativo.
Hay que destacar que pudiera haber riesgo de perjurio contra la BBDD original si se ejecuta “RMAN Duplicate” existiendo estas 2 condiciones:
• Estando la BBDD original con sus “datafiles” en “filesystem”
• Valores de conversión mal configurados ( DB_FILE_NAME_CONVERT & LOG_FILE_NAME_CONVERT )
Si esas 2 condiciones sucediesen podría haber el riesgo de que “datafiles” de la BBDD original pudiesen ser sobrescritos.
Si el DBA decidiese llevar a cabo “RMAN Duplicate” en el mismo servidor de producción se aconsejaría que el mismo tuviese un alto “expertise” utilizando dicha técnica.
El nombre de la BBDD Auxiliar es adjudicado automáticamente, no existe riesgo alguno de realizar el procedimiento en el mismo servidor de producción siempre y cuando se este atento con el uso de la clausula “NOTABLEIMPORT”
Restaurado de “Tablespaces” El DBA tendrá que tomar una porción de tiempo para determinar en cual “tablespace” se encuentra el objeto a ser recuperado. En modo optimo se podrá utilizar “RESTORE DATABASE” realizando “skip” de tablespaces no deseados, dejando solo los principales de toda BBDD Oracle ( System, Sysaux, Undo, etc… ) y el o los “tablespaces” que contengan la o las tablas a ser recuperadas. Es importante destacar que en el “tablespace” de datos donde se encuentre la(s) tabla(s) a ser recuperadas podrán existir más objetos que conlleven a la necesidad de que el proceso consuma mas espacio en disco y tiempo de restauración. El proceso de “Restore/Recover” es automático, restaurando solo los “tablespaces” principales de la BBDD y el “tablespace” que contenga la(s) tabla(s) a ser recuperadas pero en dicho “tablespace” de datos solo se encontrara(n) el o los objetos deseados de recuperación. Por lo tanto el proceso es óptimo en espacio en disco y tiempo de restauración.
Generación de “Data Pump export dump file” El DBA a través de un proceso manual deberá crear un directorio ( “Create Directory …” ) y realizara manualmente el proceso de exportar y/o importar la tabla en la BBDD original o también llamada “Target” El proceso de creación del directorio, “export” e “import” es automático y todo se configura en el mismo comando “RECOVER TABLE”
Remoción de la BBDD El DBA deberá remover la BBDD manualmente o a través del DBCA El proceso del comando “RECOVER TABLE” remueve automáticamente la BBDD Auxiliar creada

Joel es un experto en DBA con más de 12 años de experiencia, especializado en las áreas de bases de datos con especial énfasis en la solución de alta disponibilidad (RAC, Data Guard, y otros). Es un conferencista habitual en eventos de Oracle como: OTN LAD TOUR y otros. Es el primer latinoamericano en ser nombrado "Experto OTN" en el año 2003 y Oracle ACE Director.

Wissem es un Senior DBA con más de 12 años de experiencia, especializado en soluciones RAC & Data Guard. Actualmente labora para “Schneider Electric / APC Global operations”. Wissem ha trabajado también para varias empresas internacionales líderes en sectores de Bancas, Telecomunicaciones, Internet y Energía. Wissem fue el primer Oracle ACE en España y es un OCP DBA.