IT기술/Oracle

07 Redo log 장애와 Log Miner

dobbby 2013. 12. 26. 09:21
반응형

Case 별 Redo log file 장애와 대처 방법




※ Redo log file 이 삭제되어 장애가 발생한 경우는 우선 Open 인지 아닌지 확인한 후 

Current 유무를 확인하고 Archive 유무를 확인하는 순서로 복구 플랜을 작성하면 됩니다.


1) 대기 중인 그룹의 멤버 1개만 장애 발생할 경우

SYS> !

vi /home/oracle/admin/testdb/bdump/alert_testdb.log

멤버가 하나 지워져도 운영에는 문제가 없기 때문에 수시로 alert log 파일을 확인하여 장애를 확인하여야 한다.

SYS> alter database drop logfile member '/home/oracle/oradata/testdb/redo01_a.log' ;

SYS> alter database add logfile member '/home/oracle/oradata/testdb/redo01_a.log' to group 1;


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

장애 생긴 그룹 삭제 후 재생성하고 다시 open

SYS> alter database drop logfile group 2 ;

SYS> alert database add logfile group 2

  2      ('/home/oracle/oradata/testdb/redo02_a.log',

  3       '/home/oracle/oradata/testdb/redo02_b.log') size 5m ;

SYS> alter databse open ;


3) 대기 중인 그룹 중 archive 완료 안 된 그룹이 지워진 경우 - DB OPEN 상태

SYS> atler database clear unarchived logfile group 1 ;    ← control file 의 정보를 보고 해당 그룹의 멤버를 자동으로 삭제 후 재생성함

이 명령어로 redo log group 을 재생성하게 되면 archive log file 이 중간에 비어버리기 때문에 반드시 DB 전체를 full backup 받아야 함

SYS> alter database drop logfile group 1 ;    ← 문제가 되는 그룹을 삭제

SYS> !

rm -fr /home/oracle/oradata/testdb/redo01*    ← 파일 삭제

exit

SYS> alter database add logfile group 1

  2    ('/home/oracle/oradata/testdb/redo01_a.log',

  3    '/home/oracle/oradata/testdb/redo01_b.log') size 5m ;    ← 그룹 추가


4) 대기 중인 그룹 중 archive 완료 안 된 그룹이 지워진 경우 - DB CLOSE 상태

ORA_00257: archiver error.Connect internal only, until freed.

SYS> alter database drop logfile group 1 ;

삭제가 안되는 이유는 archive log mode 인 db 는 redo 가 archive 완료되기 전에는 절대 삭제도 업데이트도 하지 않기 때문

SYS> atler database clear unarchived logfile group 1 ;    ← 삭제 후 자동재생성

open 일 때와 다르게 재생성된 redo log file 을 그냥 사용해도 된다.


5) Current 그룹이 삭제 된 경우 - DB OPEN 상태

해결방법은 3번과 동일하다.

SYS> atler database clear unarchived logfile group 3 ;

SYS> alter database drop logfile group 1 ;    ← 문제가 되는 그룹을 삭제

SYS> !

rm -fr /home/oracle/oradata/testdb/redo03*

exit

SYS> alter database add logfile group 3

  2    ('/home/oracle/oradata/testdb/redo03_a.log',

  3    '/home/oracle/oradata/testdb/redo03_b.log') size 5m ;

※ DB 운영중(open) 일때 자동 재생성된 그룹은 반드시 수동으로 삭제 후 재생성 해야 함


6) Current 그룹이 삭제 된 경우 - DB Close - Shutdown immediate 로 종료됨

SYS> recover database until cancel ;

SYS> alter database open resetlogs ;

recover database until cancel 명령은 현재 있는 redo log file 이나 archived redo log file 까지만 복구하라는 의미인데,

여기서는 데이터 파일에 모든 데이터가 정상 저장되었기 때문에 복구하지 않습니다.

이렇게 복구하여 OPEN 한 경우에는 반드시 전체 백업을 수행하여야 합니다.


7) Current 그룹이 삭제 된 경우 - DB Close - Shutdown abort 로 종료 - Data file backup 과 Archive log file 있음

과거 백업 받았던 모든 데이터 파일을 전부 복원하여 redo log 와 archive log 를 적용시켜 데이터를 복구하는 것인데

2번 그룹이 current 상태에서 삭제되었기 때문에 2번 그룹은 복구할 수 없습니다.

그래서 복구가 가능한 redo log 까지만 복구하고 2번 그룹을 찾을 때는 cancel 해야 합니다.

복구 가능한 부분까지만 복구하는 명령어인 recover database until cancel; 로 복구해야 합니다.

SYS> !cp /data/backup/close/*.dbf /home/oracle/oradata/testdb/

SYS> startup mount ;

SYS> recover database until cancel ;

sequence #16 나오면

cancel 

SYS> alter database open resetlogs ;


8) Current 그룹이 삭제 된 경우 - DB  Close - Abort 로 종료 - 백업 없음 (archive log 없음 - DB 를 no archive log mode 로 변경됨)

백업된 data file 이 없거나 archive log file 이 없다면 복구가 불가능하다

hidden parameter 를 사용하는 방법이 있는데 성공률이 높지 않고 실패할 경우 더 이상 방법이 없다

SYS> shutdown immediate ;

SYS> ! 

vi /home/oracle/product/10g/dbs/inittestdb.ora

_allow_resetlogs_corruption=true     ← 이 히든 파라미터를 추가

exit

SYS> recover database until cancel ;

SYS> alter database open resetlogs ;

open 이 후 full export 로 백업받아야 한다.

data file 끼리 정보가 달라도 강제로 DB Open 해야 한다면 사용한다.

resetlogs 를 수행하면 data file 들의 정보는 변경없고 control file 의 정보만 변경된다.


9) 전체 Redo log 가 삭제된 경우 - DB Open (archive log mode 에서 작업)

SYS> @redo

3번 그룹이 seq# 이 가장 작은 것으로 확인됨

SYS> alter database clear unarchived logfile group 3 ;

SYS> alter database drop logfile group 3 ;

SYS> !rm -f /home/oracle/oradata/testdb/redo03*

SYS> alter database add logfile group 3

  2     ('/home/oracle/oradata/testdb/redo03_a.log',

  3      '/home/oracle/oradata/testdb/redo03_b.log') size 5m ;

SYS> @redo

SYS> alter system switch logfile ;

SYS> /    ← 다시 행이 걸려서 ctrl + c


SYS> @redo

2번 그룹이 seq# 이 가장 작은 것으로 확인됨

SYS> alter database clear unarchived logfile group 2 ;

SYS> alter database drop logfile group 2 ;

SYS> !rm -f /home/oracle/oradata/testdb/redo02*

SYS> alter database add logfile group 2

  2     ('/home/oracle/oradata/testdb/redo02_a.log',

  3      '/home/oracle/oradata/testdb/redo02_b.log') size 5m ;

SYS> @redo

SYS> alter system switch logfile ;

SYS> /    ← 다시 행이 걸려서 ctrl + c


SYS> @redo

1번 그룹이 seq# 이 가장 작은 것으로 확인됨

SYS> alter database clear unarchived logfile group 1 ;

SYS> alter database drop logfile group 1 ;

SYS> !rm -f /home/oracle/oradata/testdb/redo01*

SYS> alter database add logfile group 1

  2     ('/home/oracle/oradata/testdb/redo01_a.log',

  3      '/home/oracle/oradata/testdb/redo01_b.log') size 5m ;

SYS> @redo

log switch 를 여러번 발생시켜 이상 유무 확인

SYS> alter system switch logfile ;

SYS> /

SYS> /


10) 전체 Redo log 가 삭제된 경우 - DB Close - 백업 있는 상태

7) 번과 복구 방법 동일


11) 전체 Redo log 가 삭제된 경우 - DB Close - 백업 없는 상태

8)번과 복구 방법 동일

반응형