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 가 보통적인 방법이기도 합니다.
관련된 다른 글
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io