26
dic
08

Reparar Bloques corruptos

Unos de los mas dificiles errores que nos podemos encontrar en una Base de datos es que surjan bloques de datos corruptos.

Si se nos presenta este error experimentaremos un incremento de tiempo en las queries o recibiriamos errores ORA-01498.

Oracle tiene varias herramientas que nos ayudan a identificar y fijar los datos corruptos que se estan dando en una base de datos:

a) ANALYZE TABLE table_name VALIDATE STRUCTURE.
b) DBVERIFY.
c) DB_BLOCK_CHECKING parametro.
d) DBMS_REPAIR

ANALYZE TABLE

Esta sentencia se utiliza para validar la estructura de los objetos. Si esta sentencia devuelva un error significa que existen bloques erroneos correspondientes a esa tabla.

sql> analyze table MiSquema.Mitabla validate structure;

UTILIDAD DBVERIFY

Se utiliza para validar si existen bloques corruptos en un determinado datafile. Es necesario indicarle mediante el pametro blocksize el tamaño del bloque que tenemos configurada en el parametro de inicializacion.

>dbv blocksize=8192 file=MiDatafile.dbf

DB_BLOCK_CHEKING

DB_BLOCK_CHEKING es un parametro de inicializacion que obliga a hacer u testeo de los bloques de un tablespace cada vez que se va a hacer una modificacion.

DBMS_REPAIR

Este paquete permite identificar y fijar los bloques corruptos en tablas e indices. Este paquete se corresponde de varios procesos almacenados:

CHECK_OBJECT: Detecta si existen bloques corruptos en tablas o indices.
FIX_CORRUPT_BLOCKS: Marca aquellos bloques corruptos.
DUMP_ORPHAN_KEYS: indica aquellos indices que eran apuntados por bloques corruptos.
REBUILT_FREELISTS
SEGMENT_FIX_STATUS
SKIP_CORRUPT_BLOCKS: Se debe de utilizar para evitar el ORA-1578 que devolveria tras fijar un bloque corrupto.
ADMIN_TABLES:

Vamos a simular la identificacion y fijado de datos corruptos dentro de una tabla:

sql> connect / as sysdba
sql> analyze table MiSquema.Mitabla validate structure;
SALIDA: ORA-1498
Examinaremos el fichero de trazas para identificar el fichero corrupto:
SALIDA: data_block_dump
=============
nrow=5
Creamos una tabla de recuperación para almacenar la informacion devuelta por este paquete.

dbms_repair.dbms_tables
(table_name=>’REPAIR_TABLE’,
table_type=>dbms_reparir.repair_table,
action=> dbms_repair.create_action,
tablespace=>’USERS’
);

Comprobamos si existen bloques corruptos en la tabla.

DECLARE
rpr_count int;
BEGIN
dbms_repair.check_object
(schema_name =>’MiSquema’,
object_name=>’MiTabla’,
repair_table_name=>’REPAIR_TABLE’,
corrupt_count=>rpr_count);
END

En rpr_count almacena el numero de bloques corruptos que ha encontrado.

La siguiente query muestra la informacion sobre el objeto afectado por el bloque corrupto.

sql>select object_name, block_id, corrupt_type, marked_corrupt, from REPAIR_TABLE;

Antes de marcar el bloque como no utilizable deberia hacerse un copia de seguridad de la tabla.

sql> create table MiTable_back as
select * from MiTable
where dbms_rowid.rowid_block_number(rowid)=5
and dbms_rowid.rowid_to_absolute_fno(rowid,’MiSquema’,’MiTable’)=4

Marcamos el bloque como no utilizable:

DECLARE
fix_block_count int;
BEGIN
fix_block_count:=0;
dbms_repair.fix_corrupt_blocks(
schema_name=>’MiSquema’,
object_name=>’MiTable’,
object_type=> dbms_repair.table_object,
repair_table_name=>’REPAIR_TABLE’,
fix_count=>fix_block_count);
END;

About these ads

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

A %d blogueros les gusta esto: