Como solventar corrupción de bloques en datafiles

#OracleACE

#OracleTipsSV

#Raul Antonio Molina Alvarenga

Un día de estos me cruce con una situación en la que obtuve corrupción de bloques en una BD productiva muy grande e importante, bastante preocupante la situación, no daré detalles, pero se estuvo bajo mucha presión (LOL).

Porque es importante tener todos los bloques de datos marcados como limpios y no como corruptos?, obvio el acceso a los datos y el uso de indices.

Pero porque es importante limpiar bloques vacios?, porque a pesar de ser bloques vacios, el diccionario los conoce como corruptos y no se puede tener un backup rman 100% fiable.

Dicho esto, Lo importante en la definición de la solución fue lo siguiente para solventar corrupción en:

Bloques de datos en tablas , poder prescindir de ellos, o restaurar de un backup la tabla

Bloques de datos en indices, reconstruir el indice

Bloques Vacíos, yo pensaba que era solo ignorarlos, pero no.

En este ultimo aspecto, necesitaba se limpiaran, para poder dar el OK del datafile o de los datafiles afectados.

Encontré una nota de MOS:

Use RMAN to format corrupt data block which is not part of any object (Doc ID 1459778.1)

Haciendo la revision se encontro que los bloques que aparecen marcados como corruptos, son bloques vacios.

List of Datafiles

=================

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN

—- —— ————– ———— ————— ———-

68   FAILED 0              129          4194293         10192968188924

  File Name: /archives/datafile_archivo_datats_12

  Block Type Blocks Failing Blocks Processed

  ———- ————– —————-

  Data       1              3443658

  Index      0              461648

  Other      29             288837

validate found one or more corrupt blocks

See trace file /u01/app/oracle/diag/rdbms/bd/BD/trace/BD_ora_21367.trc for details

channel ORA_DISK_8: validation complete, elapsed time: 00:32:45

List of Datafiles

=================

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN

—- —— ————– ———— ————— ———-

160  FAILED 0              317          4194272         10192967869622

  File Name: /archivesdatafile_archivo_datats_18

  Block Type Blocks Failing Blocks Processed

  ———- ————– —————-

  Data       2              3353890

  Index      0              501888

  Other      26             338177

validate found one or more corrupt blocks

See trace file /u01/app/oracle/diag/rdbms/bd/BD/trace/BD_ora_21367.trc for details

channel ORA_DISK_4: validation complete, elapsed time: 00:31:35

List of Datafiles

=================

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN

—- —— ————– ———— ————— ———-

181  FAILED 0              890          2992000         10192962696244

  File Name: /archives/bd_datafile_datats_01

  Block Type Blocks Failing Blocks Processed

  ———- ————– —————-

  Data       2              2947506

  Index      0              38605

  Other      31             4999

validate found one or more corrupt blocks

See trace file /u01/app/oracle/diag/rdbms/bd/BD/trace/BD_ora_21367.trc for details

channel ORA_DISK_5: validation complete, elapsed time: 00:23:15

Formas de resolver la corrupcion en terminos del contenido:

Segmentos de datos de tablas: se debe resolver restaurando de backup o estableciendo si es un dato prescindible o no.

Segmentos de datos de indices: puede reconstruirse el indice y el bloque se formateara como nuevo.

Segmentos vacios: deben ser formateados , pero a no tener bloques con datos no es tan sencillo.

Debemos conocer los datafiles con segmentos de espacio libre que estan marcados como corruptos.

El procedimiento para resolver es el siguiente:

Procedimiento  para reparar bloques corruptos cuando es espacio libre

Identificamos los datafiles que tienen bloques corruptos en espacio libre, y se chequean

 VALIDATE CHECK LOGICAL DATAFILE   68,79,85,141,160,181,331,406;

 160,181,68 

Puede corroborarse su contenido desde varias perspectivas:

SELECT tablespace_name, segment_type, owner, segment_name FROM dba_extents WHERE file_id = 160 and 521184 between block_id AND block_id + blocks – 1;

select TABLESPACE_NAME,RELATIVE_FNO,BYTES from DBA_FREE_SPACE where FILE_ID=160 and 521184 between BLOCK_ID AND BLOCK_ID + BLOCKS -1;

 backup check logical datafile  160 format ‘/backup/rman/%U’ tag ‘CORRUPT_BLK_FILE_BKP’;

Se realiza un backup del datafile, hay que tomar en cuenta el numero de saltos que se pueden permitir para que el backup no muestre error:

 run

 {

  set maxcorrupt for datafile 181 to 150;

  backup as copy  datafile 68,160 format ‘+dgarea’;

 }

Luego restauramos el datafile del backup.

 run {

 set newname for datafile 160 to ‘+dgdatos’;

 restore datafile 160 from tag ‘CORRUPT_BLK_FILE_BKP’;

 }

Al consultar, deberia desaparecer las filas para dicho datafile:

select block#||’,’ from v$database_block_corruption   where file#= 160;

select block#||’,’ from v$database_block_corruption   where file#= 68;

Por ultimo, realizamos la recuperacion de los bloques corruptos de la copia que se realizo previamente:

 blockrecover datafile 68 block 846959 FROM DATAFILECOPY;

  RECOVER CORRUPTION LIST;

Y debería desaparecer completamente y tener un datafile totalmente sano en terminos de corrupción de bloques.

  VALIDATE CHECK LOGICAL DATAFILE 68,160;

  select block#||’,’ from v$database_block_corruption   where file#=160;

Espero les sea de utilidad.

Saludos.