오라클(Oracle) - Block Corruption에 임하는 우리들의 자세 - 오라클 블럭 복구

Share

Last Updated on 11월 7, 2021 by Jade(정현호)

안녕하세요 
이번 포스팅은 HOTBACKUP 을 통해 백업된 파일 이용하여 RMAN 을 통해서 손상된(corrupted) block을 복구하는 내용에 대해서 확인 해보도록 하겠습니다. 
           

포스팅 테스트 환경

테스트 일자 : 2011-07-01
문서 업데이트 : 2021-11-07

OS : Oracle Solaris 10
CPU : Intel(R) Xeon(R) CPU X5620 @ 2.40GHz X 1
Memory : 2GB
hostname : earth
Oracle Version : 10gR2,11gR1,11gR2
          

Using RMAN

백업의 여러 방법 중 보편적으로 사용되고 있는 HOT BACKUP 으로 백업이 되어있는 상태에서 운영중인 시스템에 블록 손상이 감지 되면 어떻게 해야 될까요?

아래 표와 같이 Block Corruption 시 해결할 수 있는 방법은 몇 가지가 있습니다. 그 중 DBMS_REPAIR 는 사용법이 까다롭고, 보편적으로 블록 손상이 발견시 Hotbackup 받아 놓은 데이터파일을 Restore & Recovery 하는 것이 일반적인 방법 일 것 입니다.

Corruption- Related Features

Feature
(command block)
Corruption Detected
(어떤 부분에 대해서 감지 해 낼 수 있는지)
Repairs Corruption
(TRUE: 수정 가능 / FALSE: 감지,분석만)
DBVERIFY Physical FASLE
ANALYZE Logical FASLE
DB_BLOCK_CHECKING Logical FASLE
DB_BLOCK_CHECKSUM Physical FASLE
exp Physical FASLE
Flashback Logical TRUE
DBMS_REPAIR Logical TRUE
Block Media Recovery None TRUE


데이터파일을 Restore 하는 시간 + 복구를 위해 적용 해야하는 ArchiveLog 파일 복구 시간 + 해당 데이터 파일이 포함된 TABLESPACE 에 대한 Downtime 시간 등 블록 손상 시 기존의 HOT BACKUP 의 방식에서는 많은 시간과 Downtime 을 가져야만 하였습니다.

하지만 RMAN 을 통하여 ONLINE 중 손쉽게 datafile restore 시간 및 Downtime 이슈를 제거 함으로써 블록 손상시 좀더 유연하게 대처 할 수 있는 방법을 소개 하려 합니다.

물론 여기서 소개하고자 하는 것은 단순히 rman 으로 백업 한 백업파일을 이용해서 복구 하는 부분이 아닌 것이 중요한 관점입니다. rman 으로 백업한 백업셋이 아닌 일반 hotbackup 혹은 coldbackup 을 이용해서 복구 한다는 것이 해당 포스팅에서 소개하고자 하는 중요한 부분입니다.
       

Corruption

Block 손상 을 복구 하기 위해서는 반드시 Cold 나 HOT BACKUP 본이 존재 해야 합니다.
아래와 같이 현재 HOTBACKUP 을 수행 해둔 상태 입니다.


사용중인 users01.dbf 파일을 dd 로 손상을 유발 하도록 하겠습니다.
users 테이블스페이스에 있는 emp 테이블의 헤더 블럭 값을 확인 해보겠습니다.

SQL> SELECT header_block 
FROM dba_segments 
WHERE segment_name='EMP';

HEADER_BLOCK 
------------
291


291 임을 확인 하였고 헤더 블럭 다음 블록을 임의로 손상 시키도록 하겠습니다.

dd of=/data/oradata/testdb10205/users01.dbf bs=8192 conv=notrunc seek=292 << EOF 
> corruption
> EOF


buffer cache 를 flush 후 emp 테이블을 Full scan 해보면 아래와 같이 Block Corruption 이 감지가 되게 됩니다.

          

RMAN Catalog

RMAN 의 CATALOG 기능을 이용하여 RMAN 으로 백업 받지 않은 Image Backup 파일을 RMAN 에 등록 하도록 하겠습니다.
현재 테스트 서버에서는 RMAN 으로 백업 받은 Backupset 은 존재 하지 않은 상태 입니다.

RMAN> list backup;

RMAN>


CATALOG DATAFILECOPY 명령어를 이용하면 되며 아래와 같이 등록을 진행 합니다.
/backup/hotbackup/20110701/users01.dbf 파일은 Hot Backup(begin, end backup 명령어)를 통해 백업된 파일 입니다.

RMAN> CATALOG DATAFILECOPY '/backup/hotbackup/20110701/users01.dbf';
cataloged datafile copy
datafile copy filename=/backup/hotbackup/20110701/users01.dbf recid=25 stamp=755365062

          

Block Media Recovery

이제 RMAN 의 blockrecover 를 이용한 복구를 시도 하도록 하겠습니다.
위에서 ORA-01578 에러에서 파일번호와 Block 번호를 확인 할 수 있습니다.

확인된 파일번호와 Block 번호를 통해 recover 를 시도 하도록 하겠습니다.

RMAN> blockrecover datafile 4 block 292;
Starting blockrecover at 01-JUL-11 using channel ORA_DISK_1
   Advanced Oracle Document
Block Corruption
4 of 6
...
Advanced Oracle Document
Block Corruption
5 of 6
channel ORA_DISK_1: restoring block(s) 
from datafile copy /backup/hotbackup/20110701/users01.dbf

starting media recovery
media recovery complete, elapsed time: 00:00:03
Finished blockrecover at 01-JUL-11


위의 진행 과정에서 확인 할 수 있듯이 catalog 명령어로 등록한 HOTBACKUP 파일을 통해 복구가 됨을 확인 할 수 있습니다
(from datafile copy ...)

다시 한번 emp 테이블을 조회하면 정상적으로 조회 됨을 확인 할 수 있습니다.

           

Conclusion

RMAN blockrecover 기능이 추가됨에 따라서 Corrupted Block 에 대한 복구가 이전 보다 손쉬워졌습니다.

다만 RMAN 으로 백업된 BACKUPSET 으로만 해당 기능을 이용할 수 있는 것은 아니며 기존의 Hot Backup 으로 수행된 백업 본으로도 Catalog 라는 기능을 통해서 Hot Backup(Image Backup)을 등록 할 수 있으며 그에 따라서 복구 역시 정상적으로 수행되는 것을 확인할 수 있었습니다.

추가로 복구시 아카이브로그가 추가로 필요할 상황에서, 생성되어 디렉토리에 위치해 있는 또는 다른 곳에 백업되어 있는 아카이브 파일에 대해서도 Catalog 를 통해서 아카이브로그  파일을 등록 하여 사용할 수 있습니다.

rman> catalog start with '/경로/경로';


Corruption 된 Segment Type 에 따라서 조치를 취하는 방법이 조금은 다를 수 있습니다.
Corruption 된 블럭이 Index 블럭으로 확인 될 경우 보통의 가장 빠른 조치는 인덱스 Drop&Create 가 보통적인 방법이기도 합니다.



관련된 다른 글

 

 

 

 

 

 

            

0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x