1. 사전 준비
A) Repair 및 Orphan 테이블 생성
Repair, Orphan 테이블 생성하기
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 계정으로 접속하여 패키지에서 사용할 테이블을 생성합니다.
- Repair 테이블은 블록이 깨진 테이블의 정보를 저장
- Orphan 테이블은 깨진 블록과 연관된 인덱스의 정보 저장
생성된 테이블 확인
-- DESCRIBE ORPHAN_KEYS_TABLE; -- DESCRIBE REPAIR_TABLE; SELECT * FROM ORPHAN_KEYS_TABLE; SELECT * FROM REPAIR_TABLE;
2. Corrupt 블록 확인 및 정리
A) Object 확인
Check Object
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 옵션을 사용합니다.
B) Corrupt 블록에 대한 작업
Fix Corrupt Blocks
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 옵션을 사용합니다.
C) 연관된 인덱스 정리
Dump Orphan Keys
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 옵션을 사용합니다.
D) 프리 리스트에서 깨진 블록 정보 제거
Rebuild Free Lists
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 옵션을 사용합니다.
E) 테이블 모드 변경
Skip Corrupt Blocks
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 모드를 변경할 수 없습니다.
3. 정리 작업
A) 정리가 완료된 블록의 정보 제거
Repair, Orphan 테이블 정리하기
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 테이블에서 정리합니다.
B) 테이블 삭제(옵션)
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 테이블은 삭제할 수도 있습니다.