#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.