EXEC DBMS_REPAIR.ADMIN_TABLES('REPAIR_TABLE', DBMS_REPAIR.REPAIR_TABLE, DBMS_REPAIR.CREATE_ACTION); EXEC DBMS_REPAIR.ADMIN_TABLES('ORPHAN_KEYS_TABLE', DBMS_REPAIR.ORPHAN_TABLE, DBMS_REPAIR.CREATE_ACTION); |
{}
sys 계정으로 접속하여 패키지에서 사용할 테이블을 생성합니다.
-- DESCRIBE ORPHAN_KEYS_TABLE; -- DESCRIBE REPAIR_TABLE; SELECT * FROM ORPHAN_KEYS_TABLE; SELECT * FROM REPAIR_TABLE; |
SET SERVEROUTPUT ON DECLARE v_num_corrupt INT; BEGIN v_num_corrupt := 0; DBMS_REPAIR.check_object ( schema_name => '<스키마명>', object_name => '<테이블명>', -- partition_name => '<파티션명>', repair_table_name => 'REPAIR_TABLE', corrupt_count => v_num_corrupt); DBMS_OUTPUT.put_line('number corrupt: ' || TO_CHAR (v_num_corrupt)); END; / |
테이블의 깨진 블록을 체크합니다.
0건 보다 큰 값을 출력할 경우 REPAIR_TABLE에서 조회할 수 있습니다.
파티션 레벨에서 작업을 하려면 partition_name 옵션을 사용합니다.
SET SERVEROUTPUT ON DECLARE v_num_fix INT; BEGIN v_num_fix := 0; DBMS_REPAIR.fix_corrupt_blocks ( schema_name => '<스키마명>', object_name => '<테이블명>', -- partition_name => '<파티션명>', object_type => Dbms_Repair.table_object, repair_table_name => 'REPAIR_TABLE', fix_count => v_num_fix); DBMS_OUTPUT.put_line('num fix: ' || TO_CHAR(v_num_fix)); END; / |
깨진 블록을 corrupt 블록으로 마킹합니다.
마킹된 블록은 테이블이 correct 모드일 때 DML 또는 조회시에 스킵됩니다.
파티션 레벨에서 작업을 하려면 partition_name 옵션을 사용합니다.
SET SERVEROUTPUT ON DECLARE v_num_orphans INT; BEGIN v_num_orphans := 0; DBMS_REPAIR.dump_orphan_keys ( schema_name => '<스키마명>', object_name => '<인덱스명>', -- partition_name => '<파티션명>', object_type => DBMS_REPAIR.index_object, repair_table_name => 'REPAIR_TABLE', orphan_table_name => 'ORPHAN_KEY_TABLE', key_count => v_num_orphans); DBMS_OUTPUT.put_line('orphan key count: ' || TO_CHAR(v_num_orphans)); END; / |
깨진 블록과 연관된 인덱스 키를 확인합니다.
0보다 큰 값을 출력할 경우 인덱스 rebuild가 필요합니다.
파티션 레벨에서 작업을 하려면 partition_name 옵션을 사용합니다.
BEGIN DBMS_REPAIR.rebuild_freelists ( schema_name => '<스키마명>', object_name => '<테이블명>', -- partition_name => '<파티션명>', object_type => DBMS_REPAIR.table_object); END; / |
마킹된 Corrupt 블록을 프리 리스트에서 제거하고 프리 리스트를 정리합니다.
이후에 모든 DML 작업에서 깨진 블록을 재사용하지 않도록 하기 위한 조치입니다.
ASSM 모드인 테이블스페이스는 ORA-10614가 발생하며, 생략해도 되는 작업입니다.
파티션 레벨에서 작업을 하려면 partition_name 옵션을 사용합니다.
BEGIN DBMS_REPAIR.skip_corrupt_blocks ( schema_name => '<스키마명>', object_name => '<테이블명>', object_type => DBMS_REPAIR.table_object, flags => DBMS_REPAIR.skip_flag); END; / |
DML 수행시 깨진 블록을 skip하도록 테이블의 모드를 변경합니다.
처리 결과는 DBA_TABLES의 SKIP_CORRUPT 컬럼에서 확인할 수 있습니다.
파티션 레벨에서는 skip_corrupt 모드를 변경할 수 없습니다.
EXEC DBMS_REPAIR.ADMIN_TABLES('REPAIR_TABLE', DBMS_REPAIR.REPAIR_TABLE, DBMS_REPAIR.PURGE_ACTION); EXEC DBMS_REPAIR.ADMIN_TABLES('ORPHAN_KEYS_TABLE', DBMS_REPAIR.ORPHAN_TABLE, DBMS_REPAIR.PURGE_ACTION); |
정리가 완료된 블록들의 정보를 Repair 테이블과 Orphan 테이블에서 정리합니다.
-- EXEC DBMS_REPAIR.ADMIN_TABLES('REPAIR_TABLE', DBMS_REPAIR.REPAIR_TABLE, DBMS_REPAIR.DROP_ACTION); -- EXEC DBMS_REPAIR.ADMIN_TABLES('ORPHAN_KEYS_TABLE', DBMS_REPAIR.ORPHAN_TABLE, DBMS_REPAIR.DROP_ACTION); |
사용한 Repair 테이블과 Orphan 테이블은 삭제할 수도 있습니다.