miércoles, 18 de abril de 2018

DBMS_REPAIR

Si se te han presentado problemas de corrupción de bloques de datos y no tienes implementado backup con RMAN o tu respaldo de RMAN no está a un punto del tiempo para resolver el problema de corrupción de datos, hay otra forma de reparar estos bloques con el paquete DBMS_REPAIR.

Oracle proporciona varias opciones para detectar y reparar bloques corruptos entre ellas DBMS_REPAIR, paquete con funcionalidades para las tareas de detección y reparación de bloques corruptos.


Descripción DBMS_REPAIR

Procedure Name Description
ADMIN_TABLES Permite crear, borrar y eliminar las tablas administrativas repair o orphan key . Nota: These Por defecto se crean en el SYS.
CHECK_OBJECT Detecta y reporte la corrupcion de bloques en tablas o indices.
DUMP_ORPHAN_KEYS Reporta los bloques de datos corruptos para los indices
FIX_CORRUPT_BLOCKS Marca los bloques de datos corruptos que previamente fueron identificados por CHECK_OBJECT procedure
REBUILD_FREELISTS Rebuilds the free lists of the object
SEGMENT_FIX_STATUS Provides the capability to fix the corrupted state of a bitmap entry when segment space management is AUTO
SKIP_CORRUPT_BLOCKS When used, ignores blocks marked corrupt during table and index scans. If not used, you get error ORA-1578 when encountering blocks marked corrupt.


Lo primero que hay que hacer antes de usar el DBMS_REPAIR es detectar los objetos que tienen los bloques corruptos, pueden revisar "http://oracle-y-yo.blogspot.com/2018/04/reparar-tablas-con-bloques-de-datos.html" y ver los modos de detectar los objetos con bloques corruptos.

Pasos para el uso del DBMS_REPAIR

1 Crear las estructuras REPAIR_TABLE y ORPHAN_KEY_TABLE
REPAIR_TABLE almacena los id de los bloques corruptos para los segmentos a nivel de tabla y ORPHAN_KEY_TABLE los id de los bloques corruptos a nivel de indices

--Creacion de REPAIR_TABLE
BEGIN
DBMS_REPAIR.ADMIN_TABLES (
     TABLE_NAME => 'REPAIR_TABLE',
     TABLE_TYPE => dbms_repair.repair_table,
     ACTION     => dbms_repair.create_action,
     TABLESPACE => 'USERS');
END;
/

--Creacion de ORPHAN_KEY_TABLE
BEGIN
DBMS_REPAIR.ADMIN_TABLES (
     TABLE_NAME => 'ORPHAN_KEY_TABLE',
     TABLE_TYPE => dbms_repair.orphan_table,
     ACTION     => dbms_repair.create_action,
     TABLESPACE => 'USERS');
END;
/
--TABLESPACE Es recomendable establecer, sino se crea en el default
--del SYS


2 Detectar la corrupción
Buscar los bloques de datos de tablas e indices.

--REPAIR_TABLE

--Detectar los bloques corruptos a nivel de tabla.
--Esto se realiza por cada objeto tabla, los id de los bloques
--corruptos se almacenaran en la tabla REPAIR_TABLE
SET SERVEROUTPUT ON
DECLARE num_corrupt INT;
BEGIN
num_corrupt := 0;
DBMS_REPAIR.CHECK_OBJECT (
     SCHEMA_NAME => 'SCOTT',
     OBJECT_NAME => 'DEPT',
     REPAIR_TABLE_NAME => 'REPAIR_TABLE',
     CORRUPT_COUNT =>  num_corrupt);
DBMS_OUTPUT.PUT_LINE('number corrupt: ' || TO_CHAR (num_corrupt));
END;
/
--ORPHAN_KEY_TABLE
--Detectar los bloques corruptos a nivel de indices.
--Esto se realiza por cada objeto tabla, los id de los bloques
--corruptos se almacenaran en la tabla ORPHAN_KEY_TABLE. Por cada
--indice que tenga la tabla se tendra que ejecutar la rutina
DECLARE num_orphans INT;
BEGIN
num_orphans := 0;
DBMS_REPAIR.DUMP_ORPHAN_KEYS (
     SCHEMA_NAME => 'SCOTT',
     OBJECT_NAME => 'PK_DEPT',
     OBJECT_TYPE => dbms_repair.index_object,
     REPAIR_TABLE_NAME => 'REPAIR_TABLE',
     ORPHAN_TABLE_NAME=> 'ORPHAN_KEY_TABLE',
     KEY_COUNT => num_orphans);
DBMS_OUTPUT.PUT_LINE('orphan key count: ' || TO_CHAR(num_orphans));
END;
/

SQL para ver los datos de los bloques corruptos.

--Select a la tabla REPAIR_TABLE
SELECT OBJECT_NAME, BLOCK_ID, CORRUPT_TYPE, MARKED_CORRUPT,
       CORRUPT_DESCRIPTION, REPAIR_DESCRIPTION
     FROM REPAIR_TABLE;


3 Reparar los bloques corruptos

A nivel de tabla

--Ejecutar la reparación
SET SERVEROUTPUT ON
DECLARE num_fix INT;
BEGIN 
num_fix := 0;
DBMS_REPAIR.FIX_CORRUPT_BLOCKS (
     SCHEMA_NAME => 'SCOTT',
     OBJECT_NAME=> 'DEPT',
     OBJECT_TYPE => dbms_repair.table_object,
     REPAIR_TABLE_NAME => 'REPAIR_TABLE',
     FIX_COUNT=> num_fix);
DBMS_OUTPUT.PUT_LINE('num reparaciones: ' || TO_CHAR(num_fix));
END;
/
SQL*Plus outputs the following line:
num reparaciones: 1

--Si num reparaciones no da igual  al numero de registros dentro de REPAIR_TABLE esto
--quiere decir que no se realizó la reparacion de forma completa.

--SQL para determinar si la reparaciión fue realizada.
SELECT OBJECT_NAME, BLOCK_ID, MARKED_CORRUPT
     FROM REPAIR_TABLE;

OBJECT_NAME                      BLOCK_ID MARKED_COR
------------------------------ ---------- ----------
DEPT                                    3 TRUE
 


A nivel de indice

--Ejecutar la reparación, por cada indice de la tabla se tendra
--que realizar
SET SERVEROUTPUT ON
DECLARE num_orphans INT;
BEGIN
num_orphans := 0;
DBMS_REPAIR.DUMP_ORPHAN_KEYS (
     SCHEMA_NAME => 'SCOTT',
     OBJECT_NAME => 'PK_DEPT',
     OBJECT_TYPE => dbms_repair.index_object,
     REPAIR_TABLE_NAME => 'REPAIR_TABLE',
     ORPHAN_TABLE_NAME=> 'ORPHAN_KEY_TABLE',
     KEY_COUNT => num_orphans);
DBMS_OUTPUT.PUT_LINE('orphan key count: ' || TO_CHAR(num_orphans));
END;
/
OUTPUT
orphan key count: 3


Hay que tener en cuenta que no siempre se puede obtener la reparación completa

4 Saltándose los bloques corruptos
El procedimiento SKIP_CORRUPT_BLOCKS habilita o deshabilita la omisión de bloques dañados durante la búsqueda en índice y tabla del objeto especificado. Cuando el objeto es una tabla, la omisión se aplica a la tabla y sus índices. Cuando el objeto es un clúster, se aplica a todas las tablas del clúster y a sus respectivos índices

--Habilitar el salto de bloques corruptos
BEGIN
DBMS_REPAIR.SKIP_CORRUPT_BLOCKS (
     SCHEMA_NAME => 'SCOTT',
     OBJECT_NAME => 'DEPT',
     OBJECT_TYPE => dbms_repair.table_object,
     FLAGS => dbms_repair.skip_flag);
END;
/

Querying scott's tables using the DBA_TABLES view shows that SKIP_CORRUPT is enabled for table scott.dept.
SELECT OWNER, TABLE_NAME, SKIP_CORRUPT FROM DBA_TABLES
    WHERE OWNER = 'SCOTT';

OWNER                          TABLE_NAME                     SKIP_COR
------------------------------ ------------------------------ --------
SCOTT                          ACCOUNT                        DISABLED
SCOTT                          BONUS                          DISABLED
SCOTT                          DEPT                           ENABLED
SCOTT                          DOCINDEX                       DISABLED
SCOTT                          EMP                            DISABLED
SCOTT                          RECEIPT                        DISABLED
SCOTT                          SALGRADE                       DISABLED
SCOTT                          SCOTT_EMP                      DISABLED
SCOTT                          SYS_IOT_OVER_12255             DISABLED
SCOTT                          WORK_AREA                      DISABLED
 



No hay comentarios:

Publicar un comentario