Block corruption and repair

DBverify

DBMS_repair      ->     DUL     ->   BBED   : 백업 있든없든, 있는 파일을 그대로 열어버리는것.

 

*RMAN block recovery는 rman한테 block을 고치라고하면, rman이 블록만복구하는 것으로, 백업이없으면 x

 

1. DBVERIFY를 이용한 block관리.

* DBverify 유틸리티 : datafile block, index file block, undo block등을 점검해주는 유틸리티로, database가 open되어 있는 상태에서 사용하는 유틸리티라서 DB의 중단없이 점검할 수 있다. 대신 점검중인 데이터파일은 read-only가 되기 때문에 만약 점검중일 때 DML작업이 발생하면 잠시 작업이 중단되었다가 다시 실행된다.

- 사용 문법 : dbv file=file_name [options]

 

1) 주요 옵션들

 

- FILE 

- START

- END

- BLOCKSIZE

- LOGFILE

- FEEDBACK

- PARFILE

- USERID

- SEGMENT_ID

 

 : 점검해야 할 파일명. 

 : 점검을 시작할 블록번호. (기본값 : 해당 파일의 첫번째 블록)

 : 점검을 종료할 블록번호. (기본값 : 해당파일의 마지막 블록)

 : 점검하기를 원하는 파일의 BLOCK 크기. (기본값 2048(2k))

 : 점검 결과를 저장할 파일명. (기본값 : NONE) - 검사 결과를 화면으로 출력.

 : 0 이상의 숫자로 설정. (기본값 : 0초) - 검사가 진행되는 동안에 화면에 .(dot)를 찍어서 진행 과정 표시해줌.

 : DBV를 실행할 때 적용하는 각종 설정들을 저장해두고 불러와 사용. (exp나 datapump에서 parfile옵션과 비슷한 역할)

 : ASM 기반의 파일을 점검할 경우 ASM 인스턴스에 접속해야 하기 때문에 반드시 USERID를 사용해야 한다.

 : 특정 세그먼트(TABLE,INDEX,UNDO)만 골라서 검사할 수 있다. (9i이상에서만 사용 가능)

 

2)DBV의 주요 특징들

① Block Level에서의 점검만 가능하다.

 (analyze table... validate structure와 같이 테이블과 인덱스간의 불일치 같은 문제는 점검하지 못한다.)

② 오직 데이터 파일만 점검할 수 있다. (즉 Redo log file이나 control file은 점검할 수 없다. Redo log file을 점검하려고 시도하면 DBV-에러가 발생한다.)

③ ASM 파일까지 점검할 수 있다. 단 ASM 인스턴스에 로그인할 수 있는 계정 정보를 함께 입력해야 한다.

  $ dbv file=+ASM/TESTDB/datafile/system01.dbf userid=system/oracle

④ 특정 데이터 파일이 아닌 세그먼트 단위로 검사할 수 있다. 예를들어 크기가 무척 큰 고객 테이블만 검사한다든지 특정 인덱스만 검사하는 것을 의미한다.

 

3) DBverify 실행하기.

(1) 특정 파일 검사하기 : $ dbv file=/app/oracle/oradata/testdb/example01.dbf

 

 Total Pages Examined    

 Total Pages Processed (Data)

 Total Pages Failing   (Data)

 Total Pages Processed (Index)

 Total Pages Failing   (Index)
 Total Pages Processed (Other)

 Total Pages Empty      

 Total Pages Marked Corrupt  

 Total Pages Influx        

 

- 테스트한 총 블록의 개수
- 테스트한 총 테이블 블록 개수
- 문제가 있는 블록 개수
- 테스트한 총 인덱스 블록 개수
- 문제가 있는 블록 개수
- 테이블이나 인덱스 외 다른 블록 개수
- 비어있는 블록 개수
- 문제가 있어서 corrupt marked된 블록 개수
- 다른 사용자가 먼저 데이터를 변경하고 있어서 DBV를 하기위해 다시 읽은 블록 개수

 

 

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

 : 테이블의 segment ID를 조회해서 검사해보겠습니다.

 ①먼저 tablespace와 table을 생성하고, 값을 임의로 넣어줍니다.

 

②segment name으로 크기를 조회한다. (1MB가 안되서, 0으로 조회됨.)

 

③ segment ID 조회.

 

④ segment id로 데이터파일 검사.

 

⑤ 에러를 ctrl + c로 중간에 중단시켜 에러발생시킨 뒤 다시 조회하면 에러가뜬다. (11g기준)

 

⑥ 백업파일이 에러가 있어서 복구를 해도 복구되지 않으므로, corruption된 블록을 복구하려면 정상적인 백업파일을 복원한 후, recover 명령을 수행하거나 RMAN에서 recover하면 된다.

 

 

(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

 


 

 

 ** os환경에 맞게 파일 시스템의 스크립트가 수정되어야 한다. 

 

 [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로 지정한 부분에 저장된다.)

 

 

Print Friendly and PDF Posted by JJ*
: