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
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
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
2 Detectar la corrupción
--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.
SQL para ver los datos de los bloques corruptos.
3 Reparar los bloques corruptos
A nivel de tabla
A nivel de indice
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
--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