※ 참고
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-장애5 시작
장애 5 : Current 그룹이 삭제된 경우 - DB Open 상태
장애발생 ------------------------------>>>>>>
1. 현재 상태 확인
SQL> @redo
GROUP# MEMBER MB ARCHIV SEQ# STATUS
------ -------------------------------------------------- ---------- ------ ---------- --------------------------------
1 /home/oracle/oradata/testdb/redo01_a.log 5 YES 43 INACTIVE
1 /home/oracle/oradata/testdb/redo01_b.log 5 YES 43 INACTIVE
2 /home/oracle/oradata/testdb/redo02_b.log 5 YES 44 INACTIVE
2 /home/oracle/oradata/testdb/redo02_a.log 5 YES 44 INACTIVE
3 /home/oracle/oradata/testdb/redo03_b.log 5 NO 45 CURRENT
3 /home/oracle/oradata/testdb/redo03_a.log 5 NO 45 CURRENT
2. 장애 발생
SYS> !rm -f /home/oracle/oradata/testdb/redo03*
SYS> !ls /home/oracle/oradata/testdb/redo03*
SYS> alter system switch logfile;
SYS> /
SYS> /
Hang 걸림
해결 ------------------------------>>>>>>
3. 장애해결 (장애 3 : archive 안된 그룹삭제 - open 과 동일)
SQL> @redo
GROUP# MEMBER MB ARCHIV SEQ# STATUS
------ -------------------------------------------------- ---------- ------ ---------- --------------------------------
1 /home/oracle/oradata/testdb/redo01_a.log 5 NO 46 INACTIVE
1 /home/oracle/oradata/testdb/redo01_b.log 5 NO 46 INACTIVE
2 /home/oracle/oradata/testdb/redo02_b.log 5 NO 47 CURRENT
2 /home/oracle/oradata/testdb/redo02_a.log 5 NO 47 CURRENT
3 /home/oracle/oradata/testdb/redo03_b.log 5 NO 45 INACTIVE
3 /home/oracle/oradata/testdb/redo03_a.log 5 NO 45 INACTIVE
3번 그룹의 SEQ# 가 가장 적으므로 3번그룹 이후로 아카이빙이 중단되었음을 알수 있다.
3번그룹은 지워지기 전에 Current 상태였다.
장애원인 : archive 안된 redo log group 때문에 hang 현상이 발생한 것
SYS> alter database clear unarchived logfile group 3;
SYS> @redo
GROUP# MEMBER MB ARCHIV SEQ# STATUS
------ -------------------------------------------------- ---------- ------ ---------- --------------------------------
1 /home/oracle/oradata/testdb/redo01_a.log 5 NO 46 INACTIVE
1 /home/oracle/oradata/testdb/redo01_b.log 5 NO 46 INACTIVE
2 /home/oracle/oradata/testdb/redo02_b.log 5 NO 47 CURRENT
2 /home/oracle/oradata/testdb/redo02_a.log 5 NO 47 CURRENT
3 /home/oracle/oradata/testdb/redo03_b.log 5 YES 0 UNUSED
3 /home/oracle/oradata/testdb/redo03_a.log 5 YES 0 UNUSED
SYS> alter database drop logfile group 3;
SYS> !rm -f /home/oracle/oradata/testdb/redo03_a.log /home/oracle/oradata/testdb/redo03_b.log
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> alter system switch logfile;
SYS> /
SYS> /
SYS> /
SYS> /
SYS> /
※ 주의 : 자동 생성된 그룹은 기존 그룹과 동기화를 할 수 없기 때문에,
반드시 수동으로 지우고 새로 생성해 주어야 한다!!!
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-장애5 끝
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-장애6 시작
장애 6 : Current 그룹이 삭제된 경우 - DB Close - Shutdown immediate 로 종료됨
장애발생 ------------------------------>>>>>>
1. 현재 상태 확인
SQL> @redo
GROUP# MEMBER MB ARCHIV SEQ# STATUS
------ -------------------------------------------------- ---------- ------ ---------- --------------------------------
1 /home/oracle/oradata/testdb/redo01_b.log 5 YES 58 INACTIVE
1 /home/oracle/oradata/testdb/redo01_a.log 5 YES 58 INACTIVE
2 /home/oracle/oradata/testdb/redo02_a.log 5 NO 59 CURRENT
2 /home/oracle/oradata/testdb/redo02_b.log 5 NO 59 CURRENT
3 /home/oracle/oradata/testdb/redo03_b.log 5 YES 57 INACTIVE
3 /home/oracle/oradata/testdb/redo03_a.log 5 YES 57 INACTIVE
2. 데이터 입력 후 장애 발생
SYS> create table scott.rtest01 (no number);
SYS> insert into scott.rtest01 values (1);
SYS> commit;
SYS> @redo
SQL> @redo
GROUP# MEMBER MB ARCHIV SEQ# STATUS
------ -------------------------------------------------- ---------- ------ ---------- --------------------------------
1 /home/oracle/oradata/testdb/redo01_b.log 5 YES 58 INACTIVE
1 /home/oracle/oradata/testdb/redo01_a.log 5 YES 58 INACTIVE
2 /home/oracle/oradata/testdb/redo02_a.log 5 NO 59 CURRENT
2 /home/oracle/oradata/testdb/redo02_b.log 5 NO 59 CURRENT
3 /home/oracle/oradata/testdb/redo03_b.log 5 YES 57 INACTIVE
3 /home/oracle/oradata/testdb/redo03_a.log 5 YES 57 INACTIVE
커밋날린 내용 현재 커런트인 2번에 들어가 있음
SYS> !rm -f /home/oracle/oradata/testdb/redo02_a.log /home/oracle/oradata/testdb/redo02_b.log
SYS> !ls /home/oracle/oradata/testdb/redo02_a.log /home/oracle/oradata/testdb/redo02_b.log
SYS> shutdown immediate;
SYS> startup
MOUNT 올라가고 에러
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/home/oracle/oradata/testdb/redo02_a.log'
ORA-00312: online log 2 thread 1: '/home/oracle/oradata/testdb/redo02_b.log'
해결 ------------------------------>>>>>>
SYS> recover database until cancel;
SYS> alter database open resetlogs;
SQL> select * from scott.rtest01;
NO
----------
1
정리 :
Shutdown immediate 명령어의 특징 : commit된것 데이터파일에 전부 저장, commit안된것 전부 rollback후 DB종료
Shutdown immediate로 종료되었기 때문에, scott.rtest01 테이블 생성한 것과 1을 입력한 후 commit한 정보는 DATAFILE에 전부 저장된 상태
그래서 redo log 2번 그룹에 저장되어있던 내용은 사실 없어도 상관없다. redo log를 보고 복구해야 하지만,
이미 저장되어 있기 때문에 redo log file안의 내용은 필요가 없는 것이다.
그래서 redo log file안의 내용은 없어도 되지만, 삭제된 2번이 Current 이기 때문에 DB정상 Open 후에 2번을 사용하게된다.
그러나 2번그룹 파일이 없는 상태이기 때문에 DB가 Open이 안된다. log switch를 일으켜서 Current를 바꿔주면 되지만, Mount상태에서는 불가능..
open할때 resetlogs 옵션을 사용해서 삭제된 redo log를 재생성 할수 있다.
resetlogs 옵션을 사용하기 위해서 recover database until cancel 을 사용한 것이다.
recover database until cancel 명령어 : 현재 있는 redo log file 이나 archived redo log fileㄲ지만 복구하라는 의미
여기서는 데이터 파일에 모든 데이터가 저장 되었기 때문에 사실 복구를 하지 않는다.
이렇게 복구 하고 DB open 후에 전체백업 수행 권장
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-장애6 끝
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-장애7 시작
장애 7 : Current 그룹이 삭제된 경우 - DB Close - Shutdown abort 로 종료됨 - data file backup 과 archive log file 있음
: 현재 SCN 106번이 Current Redo log file 에 저장된 상태에서 Current Redo log가 삭제
→ 이경우 백업DATAFILE만 복원하여 archive log와 redo log를 순차적으로 적용시켜 지워지기 직전까지인 SCN 105번 작업까지복구
장애발생 ------------------------------>>>>>>
1. 현재 상태확인
SYS> @redo
SYS> create table scott.rtest02 (no number);
SYS> insert into scott.rtest02 values(1);
커런트인 1번 그룹에 저장됨
SYS> commit
SYS> altersystem switch logfile;
SYS> @redo
SYS> insert into scott.rtest02 vlaues(2);
커런트인 3번 그룹에 저장됨
SYS> commit;
SYS> alter system switch logfile;
SYS> @redo
SYS> insert into scott.rtest02 vlaues(3);
커런트인 2번 그룹에 저장됨
SYS> commit;
2. Current group 삭제 후 shutdown abort 시킴
SYS> @redo
SYS> !rm -f /home/oracle/oradata/testdb/redo02_a.log /home/oracle/oradata/testdb/redo02_b.log
SYS> !ls /home/oracle/oradata/testdb/redo02*
SYS> shutdown abort;
강제종료(abort) 되었기 때문에, 현재 커런트안의 내용은 날아감.
해결 ------------------------------>>>>>>
3. 백업 DATAFILE 복원
SYS> cp! /data/backup/close/*.dbf /home/oracle/oradata/testdb/
SYS> startup mount;
4. 복구하기
SYS> recover database until cancel;
선택지에서 커런트 시퀀스 에서 cancel
SYS> alter database open resetlogs;
SYS> select * from scott.rtest02;
NO
-----------
1
2
2번까지만 복원됨
정리 : 커런트에 있던 데이터는 강제종료로 인해 없어진 상태.
recover database until cancel;로 복원해온 데이터파일에 아카이빙된 커런트직전까지 내용을 복구 할 수 있다.
※ until cancel 옵션
커런트였는데 삭제되어서 재 시작 시키면 분명히 파일이 없다는 에러가 발생할 것이다.
이렇게 되면 커런트그룹을 다시 생성해야 하는데, redo log group을 다시 생성하면서 open하려면 옵션으로 resetlogs를 써야 한다.
resetlogs 옵션은 불완전복구를 한 후 사용할수 있는 옵션.
recover할때 until cancel 옵션을 붙인다.
- resetlogs = 오픈하면서 redo log 를 만들어주는 옵션
참고 : 완전복구 명령 - recover database
불완전복구 명령 - until cancel , until time
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-장애7 끝
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-장애8 시작
장애 8 : Current 그룹이 삭제된 경우 - DB close - Shutdown abort 로 종료 - 백업없음
(archive log 없음 - DB를 no archive log mode 로 변경하고 실습)
- hidden parameter 사용. 비권장. 최후의 방법. 성공률 낮음 → 이런 경우가 생기지 않도록 주의하자!!
장애발생 ------------------------------>>>>>>
1. no archive log mode로 변경
SYS> shutdown immediate;
SYS> startup mount;
SYS> archive log list;
SYS> alter database noarchivelog;
SYS> archive log list;
SYS> alter database open;
2. 데이터 입력
SYS> @redo
2그룹 커런트
SYS> create table scott.rtest03 (no number);
SYS> insert into scott.rtest03 values (1);
커런트인 2번 그룹에 저장됨
SYS> commit;
SYS> alter system switch logfile;
SYS> @redo
3그룹 커런트
SYS> insert into scott.rtest03 values (2);
커런트인 3번 그룹에 저장됨
SYS> commit;
SYS> alter system switch logfile;
SYS> @redo
1그룹 커런트
SYS> insert into scot.rtest03 values (3);
커런트인 1번 그룹에 저장됨
SYS> commit;
SYS> select * from scott.rtest03;
NO
-------
1 2번 그룹
2 3번 그룹
3 1번 그룹 - 커런트
3. 장애발생
SYS> @redo
GROUP# MEMBER MB ARCHIV SEQ# STATUS
------ -------------------------------------------------- ---------- ------ ---------- -------------
1 /home/oracle/oradata/testdb/redo01_b.log 5 NO 5 CURRENT
1 /home/oracle/oradata/testdb/redo01_a.log 5 NO 5 CURRENT
2 /home/oracle/oradata/testdb/redo02_a.log 5 NO 3 ACTIVE
2 /home/oracle/oradata/testdb/redo02_b.log 5 NO 3 ACTIVE
3 /home/oracle/oradata/testdb/redo03_b.log 5 NO 4 ACTIVE
3 /home/oracle/oradata/testdb/redo03_a.log 5 NO 4 ACTIVE
SYS> !rm -f /home/oracle/oradata/testdb/redo01_a.log /home/oracle/oradata/testdb/redo01_b.log
SYS> !ls /home/oracle/oradata/testdb/redo01*
SYS> shutdown abort;
해결 ------------------------------>>>>>>
4. 복구
SYS> startup
MOUNT까지 올라오고 에러
7번의 경우와 같은 상황이라 생각하고 데이터파일의 복원은 없이 recover database until cancel;로 복구 시도
SYS> recover database until cancel;
에러남
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGSwould get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/home/oracle/oradata/testdb/system01.dbf'
이유 : 데이터파일,리두로그파일,컨트롤파일의 체크포인트 정보가 달라서..
해결 : 강제로 DB를 OPEN시키도록 설정하는 히든파라미터 사용
SYS> shutdown immediate;
SYS> !vi /home/oracle/product/10g/dbs/inittestdb.ora
_allow_resetlogs_corruption=true
SYS> recover database until cancel;
에러남
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGSwould get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/home/oracle/oradata/testdb/system01.dbf'
SYS> alter database open resetlogs;
SYS> select *from scott.rtest03;
에러
강제로 DB OPEN 성공했따면, 전체 데이터베이스를 full export로 백업 권장
※ 참고 : resetlogs 와 _allow_resetlogs_corruption
전제조건 : DB가 OPEN되기 위해서는 DATAFILE, 컨트롤파일, redo log file의 checkpoint 정보가 같아야 함
★ resetlogs : checkpoint 정보가 DATAFILE들끼리는 같지만 컨트롤파일, redo log file은 다를 경우 사용
: 수행후 DATAFILE들의 정보는 변경 없고, control file 의 정보만 변경된다.
★ _allow_resetlogs_corruption : DATAFILE들 끼리의 checkpoint 정보가 달라도 강제로 OPEN
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-장애8 끝
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-장애9 시작
유형 9 : 전체 Redo log가 삭제된 경우 - DB Open 상태 (archive log mode 에서 작업)
상황 : 시스템 관리자가 log파일들 지우다가 redo log file까지 전부 지워버림. DB 종료 전에 조치하기
장애발생 ------------------------------>>>>>>
1. 현재 상태 확인
SQL> @redo
GROUP# MEMBER MB ARCHIV SEQ# STATUS
------ -------------------------------------------------- ---------- ------ ---------- --------------------------------
1 /home/oracle/oradata/testdb/redo01_b.log 5 YES 5 INACTIVE
1 /home/oracle/oradata/testdb/redo01_a.log 5 YES 5 INACTIVE
2 /home/oracle/oradata/testdb/redo02_a.log 5 YES 4 INACTIVE
2 /home/oracle/oradata/testdb/redo02_b.log 5 YES 4 INACTIVE
3 /home/oracle/oradata/testdb/redo03_b.log 5 NO 6 CURRENT
3 /home/oracle/oradata/testdb/redo03_a.log 5 NO 6 CURRENT
SYS> select status from v$insane;
OPEN상태
SYS> !rm -f /home/oracle/oradata/tstdb/*.log
SYS> alter system switch logfile;
SYS> /
SYS> /
hang 발생. Ctrl + C 눌러서 취소
2. 원인 찾아서 해결하기
SYS> @redo
GROUP# MEMBER MB ARCHIV SEQ# STATUS
------ -------------------------------------------------- ---------- ------ ---------- --------------------------------
1 /home/oracle/oradata/testdb/redo01_b.log 5 NO 8 CURRENT
1 /home/oracle/oradata/testdb/redo01_a.log 5 NO 8 CURRENT
2 /home/oracle/oradata/testdb/redo02_a.log 5 NO 7 INACTIVE
2 /home/oracle/oradata/testdb/redo02_b.log 5 NO 7 INACTIVE
3 /home/oracle/oradata/testdb/redo03_b.log 5 NO 6 INACTIVE
3 /home/oracle/oradata/testdb/redo03_a.log 5 NO 6 INACTIVE
3번그룹이 SEQ#가 가장 작다. 즉, 그룹 3번 때문에 모든로그파일이 아카이빙이 안되고 있다.
SYS> alter database clear unarchived logfile group 3;
SYS> alter database drop logfile group 3;
SYS> !rm -f /home/oracle/oradata/testdb/redo03_b.log
SYS> !rm -f /home/oracle/oradata/testdb/redo03_a.log
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
3번 UNUSED로 생성됨
SYS> alter system switch logfile;
SYS> /
다시 hang 걸림. Ctrl + C 눌러서 취소
SYS> @redo
2번그룹의 SEQ#가 가장 작음. 즉, 그룹 2번 때문에 hang이 발생.
SYS> alter database clear unarchived logfile group 2;
SYS> alter database drop logfile group 2;
SYS> !rm -f /home/oracle/oradata/testdb/redo02_b.log
SYS> !rm -f /home/oracle/oradata/testdb/redo02_a.log
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
2번 UNUSED로 생성됨
SYS> alter system switch logfile;
SYS> /
다시 hang 걸림. Ctrl + C 눌러서 취소
SYS> @redo
1번그룹의 SEQ#가 가장 작음. 즉, 그룹 1번 때문에 hang이 발생.
SYS> alter database clear unarchived logfile group 1;
SYS> alter database drop logfile group 1;
SYS> !rm -f /home/oracle/oradata/testdb/redo01_b.log
SYS> !rm -f /home/oracle/oradata/testdb/redo01_a.log
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
1번 UNUSED로 생성됨
3. log switch 를 여러번 발생시켜 이상 유무 확인
SYS> alter system switch logfile;
SYS> /
SYS> /
SYS> /
이상없음
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-장애9 끝
커런트가 날아갔다 = 리두로그 다 지워졌다. 같은의미
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-장애10 =장애7 시작
장애 10 : 전체 Redo log 가 삭제된 경우 - DB Close 상태 - 백업 있는 상태
해결 : '장애 7. Current Redo log 삭제 - Shutdown abort 종료 - 백업파일 있음'과 동일
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 장애10 =장애7 끝
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 장애11 =장애8 시작
장애 11 : 전체 Redo log 가 삭제된 경우 - DB Close 상태 - 백업 없는 상태
해결 : '장애 8. Current Redo log 삭제 - Shutdown abort 종료 - 백업파일 없음'과 동일
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 장애11 =장애8 끝
'Oracle > Oracle - 백업&복구' 카테고리의 다른 글
백업&복구 17 - Datapump (2) | 2012.02.15 |
---|---|
백업&복구 16 - export / import (1) | 2012.02.13 |
백업&복구 15.2 - Redo log file 장애 유형1~4 : Current 아닌경우 (0) | 2012.02.10 |
백업&복구 15.1 - Redo log file 장애 - 순서도 (0) | 2012.02.09 |
백업&복구 14 - Supplemental logging / log miner - log 분석해서 장애 시간 알아내기 (0) | 2012.02.09 |