본문 바로가기
oracle/[Recovery] 기타

[Block Corruption and Repair] DBVerify

by #moonyz 2014. 11. 18.

[DBVerify Utility]

- ORACLE 7.3.2 버전부터 현재까지 제공됨

- Data file block과 index file block, undo block 등을 점검해주는 유틸리티

- Database가 Open되어 있는 상태에서 사용가능 (DB중단없이가능)

- 점검중인 data file은 Read-only가 되기때문에 점검중일때 DML작업이 발생하면 잠시 작업이 중단되었다가 다시 실행됨



[문법]

$ dbv file=파일명 [옵션]



[옵션]

 옵션

설명 

FILE

 점검해야 할 파일명 

START

 점검을 시작할 블록 번호설정, 기본값은 해당파일의 첫번째 블록 

END

 점검을 종료할 블록 번호 설정, 기본값은 해당파일의 마지막 블록 

BLOCKSIZE

 점검을 원하는 파일의 블록크기, 기본값은 2048(2k) 

LOGFILE

 점검 결과를 저장할 파일명 지정, 기본값 none, 검사결과를 화면에 출력 

FEEDBACK

 검사가 진행되는 동안 .(dot)으로 진행과정 표시, 0이상의 숫자로 설정(기본값은 0초) 

 PARFILE

 dbv를 실행할때 각종 설정들을 파일에 저장해두고 불러와서 사용 (exp/imp의 parfile) 

USERID

 ASM기반의 파일을 점검할 경우 ASM인스턴스에 접속해야하기때문에 반드시 userid사용해야함 

 SEGMENT_ID

 특정세그먼트(table, index, undo)만 골라서 검사가능, 9i이상에서만 사용가능



[DBV의 주요특징]

 Block Level에서만 점검가능, 

   Analyze table.. Validate structure와 같은 테이블과 인덱스간의 불일치 같은 문제는 점검불가


② 오직 데이터파일만 점검가능,

   즉 Redo log file이나 Control file은 점검 불가, Redo log file을 점검하려고 시도하면 에러발생

[oracle@localhost ~]$ dbv file=/app/oracle/oradata/testdb/redo01_a.log

DBVERIFY: Release 11.2.0.2.0 - Production on Mon Nov 17 19:20:56 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

DBV-00103: Specified BLOCKSIZE (8192) differs from actual (512)


③ ASM 파일까지 점검가능,

   단 ASM 인스턴스에 로그인할수 있는 계정정보를 함께 입력해야함

[oracle@localhost ~]$ dbv file=+ASM/TESTDB/datafile/system01.dbf userid=system/oracle


④ 특정 데이터 파일이 아닌 세그먼트 단위로 검사가능

    예) 크기가 아주 큰 고객 테이블만 검사하기, 특정 인덱스만 검사하기



[DBVerify 실행하기]

1. 특정파일 검사하기

[oracle@localhost ~]$ dbv file=/app/oracle/oradata/testdb/system01.dbf


DBVERIFY: Release 11.2.0.2.0 - Production on Mon Nov 17 19:25:55 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

DBVERIFY - Verification starting : FILE = /app/oracle/oradata/testdb/system01.dbf

DBVERIFY - Verification complete


Total Pages Examined            : 90880 --테스트한 총 블록의 개수

Total Pages Processed (Data) : 60048 --테스트한 총 테이블 블록 개수

Total Pages Failing   (Data)     : 0 -- 문제가 있는 블록 개수

Total Pages Processed (Index) : 12795 --테스트한 총 인덱스 블록 개수

Total Pages Failing   (Index)    : 0 -- 문제가 있는 블록 개수

Total Pages Processed (Other) : 3868 --테이블이나 인덱스 외 다른 블록 개수

Total Pages Processed (Seg)  : 1 

Total Pages Failing   (Seg)      : 0

Total Pages Empty                 : 14169 --비어있는 블록개수

Total Pages Marked Corrupt    : 0 --문제가 있어서 corrupt marked된 블록 개수

Total Pages Influx                  : 0 --다른 사용자가 먼저 데이터를 변경하고 있어서 DBV를 하기위해 다시 읽은 블록 개수

Total Pages Encrypted           : 0

Highest block SCN                 : 1427894 (0.1427894)



2. 특정 세그먼트만 검사하기

## 연습용으로 사용할 테이블 생성 및 데이터 입력

SYS>create table scott.tt800 (no number);


Table created.


SYS>begin

  2  for i in 1..1000 loop

  3  insert into scott.tt800 values (i);

  4  end loop;

  5  commit;

  6  end;

  7  /


PL/SQL procedure successfully completed.


SYS>select sum(bytes)/1024/1024 as MB

  2  from dba_segments

  3  where segment_name='TT800';


        MB

----------

        15

## 생성한 테이블의 segment ID 확인

SYS>select t.ts#, s.header_file, s.header_block

  2  from v$tablespace t, dba_segments s

  3  where s.segment_name='TT800'

  4  and t.name=s.tablespace_name;


       TS# HEADER_FILE HEADER_BLOCK

---------- ----------- ------------

         4           4         1042


## segment id를 입력하여 특정 segment만 검사 가능
[oracle@localhost ~]$ dbv userid=scott/tiger segment_id=4.4.1042

DBVERIFY: Release 11.2.0.2.0 - Production on Mon Nov 17 19:25:55 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

DBVERIFY - Verification starting : SEGMENT_ID=4.4.1042

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) : 75

Total Pages Processed (Seg)  : 1 

Total Pages Failing   (Seg)      : 0

Total Pages Empty                 : 0

Total Pages Marked Corrupt    : 0 

Total Pages Influx                  : 0

Total Pages Encrypted           : 0

Highest block SCN                 : 1427894 (0.1427894)


## 백업받은 data file의 블록을 corruption

[oracle@localhost ~]$ dd if=/dev/zero of=/data/temp/example01.dbf bs=8k

(명령 수행 도중에 Ctrl + C를 눌러 취소)


## 검사수행 -> 물리적인 손상을 입은 블록들은 DBVerify로 검증가능

[oracle@localhost ~]$ dbv file=/data/temp/example01.dbf


DBVERIFY: Release 11.2.0.2.0 - Production on Mon Nov 17 19:57:06 2014


Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.


DBV-00107: Unknown header format (0) (0) -- block corruption 발생내역



3. Database내 전체 데이터파일을 검사하는 dbv script

- 서버내에 아주 많은 데이터 파일이 있을 경우 자동으로 모든 파일의 위치를 찾아서 DBV로 검사하는 스크립트 사용

- OS 환경에 맞게 스크립트 작성

## 스크립트 작성

[oracle@localhost ~]$ vi dbv.sql 

set feedback off

set head off

set echo off

set linesize 200

set pagesize 3000

spool /home/oracle/dbv.sh


select '!dbv file='||name||' blocksize='||block_size||' logfile='||substr(name, instr(name, '/', -1, 1) +1) ||'.'||file#||'.log'

from v$datafile

/


spool off


@/home/oracle/dbv.sh


:wq!


## 일반 파일 시스템의 스크립트에서 굵은글씨로 표시된 부분만 추가하면 됨


Raw Device

select '!dbv file='||name||' blocksize='||block_size||' end='||(bytes/block_size)||'logfile='||substr(name, instr(name, '/', -1, 1) +1) ||'.'||file#||'.log'

from v$datafile

윈도우기반

select '!dbv file='||name||' blocksize='||block_size||' logfile='||substr(name, instr(name, '\', -1, 1) +1) ||'.'||file#||'.log'

from v$datafile

ASM 기반

select '!dbv file='||name||' blocksize='||block_size||' userid=sys/&passwd logfile='||substr(name, instr(name, '/', -1, 1) +1) ||'.'||file#||'.log'

from v$datafile

--> 위 스크립트를 실행하면 sys의 암호를 묻게되는데 적당한 암호를 입력하면 DBV 작동함


## 스크립트 실행

SYS>@/home/oracle/dbv.sql


!dbv file=/app/oracle/oradata/testdb/system01.dbf blocksize=8192 logfile=system01.dbf.1.log

!dbv file=/app/oracle/oradata/testdb/sysaux01.dbf blocksize=8192 logfile=sysaux01.dbf.2.log

!dbv file=/app/oracle/oradata/testdb/undotbs01.dbf blocksize=8192 logfile=undotbs01.dbf.3.log

!dbv file=/app/oracle/oradata/testdb/users01.dbf blocksize=8192 logfile=users01.dbf.4.log

!dbv file=/app/oracle/oradata/testdb/example01.dbf blocksize=8192 logfile=example01.dbf.5.log

!dbv file=/app/oracle/oradata/testdb/ts_b01.dbf blocksize=8192 logfile=ts_b01.dbf.6.log


DBVERIFY: Release 11.2.0.2.0 - Production on Mon Nov 17 20:03:33 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.


(이부분에 나올 검사결과가 logfile로 지정한 부분에 저장됨)


DBVERIFY: Release 11.2.0.2.0 - Production on Mon Nov 17 20:04:40 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.


(이부분에 나올 검사결과가 logfile로 지정한 부분에 저장됨)


DBVERIFY: Release 11.2.0.2.0 - Production on Mon Nov 17 20:06:03 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.


(이부분에 나올 검사결과가 logfile로 지정한 부분에 저장됨)


댓글