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 테이블은 삭제할 수도 있습니다.

  • 레이블 없음