1. DBMS_REPAIR Package 를 이용한 Data Block Recovery
2. DBMS_REPAIR Package 를 이용한 Index Block Recovery

DBMS_REPAIR Package 를 이용한 Block Recovery

 

- DBMS_REPAIR Package? -

à 오라클 8i 버전부터 등장한 Block Corruption 을 발견하고 복구하는 패키지

이 패키지는 Table Block 과 Index Block 을 조사하여 문제가 있는 Block 을 수정해주는 Data corruption repair 패키지를 가지고 있으며 sys 계정으로 작업해야 합니다.

à Corrupted block 을 recover 해주는 것이 아닌 mark 작업만을 수행하여 해당 블록을 Access 하는 것을 막아 줌으로서 전체 Data file 을 사용가능 하게 해주는 것입니다.

 

- DBMS_REPAIR 의 제약 사항 및 한계점 -

à LOB 나 Cluster Index 는 지원하지 않습니다.

à DUMP_ORPHAN_KEYS 프로시저는 Bitmap Index, Function-Based Index 는 지원하지 않으며 3,950 bytes 이상은 지원하지 못합니다.

 

- DBMS_REPAIR 설정-

à Block Corruption 찾아내기

- 관련 패키지 (CHECK_OBJECT, FIX_CORRUPT_BLOCK)

- 위 패키지들을 사용하려면 ADMIN_TABLE 이 실행 되어야 합니다.

à REPAIR_TABLE 생성

SQL>conn / as sysdba;

Connected.

SQL> begin

2 dbms_repair.admin_tables(

3 table_name => 'REPAIR_TABLE',

4 table_type => dbms_repair.repair_table,

5 action => dbms_repair.create_action,

6 tablespace => 'USERS');

7 end;

8 /

 

PL/SQL procedure successfully completed.

 

- repair_table or dba_repair_table 모두 사용 가능합니다.

 

à Orphan-key-table 찾아내기

- 장애 난 테이블과 관련 있는 다른 Object 를 저장하는 Table : 관련 인덱스나 FK 등의 정보를 저장하는 곳.

- 테이블 검사를 하다가 관련있는 인덱스 등이 문제가 있을 수 있기 때문에 미리 생성해 둡니다.

SQL>

1 begin

2 dbms_repair.admin_tables(

3 table_name => 'ORPHAN_KEY_TABLE',

4 table_type => dbms_repair.orphan_table,

5 action => dbms_repair.create_action,

6 tablespace => 'USERS');

7* end;

PL/SQL procedure successfully completed.

 

à DB_Block_checking = true;

- 모든 블록을 체크하기 위한 파라미터

- Overhead 가 발생할 수 있음

- False 일 경우 System Tablespace 만 체크하고 나머지는 Skip 함

-alter system set dba_block_checking=true scope=spfile;

 

- DBMS_REPAIR 실행-

Step 1. db_blcok_checking=true 설정한 후 재 시작 수행

SQL>show parameter db_block_checking;

SQL>alter system set db_blcok_checking=true;

 

Step 2. Block Corruption 발생

- Test 용 Tablespace 생성

- Test1 을 생성합니다.

 

- test1 Tablespace 에 Table 생성 후 데이터를 입력 합니다.

 

- Raw Device 기반이기 때문에 offline 시킨 후 dd 명령어로 복사를 수행했습니다.

- 사용자 환경에 맞게 복사해 주세요

- WinSCP 란 어플리케이션을 이용하여 Windows 로 파일을 복사합니다.

- 이는 파일을 수정하기 위해 Windows 용 프로그램을 사용하기 위해서 그런 것 입니다. RHEL 용 프로그램으로 수정하셔도 상관 없습니다.

- 저는 Ultra Editor 를 사용하여 다음의 ASCII 코드를 찾아 다음의 16진수 메모리를 수정해 줬습니다.

 

 

- 그리곤 다시 원래 경로로 복사

 

- Test1 Tablespace 를 온라인 시키려 하니 복구가 필요하다고 나옵니다.

SQL>Recover tablespace test1;

SQL>alter tablespace test1 online;

- 그리곤 scott.tt910 테이블 데이터들을 조회하려고 하니 Block Corruption 이 발생했다고 나옵니다.

 

 

 

Step 3. DBMS_REPAIR 를 사용하여 에러를 찾습니다.

 

- 위 화면에서 장애 블록을 찾은 것을 확인 할 수 있습니다.

 

- 장애 블록에 대한 자세한 정보를 알아보기 위해서 다음과 같은 쿼리를 수행합니다.

 

 

Step 4. Corrupt 된 블록을 Fix 하겠습니다.

- 이 부분은 corrupt 된 블록을 찾아서 corrupt 되었다고 marking 하는 부분인데 check_object 부분에서 자동으로 해서 다시 안 하셔도 상관 없습니다.

SQL> set serveroutput on

SQL> declare n_fix int;

2 begin

3 n_fix:=0;

4 dbms_repair.fix_corrupt_blocks (

5 schema_name => 'SCOTT',

6 object_name => 'TT910',

7 object_type => dbms_repair.table_object,

8 repair_table_name => 'REPAIR_TABLE',

9 fix_count => n_fix);

10 dbms_output.put_line('fix_count:'||to_char(n_fix));

11 end;

12 /

fix_count:0 ß check_object 부분에서 해서 여기서는 0으로 나옵니다.

PL/SQL procedure successfully completed.

 

Fix 를 한다는 것은 해당 블록에 Corruption 이 발생하여 사용 못하니 더 이상 읽지도 쓰지도 말라는 표시를 한다는 뜻 입니다. 즉 블록 안에 있는 데이터를 복구하는 것이 아닌 Marking 작업만 수행한다는 뜻입니다.

Fix 를 하고 난 후에 해당 테이블에 Select 를 수행 하겠습니다.

- 여전히 해당 블록에 문제가 있다고 나오고 select 가 정상적으로 수행이 안됩니다. 이는 데이터 파일에 수많은 블록에 데이터가 들어있다고 가정 할 경우 1개의 block 에 corrupt 가 발생할 경우 전체 데이터를 읽어 오지 못하는 상황이 된다는 뜻입니다. 나머지 Data 를 살리기 위해서 다음의 작업을 수행 하시면 됩니다.

 

Step 5. Corrupt 된 Block 을 Skip 하도록 설정

1 begin

2 dbms_repair.skip_corrupt_blocks (

3 schema_name => 'SCOTT',

4 object_name => 'TT910',

5 object_type => dbms_repair.table_object,

6 flags => dbms_repair.skip_flag);

7* end;

PL/SQL procedure successfully completed.

SQL>

 

정상적으로 Select 가 수행 되는 것을 알 수 있지만 Block 에 존재했던 Data는 사라진 것을 알 수 있습니다.

- Skip corrupt 설정된 것을 확인하기 위해서는 아래의 쿼리를 수행하시면 됩니다.

+ Recent posts