본문 바로가기

오라클 백업/복구

Redo Log File 장애 복구



Data File 장애가 나면 Redo Log를 이용해 손실된 내용을 복구

하지만 Redo Log File이 장애가 나면,

그 Redo Log File 안에 들어있는 내용은 복구 할 수 없고,

DB open이 되지 않을 수 있음


Redo Log File 장애 종류가 11가지 경우가 있는데

Redo Log File이 삭제되 장애가 발생할 경우, 

우선 open 상태인지 아닌지 --> Current 유뮤 확인 --> Archive 유무 확인

이 순서로 복구 플랜을 작성 하면 됨








1. 대기중인 그룹 멤버 1개만 장애 발생

장애가 확인된 멤버 삭제 (INACTIVE 상태에서만 가능) --> 다시 생성하기


멤버 하나가 지워져도 운영에는 문제 없기 때문에 Alert Log 에만 기록, DB에는 아무 문제 없음.

why? 권장사항이 최소 그룹 2개, 멤버 1개

하지만 아무 문제 없다고 내비두다가 나중에 나머지 멤버까지 장애가 날 수 있기 때문에

수시로 Alert Log 확인해서 장애 확인


여기서 나타나는 에러는 

log switch 발생 후 archiving을 해야하는데 해당 redolog가 없으니까 archiving 못해서 발생하는 에러


[실습]





2. 대기중인 그룹 중 Archive 완료된 그룹이 지워진 경우

MOUNT 상태에서 장애생긴 그룹 DROP --> 그룹 재 생성


그룹 전체가 삭제되면 DB 전체에 심각한 문제가 발생

하지만 삭제된 그룹이 삭제되기 전 Archiving이 완료되었다면 별다른 문제가 되지 않음

즉, 운영중인 Redo Log File이 삭제되었어도 그 내용이 Archiving 되었다면

데이터 파일에 장애가 발생해도 크게 문제가 되지 않음


[실습]





3. 대기중인 그룹 Archive 완료 안된 그룹이 지워진 경우 - DB Open 상태

ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP # ; 

--> ALTER DATABASE DROP LOGFILE GROUP # ; --> rm -rf로 실제 로그파일들 삭제 

--> ALTER DATABASE ADD LOGFILE ' ' GROUP # ;


삭제된 그룹이 Archiving 안된 상태

서버 운영 중 특정 그룹이 지워졌는데도 계속 log switch가 발생하면 이런 장애 발생

DB Hang 현상이 발생되고 중단되다가 비정상 종료까지 발생할 수 있음

역시 수시로 Alert Log 확인해서 장애 확인 해야함!


아카이브 프로세스는 순차적으로 발생함 (1번 아카이빙 완료되어야지 2번 아카이빙)

1번 아카이빙이 안되면 뒤의 2번 3번은 모두 아카이빙 되지 못함

Alert Log 확인해 보면 

문제되는 그룹때문에 에러가 계속 발생하는 것을 볼 수 있음


> alter database clear unarchived logfile group # ;


group 넘버는 장애난 그룹 넘버를 써야함

control file의 정보를 보고 해당 그룹의 멤버를 자동으로 drop, 자동으로 add

이 명령어를 통해 redo log group을 재생성한 후, 반.드.시. DB 전체 Full Backup 해야함!

Archive Log File이 중간에 비어버리기 때문에 그냥 넘어가게 되면 향후에 장애가 발생, 복구도 안됨.


DB 가 Open 된 상태에서는 저 명령어로 재생성해도 이후에 또다른 장애가 나타나게 된다

why? 기존 그룹과 동기화 할수 없기 때문에

그래서 수동으로 삭제한 후 다시 생성해야 함! 


> alter database drop logfile group # ;

> ! rm -rf 장애난그룹경로

> alter database add logfile group # ' ' size *M ;


[실습]





4. 대기중인 그룹 Archive 완료 안된 그룹이 지워진 경우 - DB Close 상태

MOUNT 상태 --> ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP # ;


대기중인 그룹 하나가 지워진후 DB가 종료됨

정상종료, 비정상 종료 상관없이 DB open 되지 않고 장애 발생

Archiving이 완료 되었으면 drop -> open 하면 되지만

Archiving이 안되었다면 drop 명령어로 삭제되지 않음

why? Archive Log Mode 인 DB는 Redo가 아카이빙 완료 되기 전까지는 절대로 삭제하지도 덮어쓰지도 않는다.


DB Open 상태와는 다르게 

alter database clear unarchived logfile group # ; 로 재생성한 후 그냥 사용해도 에러 발생하지 않음!


[실습]





5. Current 그룹이 삭제 - DB Open 상태

ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP # ; 

--> ALTER DATABASE DROP LOGFILE GROUP # ; --> rm -rf로 실제 로그파일들 삭제 

--> ALTER DATABASE ADD LOGFILE ' ' GROUP # ;


Current 그룹이 삭제되고 Log Switch 여러번 발생하면 Archive Hang 발생 --> DB Open이어도 아무런 작업을 못함!!!

DB가 Shutdown 되지 않도록 빨리 해결해야함!


해결 방법은 3번 장애와 동일

why? current 그룹은 아직 아카이빙이 안된 redo log group --> hang 발생!

DB가 Open 상태이기 때문에

alter database clear unarchived logfile 명령으로 삭제 후 자동 재생성 한 후에도! 

수동으로 반드시 그룹 삭제후 재생성 해주기!


[실습]





6. Current 그룹이 삭제 DB Close 상태(Shutdown immediate로 종료)

MOUNT 상태 --> RECOVER DATABASE UNTIL CANCEL ; --> ALTER DATABASE OPEN RESETLOGS ;


Current 그룹이 삭제되었을 때 DB가 종료되었다면 향후 재시작시 심각한 문제 발생

정상 종료 = shutdown immediate로 종료 되었다면 큰 문제는 아님


shutdown immediate의 특징은 

DB Buffer Cache의 내용중 commit은 됬으나 저장이 안된 dirty block을 츶아서 데이터 파일에 전부 저장

commit 안된 내용은 전부 rollback 시킨 후 DB 종료

테이블 생성 후 commit을 했다면 이미 전부 데이터 파일에 반영되어있기 때문에 redo log에 내용이 없어도 상관 없음


Open이 안되는 이유는

current 그룹이 현재 삭제되어있기 때문에 정상적으로는 open 될 수 없음

mount 상태에서는 log switch 발생 시킬 수 없기 때문에

삭제된 redo log를 재생성하기 위해서는 resetlogs 옵션을 이용해 DB Open

resetlogs는 Datafile의 SCN이 똑같아야 할 수 있음, 

이 옵션으로 open 하면 redo log는 reset 초기화 되고, 파일이 없을 경우에는 알아서 생성 후 open 됨.

resetlogs를 사용하기 위해서 Recover database until cancel를 사용!


> recover database until cancel ;


현재 있는 Redo Log File이나 Archived redo log File까지만 복구하라는 의미

이렇게 복구한 후 Open 됬으면 반.드.시 전체 백업 수행할 것!


[실습]





7. Current 그룹이 삭제 DB Close 상태- Shutdown abort로 종료 - 백업 있음

백업데이터파일 restore --> DB MOUNT --> RECOVER DATABASE UNTIL CANCEL ; 

--> ALTER DATABASE OPEN RESETLOGS ;


복구의 핵심! 백업받았던 모든 데이터 파일을 전부 복원해서 redo log와 archive log를 적용시켜 데이터를 복구

이번 장애는 current 상태에서 삭제된 그룹은 복구 할 수없음 

그래서 복구가 가능한 redo log 까지만 복구하고 삭제된 그룹을 찾을 때는 cancel 해야 함

이 때 사용하는 명령어가 바로 

> recover database until cancel ;


recover database 뒤에 until cancel이나 until time같은 옵션은 일정 시점까지만 복구하는 불완전 복구이기 때문에 

DB OPEN 시에 resetlogs 옵션으로 open해야 한다.


[작업내용]





8. Current 그룹이 삭제 DB Close 상태- Shutdown abort로 종료 - 백업 없음(no archive log mode 일때)

Hidden Parameter인 _allow_resetlogs_corruption=true를 사용해 DB OPEN


백업된 datafile이 없거나 archive log file이 없다면 즉, no archive log mode 상태에서 current redo log가 삭제된다면

복구 불.가.능.

DB OPEN은 시켜야하기 때문에 히든 파라미터를 사용해 OPEN 시킨다.

하지만 이방법은 성공률이 높지도 않고 권장하는 방법은 아님, 최후의 방법으로 사용할 것

이 방법으로도 실해판다면 더이상의 방법은 없는거임 


히든 파라미터 _allow_resetlogs_corruption=true로 설정해 DB를 강제로 OPEN하면

데이터베이스의 동기화 정보가 전부 달라져 문제가 됨, 그래서 OPEN 이후에는 항상 FULL EXPORT로 백업 꼭 받기!


[작업내용]



※ resetlogs 추가 설명 

resetlogs 옵션은 datafile들은 서로 checkpoint정보가 같기만 redo log, control file과는 다를 경우 사용

그래서 resetlogs 수행 전이나 수행 후나 datafile header부분의 정보는 변함이 없지만 

control file 내부의 정보들만 변경된다.


하지만 datafile끼리 checkpoint 정보가 다르다면 resetlogs 옵션을 사용해도 DB OPEN 불가능

그래서 Hidden parameter인 _allow_resetlogs_corruption=true를 사용하는 것





9. 전체 Redo Log 삭제된 경우 DB Open 상태

ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP # ; 

--> ALTER DATABASE DROP LOGFILE GROUP # ; --> rm -rf로 실제 로그파일들 삭제 

--> ALTER DATABASE ADD LOGFILE ' ' GROUP # ;


삭제된 모든 리두로그들을 위 방법으로 계속 재생성 해줘야한다. Archive Hang이 일어나지 않을 때까지.

DB가 OPEN 상태이므로 

> alter database clear unarchived logfile group # ;

명령어 후에도 수동으로 직접 로그파일을 삭제한 후 다시 추가를 해줘야한다!


[작업내용]





10. 전체 Redo Log 삭제된 경우 DB Close 상태 - 백업있음

백업데이터파일 restore --> DB MOUNT --> RECOVER DATABASE UNTIL CANCEL ; 

--> ALTER DATABASE OPEN RESETLOGS ;


7번 장애 복구 방법과 동일함





11. 전체 Redo Log 삭제된 경우 DB Close 상태 - 백업없음


Hidden Parameter인 _allow_resetlogs_corruption=true를 사용해 DB OPEN


8번 장애 복구 방법과 동일






'오라클 백업/복구' 카테고리의 다른 글

IMPORT  (0) 2013.02.05
EXPORT  (0) 2013.02.04
Log Miner  (0) 2013.01.31
Data File 장애 복구 3 - Undo Tablespace 복구  (0) 2013.01.31
Data File 장애 복구 2 - Archive Log Mode 복구  (0) 2013.01.27