Sean bienvenidos estimados tecnólogos de Oracle a este artículo que servirá de base para adentrarnos en los nuevos conceptos de la versión 12c de la base de datos Oracle. Oracle 12c ha cambiado radicalmente con respecto a las versiones anteriores, ha tenido muchas mejoras en el optimizador basado en costos (CBO), en la portabilidad de sus bases de datos, en la flexibilidad al realizar los cambios tanto físicos como lógicos y en su arquitectura haciéndola adecuada para hacer frente al nuevo mundo de “Cloud Computing”. La versión 12c ha introducido principalmente los siguientes dos nuevos conceptos:
En la base de datos Oracle versión 12c, una instancia es asociada con un CDB, esto quiere decir que cada PDB no tiene su propia instancia, sino que las “N” PDBs que existen dentro de un CDB comparten una misma instancia.
Antes de la versión 12c, si se tenía un gran número de aplicaciones dependientes de bases de datos se tenía que tomar en cuenta los siguientes factores:
Oracle 12c ha traído las siguientes ventajas con respecto al antiguo manejo de múltiples instancias manteniendo cada una de ellas una diferente base de datos:
SQL> create pluggable database ora pdb using 'archivo XML'
SQL> archive log list
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;
SQL> conn / as sysdba
SQL> archive log list
SQL> startup
ORACLE instance started.
Total System Global Area 1653518336 bytes
Fixed Size 2289016 bytes
Variable Size 1056965256 bytes
Database Buffers 587202560 bytes
Redo Buffers 7061504 bytes
Database mounted.
Database opened.
SQL> select con_id,dbid,name,open_mode,total_size
fromv$pdbs;
CON_ID DBID NAME OPEN_MODE TOTAL_SIZE
----------------------------------------------------------------
2 4077192876 PDB$SEED READ ONLY 283115520
3 3864440897 ORAPDB MOUNTED 0
SQL> alter session set container=orapdb;
Session altered.
SQL> select name,open_mode from v$database;
NAME OPEN_MODE
--------------------
ORACDB MOUNTED
Crear un“trigger”para iniciar las PDBs automáticamente. Este paso es incluido debido a que en los próximos temas se tratarán con PDBs en estado “OPEN”.
SQL> CREATE or REPLACE trigger OPEN_PDB after startup on database
2 begin
3 execute immediate 'alter pluggable database all open';
4 end;
5 /
Trigger created.
Si se tiene únicamente una PDB entonces es posible indicarel nombre de la PDB sin necesidad de crear un “trigger” tal como se muestra a continuación.
SQL> select con_id,dbid,name,open_mode,total_size
fromv$pdbs;
CON_ID DBID NAME OPEN_MODE TOTAL_SIZE
-------------------------------------------------------------
2 4077192876 PDB$SEED READ ONLY 283115520
3 3864440897 ORAPDB MOUNTED 0
SQL>alter pluggable database orapdb open;
Pluggable database altered.
En la versión 12c existe el nuevo privilegio llamado SYSBACKUP al cual se le delegó todas las tareas necesarias para poder realizar los respaldos, sin embargo, dichos respaldos aún pueden ser realizados utilizando el ya conocido SYSDBA.
RMAN puede ser ejecutado desde el contenedor ROOT o desde una PDB especificando la cadena de conexión. Cuando RMAN se conecta a una PDB específica, todos los comandos estarán relacionados a esa PDB. Cuando RMAN se ejecuta desde el ROOT todos los comandos serán aplicados a todo el CDB.
Usando el comando “REPORT SCHEMA” de RMAN, se puede identificar los “datafile” utilizados por el CDB.
bash-3.2$ rman target sys/free2go@oracdb
RMAN>reportschema;
Si se está ejecutando RMAN conectado a una PDB específica y se emite el comando “REPORT SCHEMA” únicamente se verá los “datafiles” correspondientes a esa PDB.
bash-3.2$ rman target sys/free2go@orapdb
RMAN>reportschema;
using target database control file instead of recovery catalog
Report of database schema for database with db_unique_name ORACDB
List of PermanentDatafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- ----------------- ----- --------------------
8 260 SYSTEM *** /u01/app/oracle/oradata/ORACDB/pdb/datafile/system_pdb_01.dbf
9 610 SYSAUX *** /u01/app/oracle/oradata/ORACDB/pdb/datafile/sysaux_pdb_01.dbf
10 5 USERS *** /u01/app/oracle/oradata/ORACDB/pdb/datafile/users_pdb_01.dbf
List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- --------- --------- -----------------------
3 20 TEMP 32767 /u01/app/oracle/oradata/ORACDB/EDE01BFA46E34B11E0437801A8C0821E/ datafile/o1_mf_temp_9c5d7lon_.dbf
Este procedimiento es el mismo que se realiza en un respaldo tradicional, pero en la versión 12c incluye todas las PDBs que estén dentro del CDB incluidos el ROOT y el SEED. De facto el respaldo será situado en el “Fast Recovery Area” de acuerdo al parámetro “DB_RECOVERY_FILE_DEST” y es necesario asegurarse que existe suficiente espacio para almacenar el respaldo, esto puede ser comprobado mediante el parámetro “DB_RECOVERY_FILE_DEST_SIZE” y mediante comandos del sistema operativo tales como “df”.
Starting backup at 19-DEC-13
current log archived
using channel ORA_DISK_1
channel ORA_DISK_1: starting archived log backup set
channel ORA_DISK_1: specifying archived log(s) in backup set
input archived log thread=1 sequence=6 RECID=1 STAMP=834602253
input archived log thread=1 sequence=7 RECID=2 STAMP=834602274
input archived log thread=1 sequence=8 RECID=3 STAMP=834604238
input archived log thread=1 sequence=9 RECID=4 STAMP=834604771
channel ORA_DISK_1: starting piece 1 at 19-DEC-13
channel ORA_DISK_1: finished piece 1 at 19-DEC-13
piece handle=/u01/app/oracle/fast_recovery_area/ORACDB/backupset/2013_12_19/
o1_mf_annnn_TAG20131219T183931_9c5w0cx5_.bkp
tag=TAG20131219T183931 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
channel ORA_DISK_1: deleting archived log(s)
archived log file name=/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_19/
o1_mf_1_6_9c5sknwc_.arc
RECID=1 STAMP=834602253
archived log file name=/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_19/
o1_mf_1_7_9c5slboc_.arc
RECID=2 STAMP=834602274
archived log file name=/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_19/
o1_mf_1_8_9c5vhpcw_.arc
RECID=3 STAMP=834604238
archived log file name=/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_19/
o1_mf_1_9_9c5w0cpm_.arc
RECID=4 STAMP=834604771
Finished backup at 19-DEC-13
Starting backup at 19-DEC-13
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
inputdatafile file number=00001 name=/u01/app/oracle/oradata/ORACDB/datafile/
o1_mf_system_9c5czbgn_.dbf
inputdatafile file number=00003 name=/u01/app/oracle/oradata/ORACDB/datafile/
o1_mf_sysaux_9c5cxm60_.dbf
inputdatafile file number=00004 name=/u01/app/oracle/oradata/ORACDB/datafile/
o1_mf_undotbs1_9c5d0rvv_.dbf
inputdatafile file number=00006 name=/u01/app/oracle/oradata/ORACDB/datafile/
o1_mf_users_9c5d0qoq_.dbf
channel ORA_DISK_1: starting piece 1 at 19-DEC-13
channel ORA_DISK_1: finished piece 1 at 19-DEC-13
piece handle=/u01/app/oracle/fast_recovery_area/ORACDB/backupset/2013_12_19/
o1_mf_nnndf_TAG20131219T183933_9c5w0flg_.bkp
tag=TAG20131219T183933 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:45
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
inputdatafile file number=00009 name=/u01/app/oracle/oradata/ORACDB/pdb/datafile/sysaux_pdb_01.dbf
inputdatafile file number=00008 name=/u01/app/oracle/oradata/ORACDB/pdb/datafile/system_pdb_01.dbf
inputdatafile file number=00010 name=/u01/app/oracle/oradata/ORACDB/pdb/datafile/users_pdb_01.dbf
channel ORA_DISK_1: starting piece 1 at 19-DEC-13
channel ORA_DISK_1: finished piece 1 at 19-DEC-13
piece handle=/u01/app/oracle/fast_recovery_area/ORACDB/EDE01BFA46E34B11E0437801A8C0821E/backupset/2013_12_19/
o1_mf_nnndf_TAG20131219T183933_9c5w1tqp_.bkp tag=TAG20131219T183933 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:25
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
inputdatafile file number=00007 name=/u01/app/oracle/oradata/ORACDB/datafile/o1_mf_sysaux_9c5d1gjo_.dbf
inputdatafile file number=00005 name=/u01/app/oracle/oradata/ORACDB/datafile/o1_mf_system_9c5d1gkh_.dbf
channel ORA_DISK_1: starting piece 1 at 19-DEC-13
channel ORA_DISK_1: finished piece 1 at 19-DEC-13
piece handle=/u01/app/oracle/fast_recovery_area/ORACDB/EDE01310DB1248ADE0437801A8C065D6/backupset/2013_12_19/
o1_mf_nnndf_TAG20131219T183933_9c5w2mz4_.bkp tag=TAG20131219T183933 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:26
Finished backup at 19-DEC-13
Starting backup at 19-DEC-13
current log archived
using channel ORA_DISK_1
channel ORA_DISK_1: starting archived log backup set
channel ORA_DISK_1: specifying archived log(s) in backup set
input archived log thread=1 sequence=10 RECID=5 STAMP=834604869
channel ORA_DISK_1: starting piece 1 at 19-DEC-13
channel ORA_DISK_1: finished piece 1 at 19-DEC-13
piece
handle=/u01/app/oracle/fast_recovery_area/ORACDB/backupset/2013_12_19/o1_mf_annnn_TAG20131219T184109_9c5w3fct_.bkp
tag=TAG20131219T184109 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
channel ORA_DISK_1: deleting archived log(s)
archived log file name=/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_19/o1_mf_1_10_9c5w3f6z_.arc
RECID=5 STAMP=834604869
Finished backup at 19-DEC-13
Starting Control File and SPFILE Autobackup at 19-DEC-13
piece
handle=/u01/app/oracle/fast_recovery_area/ORACDB/autobackup/2013_12_19/o1_mf_s_834604870_9c5w3hjt_.bkp
comment=NONE
Finished Control File and SPFILE Autobackup at 19-DEC-13
Se puede verificar que el respaldo haya finalizado con éxito utilizando el comando "listbackup" en RMAN.
Hasta aquí se ha realizado un respaldo completo el cual incluye el CDB y sus PDBs, sin embargo, también es posible realizar respaldos de una PDB específica.
Para realizar un respaldo de una PDB, se necesita que la conexión de RMAN sea realizada a la PDB específica. Si la conexión se realiza a la PDB y se ejecuta el siguiente comando "backuppluggabledatabaseorapdb" se obtendrá el siguiente error:
RMAN> backup pluggable database orapdb tag 'PDB_Backup';
Starting backup at 19-DEC-13
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=1 device type=DISK
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of backup command at 12/19/2013 18:56:55
RMAN-07538: Pluggable Database qualifier not allowed when connected to a Pluggable Database
RMAN> backup pluggable database orapdb tag 'PDB_Backup';
Starting backup at 19-DEC-13
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=49 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
inputdatafile file number=00009 name=/u01/app/oracle/oradata/ORACDB/pdb/datafile/sysaux_pdb_01.dbf
inputdatafile file number=00008 name=/u01/app/oracle/oradata/ORACDB/pdb/datafile/system_pdb_01.dbf
inputdatafile file number=00010 name=/u01/app/oracle/oradata/ORACDB/pdb/datafile/users_pdb_01.dbf
channel ORA_DISK_1: starting piece 1 at 19-DEC-13
channel ORA_DISK_1: finished piece 1 at 19-DEC-13
piece handle=/u01/app/oracle/fast_recovery_area/ORACDB/EDE01BFA46E34B11E0437801A8C0821E/backupset/2013_12_19/
o1_mf_nnndf_PDB_BACKUP_9c5x3rsf_.bkp tag=PDB_BACKUP comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:15
Finished backup at 19-DEC-13
Starting Control File and SPFILE Autobackup at 19-DEC-13
piece handle=/u01/app/oracle/fast_recovery_area/ORACDB/autobackup/2013_12_19/o1_mf_s_834605919_9c5x47y6_.bkp
comment=NONE
Finished Control File and SPFILE Autobackup at 19-DEC-13
RMAN> list backup tag='PDB_Backup';
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
8 Full 681.70M DISK 00:00:10 19-DEC-13
BP Key: 8 Status: AVAILABLE Compressed: NO Tag: PDB_BACKUP
Piece Name: /u01/app/oracle/fast_recovery_area/ORACDB/EDE01BFA46E34B11E0437801A8C0821E/backupset/2013_12_19/
o1_mf_nnndf_PDB_BACKUP_9c5x3rsf_.bkp
List of Datafiles in backup set 8
Container ID: 3, PDB Name: ORAPDB
File LV Type Ckp SCN CkpTime Name
---- -- ---- --------- --------- ----
8 Full 1752950 19-DEC-13 /u01/app/oracle/oradata/ORACDB/pdb/datafile/system_pdb_01.dbf
9 Full 1752950 19-DEC-13 /u01/app/oracle/oradata/ORACDB/pdb/datafile/sysaux_pdb_01.dbf
10 Full 1752950 19-DEC-13 /u01/app/oracle/oradata/ORACDB/pdb/datafile/users_pdb_01.dbf
RMAN>
En la salida de arriba se puede observar el identificador del contenedor y también el nombre de la PDB, por supuesto el“TAG”es opcional.
Las piezas del respaldo están localizadas en la siguiente ruta:
"/u01/app/oracle/fast_recovery_area/ORACDB/EDE01BFA46E34B11E0437801A8C0821E/backupset/2013_12_19/o1_mf_nnndf_PDB_BACKUP_9c5x3rsf_.bkp".
Como se puede observar, el GUID también es mostrado en la ruta del respaldo. El GUID también puede ser obtenido consultando la vista v$pdbs:
SQL> select con_id,dbid,guid,name from v$pdbs;
CON_ID DBID GUID NAME
------- ---------- -------------------------------- ---------
2 4077192876 EDE01310DB1248ADE0437801A8C065D6 PDB$SEED
3 3864440897 EDE01BFA46E34B11E0437801A8C0821E ORAPDB
Toda esta información está relacionada a los respaldos completos de una PDB. También es posiblerealizar respaldos parciales de una PDB, por ejemplo, respaldos de los “datafiles” o un específico “tablespace”.Para realizar un respaldo de un “datafile” no existe ningún cambio en la versión 12c, tal como se ve en el siguiente ejemplo:
RMAN> backup datafile 2,10;
RMAN> backup tablespaceorapdb:users tag='PDB_users_TBS';
Starting backup at 19-DEC-13
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=1 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
inputdatafile file number=00010
name=/u01/app/oracle/oradata/ORACDB/pdb/datafile/users_pdb_01.dbf
channel ORA_DISK_1: starting piece 1 at 19-DEC-13
channel ORA_DISK_1: finished piece 1 at 19-DEC-13
piece handle=/u01/app/oracle/fast_recovery_area/ORACDB/EDE01BFA46E34B11E0437801A8C0821E/
backupset/2013_12_19/o1_mf_nnndf_PDB_USERS_TBS_9c5y6dxb_.bkp tag=PDB_USERS_TBS comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 19-DEC-13
Starting Control File and SPFILE Autobackup at 19-DEC-13
piece handle=/u01/app/oracle/fast_recovery_area/ORACDB/autobackup/2013_12_19/o1_mf_s_834607014_9c5y6g2x_.bkp
comment=NONE
Finished Control File and SPFILE Autobackup at 19-DEC-13
En caso haya algún “tablespace” o “datafile” con problemas quepertenezca a una PDB, el CDB no será afectado, únicamentela PDB con problemas no estará disponible para ser accedida. Ahora se mostrará un escenario relacionado a la recuperación de una PDB. Antes de realizar una recuperación es necesario asegurarse de tener un respaldo.
El escenario que se muestra a continuación demuestra como restaurar y recuperar un “datafile” cuando dicho “datafile”está perdido.
SQL> alter session set container=orapdb;
Session altered.
SQL> col name for a100
SQL>select file#,name from v$datafile;
FILE# NAME
--------- -----------------------------------------------------
4 /u01/app/oracle/oradata/ORACDB/datafile/o1_mf_undotbs1_9c5d0rvv_.dbf
8 /u01/app/oracle/oradata/ORACDB/pdb/datafile/system_pdb_01.dbf
9 /u01/app/oracle/oradata/ORACDB/pdb/datafile/sysaux_pdb_01.dbf
10 /u01/app/oracle/oradata/ORACDB/pdb/datafile/users_pdb_01.dbf
SQL> !rm /u01/app/oracle/oradata/ORACDB/pdb/datafile/system_pdb_01.dbf
SQL> !ls -ltr /u01/app/oracle/oradata/ORACDB/pdb/datafile/system_pdb_01.dbf
ls: /u01/app/oracle/oradata/ORACDB/pdb/datafile/system_pdb_01.dbf:
No such file or directory
SQL> select file#,error,recover from v$datafile_header;
FILE# ERROR REC
-------- -------------------- -----
4 NO
8 CANNOT OPEN FILE
9 NO
10 NO
Cuando existen“datafiles” perdidos en una PDB, es posible conectarse al CDB y emitir los comandos necesarios para restauración o recuperación desde RMAN. Hay que notar que cuando los “datafile” no están disponibles no es posiblecerrar la PDB.
RMAN> restore datafile 8;
Starting restore at 20-DEC-13
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=21 device type=DISK
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00008 to /u01/app/oracle/oradata/ORACDB/pdb/datafile/system_pdb_01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/oracle/
fast_recovery_area/ORACDB/EDE01BFA46E34B11E0437801A8C0821E/backupset/2013_12_20/
o1_mf_nnndf_TAG20131220T110232_9c7oow6q_.bkp
channel ORA_DISK_1: piece handle=/u01/app/oracle/fast_recovery_area/ORACDB/
EDE01BFA46E34B11E0437801A8C0821E/backupset/2013_12_20/o1_mf_nnndf_TAG20131220T110232_9c7oow6q_.bkp
tag=TAG20131220T110232
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:15
Finishedrestore at 20-DEC-13
Verificar que haya terminado el procedimiento del restaurado del “datafile” correctamente, después se debe emitir el comando “recoverdatafile”.
RMAN> recover datafile 8;
Starting recover at 20-DEC-13
using channel ORA_DISK_1
starting media recovery
archived log for thread 1 with sequence 20 is already on disk as file
/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/o1_mf_1_20_9c7orfgl_.arc
archived log for thread 1 with sequence 21 is already on disk as file
/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/o1_mf_1_21_9c7ph7wj_.arc
archived log for thread 1 with sequence 22 is already on disk as file
/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/o1_mf_1_22_9c7py3bm_.arc
archived log for thread 1 with sequence 23 is already on disk as file
/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/o1_mf_1_23_9c7q9rqr_.arc
archived log for thread 1 with sequence 24 is already on disk as file
/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/o1_mf_1_24_9c7qd7on_.arc
archived log for thread 1 with sequence 25 is already on disk as file
/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/o1_mf_1_25_9c7qyomg_.arc
archived log for thread 1 with sequence 26 is already on disk as file
/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/o1_mf_1_26_9c7rblbd_.arc
archived log for thread 1 with sequence 27 is already on disk as file
/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/o1_mf_1_27_9c7sjr14_.arc
archived log for thread 1 with sequence 28 is already on disk as file
/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/o1_mf_1_28_9c86jnck_.arc
archived log for thread 1 with sequence 29 is already on disk as file
/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/o1_mf_1_29_9c86lowv_.arc
archived log file name=/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/
o1_mf_1_20_9c7orfgl_.arc
thread=1 sequence=20
archived log file name=/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/
o1_mf_1_21_9c7ph7wj_.arc
thread=1 sequence=21
archived log file name=/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/
o1_mf_1_22_9c7py3bm_.arc
thread=1 sequence=22
archived log file name=/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/
o1_mf_1_23_9c7q9rqr_.arc
thread=1 sequence=23
archived log file name=/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/
o1_mf_1_24_9c7qd7on_.arc
thread=1 sequence=24
archived log file name=/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/
o1_mf_1_25_9c7qyomg_.arc
thread=1 sequence=25
archived log file name=/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/
o1_mf_1_26_9c7rblbd_.arc
thread=1 sequence=26
archived log file name=/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/
o1_mf_1_27_9c7sjr14_.arc
thread=1 sequence=27
media recovery complete, elapsed time: 00:00:02
Finishedrecover at 20-DEC-13
Enel ejemplo de arriba se trató la recuperación de un datafile del “tablespace” SYSTEM. En caso de que un“datafile”esté perdido y que no sea del “tablespace” SYSTEM se puede realizar los pasos que se muestran a continuación:
RMAN> alter database datafile 10 offline;
RMAN> restore datafile 10;
RMAN> recover datafile 10;
RMAN> alter database datafile 10 online;
Si se tienen varios “datafiles”perdidos para un “tablespace”, es posible restaurar un “tablespace” completo y realizar una recuperación. En el siguiente ejemplo se creará un “tablespace” con el nombre EXAMPLE y entonces se restaurará y se recuperará.La técnica de restaurado y recuperado de un “tablespace” es la misma si el “tablespace” contiene un solo “datafile” o si posee múltiples “datafiles”.
SQL> alter session set container=orapdb;
Session altered.
SQL> create tablespace example
datafile '/u01/app/oracle/oradata/ORACDB/pdb/example01.dbf'
size 50m;
Tablespace created.
SQL> alter tablespace example
adddatafile '/u01/app/oracle/oradata/ORACDB/pdb/example02.dbf' size 50m;
Tablespace altered.
SQL> select file_id,file_name
fromcdb_data_files
where tablespace_name = 'EXAMPLE';
FILE_ID FILE_NAME
-------- -----------------------------------------------
17 /u01/app/oracle/oradata/ORACDB/pdb/example01.dbf
18 /u01/app/oracle/oradata/ORACDB/pdb/example02.dbf
SQL>!rm /u01/app/oracle/oradata/ORACDB/pdb/example01.dbf
SQL>!rm /u01/app/oracle/oradata/ORACDB/pdb/example02.dbf
SQL>!ls -ltr /u01/app/oracle/oradata/ORACDB/pdb/example*
ls: /u01/app/oracle/oradata/ORACDB/pdb/example*: No such file or directory
Una vez eliminados todos los “datafile” del “tablespace” EXAMPLE se realiza la recuperación de dicho “tablespace”. Para realizar la recuperación se necesita que el “tablespace” esté en estado OFFLINE. El comando "alter tablespace example offline" funciona cuando aún hay “datafiles” funcionales. En este ejemplo se han eliminado todos los “datafile”, entonces se necesitará utilizar la cláusula "IMMEDIATE" para ponerlo en estado OFFLINE.
RMAN> alter tablespace example offline immediate;
Statement processed
RMAN> restore tablespace example;
Starting restore at 20-DEC-13
using channel ORA_DISK_1
creatingdatafile file number=17 name=/u01/app/oracle/oradata/ORACDB/pdb/example01.dbf
creatingdatafile file number=18 name=/u01/app/oracle/oradata/ORACDB/pdb/example02.dbf
restore not done; all files read only, offline, or already restored
Finished restore at 20-DEC-13
RMAN> recover tablespace example;
Starting recover at 20-DEC-13
using channel ORA_DISK_1
starting media recovery
archived log for thread 1 with sequence 6 is already on disk as file
/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/o1_mf_1_6_9c8htxj2_.arc
archived log for thread 1 with sequence 7 is already on disk as file
/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/o1_mf_1_7_9c8htxvk_.arc
archived log for thread 1 with sequence 8 is already on disk as file
/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/o1_mf_1_8_9c8hv0xq_.arc
archived log for thread 1 with sequence 9 is already on disk as file
/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/o1_mf_1_9_9c8hv0xh_.arc
archived log file name=/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/
o1_mf_1_6_9c8htxj2_.arc
thread=1 sequence=6
archived log file name=/u01/app/oracle/fast_recovery_area/ORACDB/archivelog/2013_12_20/
o1_mf_1_7_9c8htxvk_.arc
thread=1 sequence=7
media recovery complete, elapsed time: 00:00:00
Finished recover at 20-DEC-13
RMAN> alter tablespace example online;
Statement processed
RMAN>
Ahora el “tablespace” EXAMPLE está completamente restaurado y recuperado por lo que,si todo ha terminado satisfactoriamente, se debería encontrar en estado ONLINE.
En esta sección, se verá como restaurar y recuperar una PDB desde un respaldo.Si se tienenmúltiplesPDBs entonces sin tener que afectar las demás PDBs se puede restaurar y recuperar una PDB determinada.Para realizar la restauración y la recuperación es posible conectarse al contenedor ROOT y utilizar el siguiente comando "RESTORE PLUGGABLE DATABASE" o también es posible conectarse a la PDB específica y directamente emitir el comando "RESTORE DATABASE".
Para evitar un encolamiento exclusivo en algún “datafile” en la PDB, se necesita cerrar dicha PDB y entonces seguir los pasos de restauración y recuperación.
SQL>alter pluggable database orapdb close;
Pluggable database altered.
RMAN> restore pluggable database orapdb;
Starting restore at 21-DEC-13
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=55 device type=DISK
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00019 to
/u01/app/oracle/oradata/ORACDB/pdb/datafile/orapdb_o1_mf_system_9cbghmrb_.dbf
channel ORA_DISK_1: restoring datafile 00020 to
/u01/app/oracle/oradata/ORACDB/pdb/datafile/orapdb_o1_mf_sysaux_9cbghmpl_.dbf
channel ORA_DISK_1: restoring datafile 00021 to
/u01/app/oracle/oradata/ORACDB/pdb/datafile/orapdb_users01.dbf
channel ORA_DISK_1: reading from backup piece
/u01/app/oracle/fast_recovery_area/ORACDB/EE07145D1EAF1865E0437801A8C01BCF/backupset/2013_12_21/
o1_mf_nnndf_TAG20131221T124059_9cbhstcp_.bkp
channel ORA_DISK_1: piece handle=/u01/app/oracle/fast_recovery_area/
ORACDB/EE07145D1EAF1865E0437801A8C01BCF/
backupset/2013_12_21/o1_mf_nnndf_TAG20131221T124059_9cbhstcp_.bkp tag=TAG20131221T124059
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:25
Finished restore at 21-DEC-13
RMAN> recover pluggable database orapdb;
Starting recover at 21-DEC-13
using channel ORA_DISK_1
starting media recovery
media recovery complete, elapsed time: 00:00:00
Finished recover at 21-DEC-13
RMAN>alter pluggable database orapdb open;
Statement processed
El concepto de recuperación hasta un punto en el tiempo es nombrado de manera abreviada como “DBPITR”. Es posible que nos enfrentemos a problemas como que una tabla fueeliminada, filas de una tabla fueron eliminadas o una tabla de una base de datos de producción fue truncada. En tales casos una recuperación hasta un punto en el tiempo debe ser realizado.
Nota: Para realizar una DBPITR se utilizará RMAN.
Requerimientos para utilizar DBPITR en una PDB:
Revisar el estado del modo “Archive log” y del respaldo antes de realizar modificaciones, eliminaciones o cualquier otra operación.
SQL> select name,open_mode from v$pdbs;
NAME OPEN_MODE
------------------------------ ----------
PDB$SEED READ ONLY
ORAPDB READ WRITE
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 3
Next log sequence to archive 5
Current log sequence 5
Ahora se realizará un respaldo completo y siempre se recomienda verificar el estado de dicho respaldo:
RMAN> list backup tag='BEFORE_DBPITR';
List of Backup Sets
===================
BS Key Size Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ ---------------
68 13.21M DISK 00:00:02 21-DEC-13
BP Key: 68 Status: AVAILABLE Compressed: YES
Tag: BEFORE_DBPITR
Piece Name: /u01/app/oracle/fast_recovery_area/ORACDB/backupset/2013_12_21/
o1_mf_annnn_BEFORE_DBPITR_9cbpl5l2_.bkp
List of Archived Logs in backup set 68
Thrd Seq Low SCN Low Time Next SCN Next Time
---- ------- ---------- --------- ---------- ---------
1 1 2273638 21-DEC-13 2281354 21-DEC-13
1 2 2281354 21-DEC-13 2281403 21-DEC-13
1 3 2281403 21-DEC-13 2284137 21-DEC-13
1 4 2284137 21-DEC-13 2284199 21-DEC-13
1 5 2284199 21-DEC-13 2289882 21-DEC-13
BS Key Size Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ ---------------
72 12.50K DISK 00:00:00 21-DEC-13
BP Key: 72 Status: AVAILABLE Compressed: YES
Tag: BEFORE_DBPITR
Piece Name: /u01/app/oracle/fast_recovery_area/ORACDB/backupset/2013_12_21/
o1_mf_annnn_BEFORE_DBPITR_9cbpp6ob_.bkp
List of Archived Logs in backup set 72
Thrd Seq Low SCN Low Time Next SCN Next Time
---- ------- ---------- --------- ---------- ---------
1 6 2289882 21-DEC-13 2289956 21-DEC-13
Entonces, ahora se tiene la base de datos en modo “Archive log” y también se ha realizado un exitoso respaldo completo de la base de datos al cual se le asignó la etiqueta "BEFORE_DBPITR".
SQL> alter session set container=orapdb;
Session altered.
SQL> select name,open_mode from v$pdbs;
NAME OPEN_MODE
------------------------------ ----------
ORAPDB READ WRITE
SQL> create tablespacedbpitr
datafile '/u01/app/oracle/oradata/ORACDB/pdb/datafile/dbpitr_01.dbf'
size 100m;
Tablespace created.
SQL> create user pdbuser identified by manager
defaulttablespacedbpitr;
User created.
SQL> connect pdbuser/manager@orapdb;
Connected.
SQL> create table pdbtable(
emp_namevarchar2(10),
salary number(5));
Table created.
SQL> insert into pdbtable values ('emp_one',60000);
1 row created.
SQL> insert into pdbtable values ('emp_two',70000);
1 row created.
SQL> insert into pdbtable values ('emp_three',80000);
1 row created.
SQL> commit;
Commit complete.
SQL> select timestamp_to_scn(sysdate) from dual;
TIMESTAMP_TO_SCN(SYSDATE)
-------------------------
2291250
SQL> select * from pdbtable;
EMP_NAME SALARY
---------- ---------
emp_one 60000
emp_two 70000
emp_three 80000
Se han insertado tres registros en la tabla “pdbtable” y se ha realizado “commit”. Para realizar “DBPITR” es necesario conocer el momento al cual necesitamos recuperar la base de datos. Por ello, se debe tener el SCN que se quiere alcanzar o la fecha a la cual se necesita recuperar.También es posible utilizar funciones para obtener estos datos, por ejemplo:
SQL> select timestamp_to_scn(sysdate) from dual;
TIMESTAMP_TO_SCN(SYSDATE)
--------------------------
2291262
SQL> select scn_to_timestamp(2291262) from dual;
SCN_TO_TIMESTAMP(2291262)
----------------------------------------------------------------
21-DEC-13 03.17.30.000000000 PM
Después de reunir los detalles del SCN o la fecha deseada de recuperación, se truncará la tabla completa(simulando un error de usuario), de esta manera todos los registros en la tabla "pdbtable" estarán perdidos.
SQL> truncate table pdbtable;
Table truncated.
SQL> select * from pdbtable;
no rows selected
Ahora se obtendrá el SCN y la fecha posterior al fallopara nuestra referencia con el objetivode podercomparar el SCN anterior y posteriora la operación de truncado.
SQL> select timestamp_to_scn(sysdate) from dual;
TIMESTAMP_TO_SCN(SYSDATE)
-------------------------
2291764
SQL> select scn_to_timestamp(2291764) from dual;
SCN_TO_TIMESTAMP(2291764)
----------------------------------------------------------------
21-DEC-13 03.27.18.000000000 PM
Antes de realizar la recuperación la base de datos es necesario que esta esté cerrada. Se necesita cerrar únicamente la PDB en la cual ocurrió el problema, en este caso un truncado de una tabla.
bash-3.2$ rman
RMAN> connect target "sys as sysbackup"
target database Password:
connected to target database: ORACDB (DBID=2508982653)
RMAN>alter pluggable database orapdb close;
using target database control file instead of recovery catalog
Statement processed
Se ha cerrado la PDB “ORAPDB”, ahora se debe realizar la recuperación hasta un punto en el tiempo anterior al momento de la operación de truncado. En los pasos anteriores recaudamos la información necesaria para realizar la recuperación, esto es el SCN o la fecha, es posible entonces realizar la recuperación utilizando cualquiera de esos dos datos. Antes de realizar el “DBPITR” se necesita crear un destino auxiliar y tener suficiente espacio para almacenar las copias de los “datafile”.
bash-3.2$ rman target /
RMAN> run
2> {
3> set until scn 2291262;
4> restore pluggable database orapdb;
5> recover pluggable database orapdb auxiliary destination='/home/oracle/working/aux_pdb';
6>alter pluggable database orapdb open resetlogs;
7> }
executing command: SET until clause
Starting restore at 21-DEC-13
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=57 device type=DISK
creatingdatafile file number=22 name=/u01/app/oracle/oradata/ORACDB/pdb/datafile/dbpitr_01.dbf
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00019 to
/u01/app/oracle/oradata/ORACDB/pdb/datafile/orapdb_o1_mf_system_9cbghmrb_.dbf
channel ORA_DISK_1: restoring datafile 00020 to
/u01/app/oracle/oradata/ORACDB/pdb/datafile/orapdb_o1_mf_sysaux_9cbghmpl_.dbf
channel ORA_DISK_1: restoring datafile 00021 to
/u01/app/oracle/oradata/ORACDB/pdb/datafile/orapdb_users01.dbf
channel ORA_DISK_1: reading from backup piece
/u01/app/oracle/fast_recovery_area/ORACDB/EE07145D1EAF1865E0437801A8C01BCF/backupset/2013_12_21/
o1_mf_nnndf_TAG20131221T143720_9cbpn00l_.bkp
channel ORA_DISK_1: piece
handle=/u01/app/oracle/fast_recovery_area/ORACDB/EE07145D1EAF1865E0437801A8C01BCF/backupset/2013_12_21/
o1_mf_nnndf_TAG20131221T143720_9cbpn00l_.bkp tag=TAG20131221T143720
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:35
Finished restore at 21-DEC-13
.....................................
Oracle instance shut down
Removing automatic instance
Automatic instance removed
auxiliary instance file /home/oracle/working/aux_pdb/ORACDB/datafile/o1_mf_sysaux_9cbt6k0m_.dbf deleted
auxiliary instance file /home/oracle/working/aux_pdb/ORACDB/controlfile/o1_mf_9cbt6c34_.ctl deleted
Finished recover at 21-DEC-13
Statement processed
Pluggable Database Point-In-Time recovery successfully completed without any errors.
Se ha incluido el comando "alter pluggable database ora pdb open reset logs", por lo tanto la PDB estará disponible para operaciones de lecturas y escrituras después de finalizar la recuperación. Ahora es momento de verificar los datos, si se fue capaz de recuperar los registros que fueron eliminados al realizar el truncado en la tabla.
bash-3.2$ sqlpluspdbuser/manager@orapdb
SQL> select * from pdbtable;
EMP_NAME SALARY
---------- ---------
emp_one 60000
emp_two 70000
emp_three 80000
Se tenían todos los datos eliminados por la operación de truncado y ahora vemos que los datos nuevamente existen. Cuando se realiza una recuperación sobre una sencilla PDB cualquier otra PDB o incluso el contenedor no serán afectados.
SQL> select db_incarnation#,pdb_incarnation#,
status,incarnation_time
fromv$pdb_incarnation
where status='CURRENT';
DB_INCARNATION# PDB_INCARNATION# STATUS INCARNATION_TIME
--------------- ---------------- ------- --------------------
5 1 CURRENT 21-DEC-2013 03:17:42
Se recomienda verificar el tiempo de reencarnación y el SCN antes del truncado para comprobar si le recuperación fue realizada exitosamente.
Deiby Gomez es un DBA con experiencia en Oracle Exadata Database Machine y Soluciones de Alta Disponibilidad. Deiby frecuentemente da conferencias en distintos eventos de Oracle en Guatemala tales como "Oracle Technology Network Tour", "Java Day", "Primer Simposio de Oracle" y en varias Universidades de su país de residencia (Guatemala). Deiby es el primer Oracle ACE de Guatemala. Es "Oracle RAC 11g and Grid Infraestructure Administrator", "Exadata Database Machine X3 Administrator", "Oracle Linux Certified Implementation Specialist" y "Oracle SOA Implementation Certified Expert".
Yenugula Venkata Ravikumar es un DBA con más de 15 años de experiencia especializada en entornos de alta disponibilidad de bases de datos (RAC, Data Guard, entre otros), afinamiento y rendimiento, migraciones, backup y recuperación, Oracle Exadata X2 y X3, es experto en sistemas operativos tales como AIX, HP-UX y Linux. Ha participado como conferencista en varios eventos de Oracle en la India, donde reside actualmente. Obtuvo el titulo "Oracle Certified Master (OCM 10g)" en el 2009.
Nassyam Basha es un DBA. Es un OCP 11g con conocimientos en tecnologías Oracle tales como Data Guard, RMAN, RAC. Él ha realizado más de 90 configuraciones de Data Guard en diferentes plataformas, desde RAC a no-RAC y viceversa. Ha realizado migraciones exitosas con “switchovers” y “failovers” para varias bases de datos críticas de producción. Él participa activamente en los foros de Oracle utilizando el usuario “CKPT” y ha obtenido más de 10000 puntos (nivel gurú). Él constantemente publica artículos en su blog www.oracle-ckpt.com y es co-autor del libro “Oracle Data Guard 11gR2 administration guide”.