Escenario 3

El escenario es el siguiente, al realizar un backup incremental nivel 1 en la base de datos, arrojó el siguiente error:

RMAN-03009: failure of backup command on t1 channel at 10/22/2011 08:07:05
ORA-19566: exceeded limit of 0 corrupt blocks for file /XXXX/data1/TBS_CORRUPTO_01.dbf

La base está en modo ARCHIVELOG, y la estrategia de backup es incremental.

Se intenta reproducir el error en RMAN

Como RMAN tiene la capacidad de tomar backup de unidades independientes, hasta el nivel de un datafile, se intenta tomar backup solo del file corrupto, seteando previamente, que admita hasta 5 corrupciones:

run
{
  allocate CHANNEL t1 type ‘SBT_TAPE’
  parms ‘ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)’;
  set maxcorrupt for datafile 696 to 5;
  BACKUP INCREMENTAL LEVEL 1 Datafile ‘/XXXX/data1/TBS_CORRUPTO_01.dbf’ ;
  release channel t1;
}

Esto no resulta, y genera el mismo error 19566:

RMAN-03009: failure of backup command on t1 channel at 10/22/2011 08:07:05
ORA-19566: exceeded limit of 0 corrupt blocks for file /XXXX/data1/TBS_CORRUPTO_01.dbf

Se realiza varios intentos, con hasta 10 maxcorrupt, sin resultar, por lo cual, es conveniente determinar el número exacto de bloques corruptos con el comando dbverify: (se ejecuta en el sistema operativo directamente)

DBVERIFY
dbv file=/XXXX/data1/TBS_CORRUPTO_01.dbf blocksize=8192
DBVERIFY – Verification complete
Total Pages Examined : 1048575
Total Pages Processed (Data) : 689334
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 358681
Total Pages Failing (Index): 0
Total Pages Processed (Other): 266
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 294
Total Pages Marked Corrupt : 256
Total Pages Influx : 0
Highest block SCN : 4194321644 (1528.4194321644)

Este comando realiza un scanner completo del archivo, buscando corrupciones.
Encontró 256 bloques corruptos.
Examinando los objetos del archivo, se encontró que la ocupación era inferior al 1% del tamaño total, por lo cual, lo más simple fue mover los objetos a otro tablespace temporalmente, eliminar el tablespace corrupto, recrearlo, y regresar los objetos movidos.

Para mover los objetos temporalmente:

Cabe aclarar que todos los objetos, eran particiones de tablas

Select ‘ALTER TABLE ‘ || Owner || ‘.’ || Segment_Name || ‘ move partition ‘ ||
       Partition_Name || ‘ tablespace tbs_nuevo; ‘
  From Dba_Segments
 Where Tablespace_Name Like ‘TBS_CORRUPTO’
   And Segment_Type Like ‘TABLE P%’

Guardamos la sentencia de creación del tbs_corrupto, para luego poder recrearlo.
Es conveniente, antes de eliminarlo por completo, redimensionar el tamaño de los datafiles que lo componen, al mínimo posible, de lo contrario, el espacio queda tomado por el sistema operativo.

Para guardar la sentencia de creación del tablespace:
set long 999999 lines 150 pages 9999
select dbms_metadata.get_ddl(‘TABLESPACE’, tablespace_name)
  from Dba_Tablespaces
where tablespace_name = ‘TBS_CORRUPTO’;
Para redimensionar los datafiles que componen el tablespace:
SELECT /*+ rule */ ‘alter database datafile »’ || name || »’ resize 10M;’
  FROM v$datafile
WHERE ts# = (SELECT TS# FROM v$TABLESPACE WHERE name = UPPER(‘&tbs_a_borrar’));
Eliminar el tablespace
DROP TABLESPACE TBS_CORRUPTO INCLUDING CONTENTS AND DATAFILES;

Recrear el tablespace, y regresarle los objetos, con los mismos comandos.

Tomar un backup del tablespace

Se efectúa un backup FULL solo del tablespace:

run
{
  allocate CHANNEL t1 type ‘SBT_TAPE’
  parms ‘ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)’;
  BACKUP Tablespace TBS_CORRUPTO;
  release channel t1;
}

Y ocurre correctamente sin errores.

Licencia Creative Commons


Backup de un tablespace con RMAN: Escenario de bloques corruptos por Gisela Velazco se encuentra bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivadas 3.0 Unported.