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 설정된 것을 확인하기 위해서는 아래의 쿼리를 수행하시면 됩니다.
'Oracle > Backup&Recover' 카테고리의 다른 글
BBED (Block Browser and Editor) (0) | 2011.10.21 |
---|---|
BBED (Block Browser and Editor) 를 활용한 Block Recovery (0) | 2011.10.21 |
DBVerify 실행하기 (0) | 2011.10.19 |
RAC 복구 (Redo log file 전체 손상) (0) | 2011.10.19 |
RAC (Archive mode 에서 장애 복구3) (0) | 2011.10.18 |