Block Corruption -작성중-

의미
 Block Corruption은 데이터파일의 특정 Block이 망가지는 것을 의미한다. 

원인
정전이나 Shutdown Abort 등 예기치 못한 종료로 발생한다.






그림으로 보면 데이터 파일에 아래와 같은 형태로 블록들이 존재할때 'L' 블록이 Corruption이 되면 오라클은 에러를 출력한다. 
그리고 M,N.O,... 블록에 대해서는 이상유무에 대해서는 관계없이 읽지 않는다.



Oracle에는 손상된 블록을 감지하는데 두가지 Parameter가 있다

DB_BLOCK_CHECKSUM(Default true)
이것은 디스크 또는 I/O 시스템에 의해 발생한 손상을 감지한다. 시스템이 손상을 감지하기 위해 블록의 헤더에 체크섬을 사용하여, 성능에 미치는 영향을 최소화하고 있다. 
- 10g R1 이하
true : 모든 데이터파일 대상 (1~2% 오버헤드 증가)  
false : system tablespace 즉   Data Dictionary Block 만 검사한다.
- 10g R2  이후 설정
off : 검사하지 않음
typical : 모든 데이터 파일 대상. (1~2% 오버헤드 증가) 
full : 모든 데이터베이스 대상 (4~5% 오버헤드 증가)

DB_BLOCK_CHECKING
결함이 메모리에 의해 도입된 손상을 감지하도록 도와준다. (default off ). 이 옵션을 설정하면 성능에 영향을 준다. 프로세스가 손상 감지를 위해 버퍼에 액세스할 때마다 검사한다. 10 %의 CPU 오버헤드증가
alter system set db_block_checking = off;
alter system set db_block_checking = low;
alter system set db_block_checking = medium;
alter system set db_block_checking = full;





9i 공식문서에서는 두가지 해법을 제시하고 있다.
1. DBVerify ( http://docs.oracle.com/cd/B10500_01/server.920/a96652/ch13.htm#SUTIL013 )
2. DBMS_REPAIR (http://docs.oracle.com/cd/B10501_01/server.920/a96521/repair.htm ) 

하지만 위 두가지 방법은 복구 하는것이 아니라 Corruption Block 를 사용하지 않도록 체크하여 다른 블록을 사용가능하게 한다. 그래서 이 방법들은 Block Media Recovery 가 아니다.


복구를 하기 위해서는 백업파일 복원하여 Recovery를 해야한다.



DBVerify  
DBVerify 특징
- Oracle 7.3.2 버전부터 현재까지 제공되고 있는 유틸이다.
- DB Open 상태에서 사용하고 점검중인 Data File은 Read-Only 가 된다.

데이터 파일만 검사

Syntex 

dbv ::= 
  dbv FILE = filename
  | { START = block_address | END = block_address }
  | BLOCKSIZE = integer
  | LOGFILE = filename
  | FEEDBACK = integer
  | HELP  = { Y | N } 
  | PARFILE = filename



Example 

$ dev file=/home/oracle/oradata/testdb/test.dbf


DBVERIFY: Release 10.2.0.5.0 - Production on Fri Mar 9 20:54:23 2012
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
DBVERIFY - Verification starting : FILE =/home/oracle/oradata/testdb/test.dbf
DBVERIFY - Verification complete  

Total Pages Examined         : 384
Total Pages Processed (Data) : 308
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 13
Total Pages Processed (Seg)  : 1
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 62
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
Highest block SCN            : 434989 (0.434989) 



SEGMENT 검사
파일이 큰 데이터파일을 모두 검사하는것은 부담이 될 수도 있다. 그래서 특정 세그먼트만 대상으로 검사가 가능하다.

Syntex

  dbv2 ::= 

  dbv USERID = username/password 

  | SEGMENT_ID = tsn.segfile.segblock

  | LOGFILE = filename

  | FEEDBACK = integer

  | HELP  = { Y | N }

  | PARFILE = filename  


 데이터 파일을 검사하는 것과 다르게 SEGMENT_ID 의 값을 넣어야 한다.
세그먼트의 정보를 알아내는 쿼리는 다음과 같다. 
SELECT t.ts#, s.header_file, s.header_block
FROM v$tablespace t, dba_segments s 
WHERE s.segment_name='test01'
AND t.name = s.tablespace_name 

Example

$ dbv userid=scott/tiger segment_id=7.7.11

DBVERIFY: Release 10.2.0.5.0 - Production on Fri Mar 9 20:54:23 2012

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

DBVERIFY - Verification starting : SEGMENT_ID = 7.7.11

DBVERIFY - Verification complete
Total Pages Examined         : 384
Total Pages Processed (Data) : 308
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 13
Total Pages Processed (Seg)  : 1
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 62
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
Highest block SCN            : 434989 (0.434989)





DBMS_REPAIR  

DBMS_REPAIR 특징

8i 버전부터 등장한 패키지이다. 이름에는 Repair 이지만 해당 블록을 Repair하지 않고 위에서 한번 설명했듯이 Corrupt Block 을 mark 하고 사용하지 않는다. 즉 해당 블록의 내용은 모두 손실된다.

DBMS_REPAIR 패키지에는 여러개의 프로시저를 포함하고 있다.

프로시저 목록

ADMIN_TABLE





CHECK_OBJECT

DUMP_ORPHAN_KEYS

FIX_CORRUPT_BLOCKS

REBUILD_FREELISTS

SEGMENT_IFX_STATUS

SKIP_REPAIR










set serveroutput on;
declare n_corrupt int;
begin
n_corrupt := 0;
dbms_repair.check_object(
schema_name => 'SYS'
, object_name => 'TT1'
, repair_table_name => 'REPAIR_TABLE'
, corrupt_count => n_corrupt);
dbms_output.put_line ('장애블록수:' ||to_char(n_corrupt));
end;
/



set serveroutput on
declare n_fix int;
begin
n_fix := 0;
dbms_repair.fix_corrupt_blocks(
schema_name => 'SYS',
object_name => 'TT1',
object_type => dbms_repair.table_object,
repair_table_name => 'REPAIR_TABLE',
fix_count => n_fix);
dbms_output.put_line ('fix_count: '|| to_char(n_fix));
end;
/


begin
dbms_repair.skip_corrupt_blocks(
schema_name => 'SYS',
object_name => 'TT1',
object_type => dbms_repair.table_object,
flags => dbms_repair.skip_flag);
end;
/





col object_name for a10
col corrupt_description for a20
col repair_description for a20
select object_name, block_id, corrupt_type, marked_corrupt, corrupt_description, repair_description
  from repair_table;
  
  
  OBJECT_NAM   BLOCK_ID CORRUPT_TYPE MARKED_CORRUPT       CORRUPT_DESCRIPTION  REPAIR_DESCRIPTION
---------- ---------- ------------ -------------------- -------------------- --------------------
TT1                29         6148 TRUE                                      mark block software
                                                                             corrupt

ERROR:
ORA-01578: ORACLE data block corrupted (file # 7, block # 29)
ORA-01110: data file 7: '/dev/raw/raw16'

'Oracle > 백업 & 복구 & 장애' 카테고리의 다른 글

datapump &  (0) 2012.04.04
EM Agent Connection to Instance 오류  (0) 2012.03.29
Control File 장애와 복구 CASE  (0) 2012.02.12
Oracle sys 계정 암호 사용하기.  (0) 2012.02.12
Archive Log와 Archive Hang  (0) 2012.02.03