Labels

Restore con RMAN: Un escenario complejo de desastre.



Escenario 1


El escenario es el siguiente, se rompió un disco completo, y no contamos con información acerca de la estructura de la BD, lo único que tenemos es el PFILE, el resto sabemos que se respaldó mediante RMAN.
Se inicio la BD en NOMOUNT solo con el PFILE, para tener conexión al catalogo de RMAN y conocer la estructura de la misma.
Se asume la configuracion de la opcion CONTROLFILE AUTOBACKUP en ON, y discos fisicamente separados para el software de BD y la BD. (Gracias Facundo!)

Obtener la estructura de archivos de la base de datos
RMAN> report schema;

Report of database schema
File K-bytes Tablespace RB segs Datafile Name
----------- -------------------- ------------------------
1 358400 SYSTEM YES /database/oradata1/GCDT_PY/SYSTEM_GCDT_00.dbf
2 358400 RBS_GCDT1 YES /database/oradata2/GCDT_PY/RBS_GCDT_00.dbf
3 10240 TOOL_GCDT1 NO /database/oradata2/GCDT_PY/TOOL_GCDT_00.dbf
4 646728 INDX_TAGS_GCDT1 NO /database/oradata5/GCDT_PY/INDX_TAGS_GCDT_0.dbf
5 924320 DATA_TAGS_GCDT1 NO /database/oradata4/GCDT_PY/DATA_TAGS_GCDT_0.dbf
6 221304 INDX_HISTORY_GCDT1 NO /database/oradata5/GCDT_PY/INDX_HISTORY_GCDT_00.dbf
7 241136 DATA_HISTORY_GCDT1 NO /database/oradata4/GCDT_PY/DATA_HISTORY_GCDT_00.dbf
8 191192 INDX_IMEI_GCDT1 NO /database/oradata5/GCDT_PY/INDX_IMEI_GCDT_00.dbf
9 482256 DATA_IMEI_GCDT1 NO /database/oradata4/GCDT_PY/DATA_IMEI_GCDT_00.dbf
10 10240 USER_GCDT1 NO /database/oradata2/GCDT_PY/USER_GCDT_00.dbf
11 924320 DATA_TAGS_GCDT1 NO /database/oradata4/GCDT_PY/DATA_TAGS_GCDT_REF_1.dbf
12 924320 DATA_TAGS_GCDT1 NO /database/oradata4/GCDT_PY/DATA_TAGS_GCDT_REF_2.dbf
13 646728 INDX_TAGS_GCDT1 NO /database/oradata5/GCDT_PY/INDX_TAGS_GCDT_REF_1.dbf
14 221184 INDX_HISTORY_GCDT1 NO /database/oradata5/GCDT_PY/INDX_HISTORY_GCDT_01.dbf
15 221184 INDX_HISTORY_GCDT1 NO /database/oradata5/GCDT_PY/INDX_HISTORY_GCDT_02.dbf
16 409600 DATA_HISTORY_GCDT1 NO /database/oradata4/GCDT_PY/DATA_HISTORY_GCDT_01.dbf
17 204800 INDX_HISTORY_GCDT1 NO /database/oradata5/GCDT_PY/INDX_HISTORY_GCDT_03.dbf

En base a la estructura dada, y contando con el FS DATABASE solamente, se procede a crear los ORADATA como directorios dentro de dicho FS
Verificar los backups y estado de los mismos
Ahora necesitamos conocer cuál fue el ultimo BACKUP FULL o LEVEL 0 que se realizó de la base.
RMAN> List Backup summary;

40019855 B 0 A SBT_TAPE 10-JUN-11 1 1 TAG20110610T212018
40019875 B F A SBT_TAPE 10-JUN-11 1 1
40020916 B A A SBT_TAPE 10-JUN-11 1 1 TAG20110610T220930
40020920 B F A SBT_TAPE 10-JUN-11 1 1
40024370 B A A SBT_TAPE 11-JUN-11 1 1 TAG20110611T041122
40024374 B F A SBT_TAPE 11-JUN-11 1 1
40025805 B A A SBT_TAPE 11-JUN-11 1 1 TAG20110611T101118
40025809 B F A SBT_TAPE 11-JUN-11 1 1
40034051 B A A SBT_TAPE 11-JUN-11 1 1 TAG20110611T161146
40034055 B F A SBT_TAPE 11-JUN-11 1 1
40036199 B A A SBT_TAPE 11-JUN-11 1 1 TAG20110611T221115
40036203 B F A SBT_TAPE 11-JUN-11 1 1
40038848 B A A SBT_TAPE 12-JUN-11 1 1 TAG20110612T041131
40038852 B F A SBT_TAPE 12-JUN-11 1 1
40041271 B A A SBT_TAPE 12-JUN-11 1 1 TAG20110612T101253
40041275 B F A SBT_TAPE 12-JUN-11 1 1
40045703 B A A SBT_TAPE 12-JUN-11 1 1 TAG20110612T161142
40045707 B F A SBT_TAPE 12-JUN-11 1 1
40048082 B A A SBT_TAPE 12-JUN-11 1 1 TAG20110612T221153
40048086 B F A SBT_TAPE 12-JUN-11 1 1
40049830 B A A SBT_TAPE 13-JUN-11 1 1 TAG20110613T041143
40049838 B F A SBT_TAPE 13-JUN-11 1 1
40052375 B A A SBT_TAPE 13-JUN-11 1 1 TAG20110613T101108
40052379 B F A SBT_TAPE 13-JUN-11 1 1

40019855 --Es el último BACKUP INCREMENTAL LEVEL 0
40019875 --Corresponde a un backup automático del CONTROLFILE
40020916 --Backup de ARCHIVES
Detalle del backup necesario para hacer el restore
Vemos en detalle el ultimo backup incremental level 0

RMAN> list backup tag='TAG20110610T212018';

List of Backup Sets
===================

BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
40019855 Incr 0 3G SBT_TAPE 00:05:30 10-JUN-11
BP Key: 40019856 Status: AVAILABLE Tag: TAG20110610T212018
Piece Name: egmeih0i_1_1
List of Datafiles in backup set 40019855

File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- --------- ----
1 0 Incr 7940760455840 10-JUN-11 /database/oradata1/GCDT_PY/SYSTEM_GCDT_00.dbf
2 0 Incr 7940760455840 10-JUN-11 /database/oradata2/GCDT_PY/RBS_GCDT_00.dbf
3 0 Incr 7940760455840 10-JUN-11 /database/oradata2/GCDT_PY/TOOL_GCDT_00.dbf
4 0 Incr 7940760455840 10-JUN-11 /database/oradata5/GCDT_PY/INDX_TAGS_GCDT_0.dbf
5 0 Incr 7940760455840 10-JUN-11 /database/oradata4/GCDT_PY/DATA_TAGS_GCDT_0.dbf
6 0 Incr 7940760455840 10-JUN-11 /database/oradata5/GCDT_PY/INDX_HISTORY_GCDT_00.dbf
7 0 Incr 7940760455840 10-JUN-11 /database/oradata4/GCDT_PY/DATA_HISTORY_GCDT_00.dbf
8 0 Incr 7940760455840 10-JUN-11 /database/oradata5/GCDT_PY/INDX_IMEI_GCDT_00.dbf
9 0 Incr 7940760455840 10-JUN-11 /database/oradata4/GCDT_PY/DATA_IMEI_GCDT_00.dbf
10 0 Incr 7940760455840 10-JUN-11 /database/oradata2/GCDT_PY/USER_GCDT_00.dbf
11 0 Incr 7940760455840 10-JUN-11 /database/oradata4/GCDT_PY/DATA_TAGS_GCDT_REF_1.dbf
12 0 Incr 7940760455840 10-JUN-11 /database/oradata4/GCDT_PY/DATA_TAGS_GCDT_REF_2.dbf
13 0 Incr 7940760455840 10-JUN-11 /database/oradata5/GCDT_PY/INDX_TAGS_GCDT_REF_1.dbf
14 0 Incr 7940760455840 10-JUN-11 /database/oradata5/GCDT_PY/INDX_HISTORY_GCDT_01.dbf
15 0 Incr 7940760455840 10-JUN-11 /database/oradata5/GCDT_PY/INDX_HISTORY_GCDT_02.dbf
16 0 Incr 7940760455840 10-JUN-11 /database/oradata4/GCDT_PY/DATA_HISTORY_GCDT_01.dbf
17 0 Incr 7940760455840 10-JUN-11 /database/oradata5/GCDT_PY/INDX_HISTORY_GCDT_03.dbf
Recrear los controlfiles
No contamos con los controlfiles, por lo cual hay que recuperarlos del último backup disponible:

RUN
{
allocate CHANNEL t1 type 'SBT_TAPE'
parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)';
RESTORE Controlfile FROM AUTOBACKUP;
}

allocated channel: t1
channel t1: sid=12 devtype=SBT_TAPE
channel t1: Data Protection for Oracle: version 5.4.1.0

Starting restore at 15-JUN-11

channel t1: looking for autobackup on day: 20110615
channel t1: looking for autobackup on day: 20110614
channel t1: looking for autobackup on day: 20110613
channel t1: autobackup found: c-3445585746-20110613-01
channel t1: controlfile restore from autobackup complete
replicating controlfile
input filename=/database/oradata1/GCDT_PY/CTL1_001_GCDT_00.ctl
output filename=/database/oradata3/GCDT_PY/CTL2_002_GCDT_00.ctl
Finished restore at 15-JUN-11
released channel: t1

La lógica es buscar desde el día actual, hacia atrás, hasta que encuentra una copia válida para poder restaurar.
Restaurar la bd desde el backup
No contamos con ningún datafile, vamos por la recuperación completa:

RUN
{
allocate CHANNEL t1 type 'SBT_TAPE'
parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)';
RESTORE Database From Tag='TAG20110610T212018';
}

allocated channel: t1
channel t1: sid=12 devtype=SBT_TAPE
channel t1: Data Protection for Oracle: version 5.4.1.0

Starting restore at 15-JUN-11

channel t1: starting datafile backupset restore
channel t1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to /database/oradata1/GCDT_PY/SYSTEM_GCDT_00.dbf
restoring datafile 00002 to /database/oradata2/GCDT_PY/RBS_GCDT_00.dbf
restoring datafile 00003 to /database/oradata2/GCDT_PY/TOOL_GCDT_00.dbf
restoring datafile 00004 to /database/oradata5/GCDT_PY/INDX_TAGS_GCDT_0.dbf
restoring datafile 00005 to /database/oradata4/GCDT_PY/DATA_TAGS_GCDT_0.dbf
restoring datafile 00006 to /database/oradata5/GCDT_PY/INDX_HISTORY_GCDT_00.dbf
restoring datafile 00007 to /database/oradata4/GCDT_PY/DATA_HISTORY_GCDT_00.dbf
restoring datafile 00008 to /database/oradata5/GCDT_PY/INDX_IMEI_GCDT_00.dbf
restoring datafile 00009 to /database/oradata4/GCDT_PY/DATA_IMEI_GCDT_00.dbf
restoring datafile 00010 to /database/oradata2/GCDT_PY/USER_GCDT_00.dbf
restoring datafile 00011 to /database/oradata4/GCDT_PY/DATA_TAGS_GCDT_REF_1.dbf
restoring datafile 00012 to /database/oradata4/GCDT_PY/DATA_TAGS_GCDT_REF_2.dbf
restoring datafile 00013 to /database/oradata5/GCDT_PY/INDX_TAGS_GCDT_REF_1.dbf
restoring datafile 00014 to /database/oradata5/GCDT_PY/INDX_HISTORY_GCDT_01.dbf
restoring datafile 00015 to /database/oradata5/GCDT_PY/INDX_HISTORY_GCDT_02.dbf
restoring datafile 00016 to /database/oradata4/GCDT_PY/DATA_HISTORY_GCDT_01.dbf
restoring datafile 00017 to /database/oradata5/GCDT_PY/INDX_HISTORY_GCDT_03.dbf
channel t1: restored backup piece 1
piece handle=egmeih0i_1_1 tag=TAG20110610T212018 params=NULL
channel t1: restore complete
Finished restore at 15-JUN-11
released channel: t1

Recover de la bd a partir de los archives
Es necesario realizar RECOVER de la base, es decir, la aplicación de archives:
Primero hay que montar la BD--> esto resulto OK
Y averiguar el destino de archives:

Show parameter log_archive_dest
log_archive_dest string /database/oradata6/GCDT_PY/SYS_ARCH_

Una vez creada esta nueva estructura en FS, se puede comenzar con el recover:

RUN
{
allocate CHANNEL T2 type 'SBT_TAPE'
parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)';
Recover Database ;
}

allocated channel: T2
channel T2: sid=12 devtype=SBT_TAPE
channel T2: Data Protection for Oracle: version 5.4.1.0

Starting recover at 15-JUN-11

starting media recovery

channel T2: starting archive log restore to default destination
channel T2: restoring archive log
archive log thread=1 sequence=3430
channel T2: restored backup piece 1
piece handle=eimeijsq_1_1 tag=TAG20110610T220930 params=NULL
channel T2: restore complete
archive log filename=/database/oradata6/GCDT_PY/SYS_ARCH_/3430.arf thread=1 sequence=3430
channel T2: starting archive log restore to default destination
channel T2: restoring archive log
archive log thread=1 sequence=3431
channel T2: restored backup piece 1
piece handle=ekmej93a_1_1 tag=TAG20110611T041122 params=NULL
channel T2: restore complete
archive log filename=/database/oradata6/GCDT_PY/SYS_ARCH_/3431.arf thread=1 sequence=3431
channel T2: starting archive log restore to default destination
channel T2: restoring archive log
archive log thread=1 sequence=3432
channel T2: restored backup piece 1
piece handle=emmeju66_1_1 tag=TAG20110611T101118 params=NULL
channel T2: restore complete
archive log filename=/database/oradata6/GCDT_PY/SYS_ARCH_/3432.arf thread=1 sequence=3432
channel T2: starting archive log restore to default destination
channel T2: restoring archive log
archive log thread=1 sequence=3433
channel T2: restored backup piece 1
piece handle=eomekja2_1_1 tag=TAG20110611T161146 params=NULL
channel T2: restore complete
archive log filename=/database/oradata6/GCDT_PY/SYS_ARCH_/3433.arf thread=1 sequence=3433
channel T2: starting archive log restore to default destination
channel T2: restoring archive log
archive log thread=1 sequence=3434
channel T2: restored backup piece 1
piece handle=eqmel8c4_1_1 tag=TAG20110611T221115 params=NULL
channel T2: restore complete
archive log filename=/database/oradata6/GCDT_PY/SYS_ARCH_/3434.arf thread=1 sequence=3434
channel T2: starting archive log restore to default destination
channel T2: restoring archive log
archive log thread=1 sequence=3435
channel T2: restored backup piece 1
piece handle=esmeltfj_1_1 tag=TAG20110612T041131 params=NULL
channel T2: restore complete
archive log filename=/database/oradata6/GCDT_PY/SYS_ARCH_/3435.arf thread=1 sequence=3435
channel T2: starting archive log restore to default destination
channel T2: restoring archive log
archive log thread=1 sequence=3436
channel T2: restored backup piece 1
piece handle=eumemil5_1_1 tag=TAG20110612T101253 params=NULL
channel T2: restore complete
archive log filename=/database/oradata6/GCDT_PY/SYS_ARCH_/3436.arf thread=1 sequence=3436
channel T2: starting archive log restore to default destination
channel T2: restoring archive log
archive log thread=1 sequence=3437
channel T2: restored backup piece 1
piece handle=f0men7lu_1_1 tag=TAG20110612T161142 params=NULL
channel T2: restore complete
archive log filename=/database/oradata6/GCDT_PY/SYS_ARCH_/3437.arf thread=1 sequence=3437
channel T2: starting archive log restore to default destination
channel T2: restoring archive log
archive log thread=1 sequence=3438
channel T2: restored backup piece 1
piece handle=f2mensp9_1_1 tag=TAG20110612T221153 params=NULL
channel T2: restore complete
archive log filename=/database/oradata6/GCDT_PY/SYS_ARCH_/3438.arf thread=1 sequence=3438
channel T2: starting archive log restore to default destination
channel T2: restoring archive log
archive log thread=1 sequence=3439
channel T2: restored backup piece 1
piece handle=f4meohrv_1_1 tag=TAG20110613T041143 params=NULL
channel T2: restore complete
archive log filename=/database/oradata6/GCDT_PY/SYS_ARCH_/3439.arf thread=1 sequence=3439
channel T2: starting archive log restore to default destination
channel T2: restoring archive log
archive log thread=1 sequence=3440
channel T2: restored backup piece 1
piece handle=f6mep6ts_1_1 tag=TAG20110613T101108 params=NULL
channel T2: restore complete
archive log filename=/database/oradata6/GCDT_PY/SYS_ARCH_/3440.arf thread=1 sequence=3440
unable to find archive log
archive log thread=1 sequence=3441
released channel: T2
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 06/15/2011 13:11:37
RMAN-06054: media recovery requesting unknown log: thread 1 scn 7943501051097

Ante este error, exploramos en detalle el ultimo backup de ARCHIVES, para determiner cual fue la ultima secuencia resguardada, y si esta coincide con la ultima secuencia aplicada en el RECOVER.

RMAN> list backup tag='TAG20110613T101108';

List of Backup Sets
===================

BS Key Size Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ ---------------
40052375 2M SBT_TAPE 00:00:04 13-JUN-11
BP Key: 40052376 Status: AVAILABLE Tag: TAG20110613T101108
Piece Name: f6mep6ts_1_1

List of Archived Logs in backup set 40052375
Thrd Seq Low SCN Low Time Next SCN Next Time
---- ------- ---------- --------- ---------- ---------
1 3440 7943501048569 13-JUN-11 7943501051097 13-JUN-11


Como se suponía, llego hasta la última secuencia de Archive que se resguardó, la número 3440.
Aun así, la base necesita más RECOVER, está solicitando la secuencia N.
Y donde se encuentra esta secuencia sino esta en los archives?
En los Online! pero como No toma BACKUP de estos archivos, perdimos los últimos cambios de la base.
Oracle tiene la opción en estos casos de abrir la base poniendo a cero los REDOLOGS Online, con la opción OPEN RESETLOGS.
Pero para poder aplicar esta opción, es necesario recrear los CONTROLFILES multiplexados, con la opción adecuada.
Por lo cual procedemos a tomar Un Trace del CONTROLFILE
Recreación de los CONTROLFILES con la opción RESETLOGS
SQL> alter database backup controlfile to trace as '/database/ctrl_GCDT_PY.sql'

Luego de bajar la BD; se inicia en NOMOUNT.
Procedemos a editar el archivo con la opción de RESETLOGS, renombrando los CONTROLFILE multiplexados, y en SQLPLUS se ejecuta el nuevo archivo editado para que genere los nuevos CONTROLFILES.

SQL> @/database/ctrl_GCDT_PY.sql
Control file created.
Abrir la BD con la opción RESETLOGS
Finalmente,

SQL> alter database open resetlogs;
Database altered.

SQL> select open_mode from v$database;
OPEN_MODE
----------
READ WRITE

Licencia Creative Commons


Restore con RMAN: Un escenario complejo de desastre por Gisela Velazco se encuentra bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivadas 3.0 Unported.


4 comentarios:

Facundo dijo...

Hola Gisela, soy Facundo de Buenos Aires (Compañero de la Comunidad Oracle Hispana). Excelente este artículo, una calidad impecable.

Para colaborar a mejorarlo aún mas me atrevo a dejarte algunas preguntas que pueden servir para aclarar algunas cosas que no le quedarían claras si la persona no está muy acostumbrado a usar RMAN:

1) Se asume que se tiene el backup con la opción CONTROLFILE AUTOBACKUP en ON.

2) Se asume que se tiene el pfile en algún otro lado (fuera del disco roto). Cosa que no me parece que sea muy común.

3) En mi caso no se de dónde se sacan los siguientes datos para recuperar el controlfile (parms 'ENV=(tdpo_optfile=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)';) ¿Se refiere al lugar donde guardás los backups?

4) Una duda mía particular: Si en el backup de archive aparece claramente la secuencia 3440 por qué no lo recupera, lo lógico sería que falle cuando busque la secuencia 3441.

Saludos y gracias!!

Gisela Velazco dijo...

Hola Facundo, bienvenido y muchas gracias por tu comentario. Te respondo los items.
1) Si, es verdad, se asume la configuración de la opción CONTROLFILE AUTOBACKUP en ON, gracias por notarlo, lo modifico en breve.
2) En este caso, y en varios de los que me ha tocado en la empresa para la cual trabajo, es común que el archivo de configuración PFILE o SPFILE se encuentre físicamente separado de los discos destinados para la BD. El destino es el disco donde se instala el motor de BD. Es un estándar, pero es una buena observación, ya que no todas las empresas tienen las mismas políticas y estándares, nuevamente, gracias.
3) Esto se refiere al directorio físico donde esta instalada la librería del manejador de cintas, yo también lo desconozco, generalmente es proporcionado por quien se encarga del backup a cinta.
4) Si recupera la secuencia 3440, lo que no puede es continuar en la 3441, al momento de la rotura, no alcanzo a escribir el archive cuya secuencia era 3441, pero como no ocurrió un switch de redologs online, podemos obtenerlo de allí mismo.
Espero haya podido despejar tus dudas, muchas gracias por comentar!
Saludos, Gisela.

kmi dijo...
Este comentario ha sido eliminado por el autor.
Anónimo dijo...

Hola muy buen documento. Ya tengo algo de tiempo involucrándome con oracle y las bases de datos y me llamó la antención algo muy simple como las politicas y estandares que llevan en las empresas para la instalación de bases de datos oracle, sucede que donde laboro veo que cada quién tiene su metodología para instalación por lo que le quería saber si podrias brindar , alguna buena practica del cual ya nos adelantastes sobre el pfile, que otras buenas practicas debe tener un administrador en este sentido?

Publicar un comentario