<시나리오>
0. 현재 리두로그 파일 그룹 및 멤버 확인, archive log 모드일 것!!
1. current 상태의 리두로그 그룹 전체가 손상된다.
2. 손상된 상황을 모르고 insert, update 작업을 수행한다.
3. 로그스위치가 발생하고 HANG이 걸리는 것을 확인한다.
4. 로그파일을 clear한다.
5. 다른 세션을 이용해서 해당 그룹 삭제 후 추가한다.
--------------------------------------------------------------------------------------------------------
0. 현재 리두로그 파일 그룹 및 멤버 확인, archive log 모드일 것!!
SQL> select a.group#, a.members, a.status, a.sequence#, a.archived, b.member
from v$log a, v$logfile b
where a.group#=b.group#
order by a.group#
GROUP# MEMBERS STATUS SEQUENCE# ARC MEMBER
---------- ---------- ---------------- ---------- --- ------------------------------------------
1 2 INACTIVE 29 YES /u01/app/oracle/oradata/orcl/redo01.log
1 2 INACTIVE 29 YES /u01/app/oracle/oradata/orcl/redo01b.log
2 2 ACTIVE 30 YES /u01/app/oracle/oradata/orcl/redo02b.log
2 2 ACTIVE 30 YES /u01/app/oracle/oradata/orcl/redo02.log
3 2 CURRENT 31 NO /u01/app/oracle/oradata/orcl/redo03_b.log
3 2 CURRENT 31 NO /u01/app/oracle/oradata/orcl/redo03.log
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 29
Next log sequence to archive 31
Current log sequence 31
----------------------------------------------------------------------------------------------
1. current 상태의 리두로그 그룹 전체가 손상된다.
SQL> !
[oracle@localhost ~]$ rm -f /u01/app/oracle/oradata/orcl/redo03_b.log --> 장애상황 유발
[oracle@localhost ~]$ rm -f /u01/app/oracle/oradata/orcl/redo03.log
-----------------------------------------------------------------------------------------------
2. 손상된 상황을 모르고 insert, update 작업을 수행한다.
SQL> insert into hr.emp_88 select * from hr.emp_88;
13696 rows created.
SQL> /
27392 rows created.
SQL> /
54784 rows created.
SQL> commit;
Commit complete.
SQL> update hr.emp_88 set salary = salary + 100;
109568 rows updated.
SQL> commit;
Commit complete.
-------------------------------------------------------------------------------------------------------
3. 로그스위치가 발생하고 HANG이 걸리는 것을 확인한다.
SQL> alter system switch logfile;
System altered.
SQL> / ---> HANG 발생 alert_log 파일로 확인해보자.
<alert_log 파일> --> HANG 걸린 상태에서 이와같은 에러가 alert_log 파일에 계속 나타나다.
Linux Error: 2: No such file or directoryAdditional information: 3
Fri Jun 19 12:28:57 2009
ARC1: Failed to archive thread 1 sequence 31 (0)
Fri Jun 19 12:28:58 2009
Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_arc0_22952.trc:
ORA-00313: open failed for members of log group 3 of thread 1
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03_b.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03.log'
ORA-27037: unable to obtain file status
------------------------------------------------------------------------------------------------
4. 다른 세션에서 로그파일을 clear한다.
SQL> alter database clear logfile group 3;
alter database clear logfile group 3
*
ERROR at line 1:
ORA-00350: log 3 of instance orcl (thread 1) needs to be archived --> 아카이브가 안됬기 때문에 clear도 안된다.
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03.log'
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03_b.log'
SQL> alter database clear unarchived logfile group 3; ---> 아카이브 안된 놈들 clear하자
Database altered.
위와같이 clear 수행하면 3번 단계에서 걸린 HANG은 일단 풀어지게 된다. 그럼 해결 된 것인가?
아니다.
또다시 로그스위치를 반복해서 유발시키면 또다시 HANG이 걸리고 또 alert_log에 위 3번단계와 같은 에러가 지속적으로 발생한다.
SQL> alter system switch logfile;
System altered.
SQL> / ---> 또다시 HANG 발생 alert_log 파일을 또 확인해보자.
<alert_log>
Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_arc1_22955.trc:
ORA-00314: log 3 of thread 1, expected sequence# 34 doesn't match 0
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03_b.log'
ORA-00314: log 3 of thread 1, expected sequence# 34 doesn't match 0
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03.log'
Fri Jun 19 12:45:10 2009
ARC1: Failed to archive thread 1 sequence 34 (0)
위와 같은 에러가 계속 발생한다.
-----------------------------------------------------------------------------------------------------
5. 다른 세션을 이용해서 해당 그룹 삭제 후 추가한다.
SQL> alter database drop logfile group 3;
alter database drop logfile group 3
*
ERROR at line 1:
ORA-00350: log 3 of instance orcl (thread 1) needs to be archived --> 아카이브가 아직 안됬으므로 삭제 불가
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03.log'
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03_b.log'
SQL> alter database clear unarchived logfile group 3; --> 그렇다면 아카이브가 필요없는 clear 상태로 만들어버리자
Database altered.
SQL> alter database drop logfile group 3; --> 삭제 성공
Database altered.
* 만일 current 상태라며 삭제가 안되면 로그 스위치 수행하여 상태를 변경해주고 다시 clear unarchived 수행한 후에 삭제 시도
SQL> select a.group#, a.members, a.status, a.sequence#, a.archived, b.member
from v$log a, v$logfile b
where a.group#=b.group#
order by a.group#
GROUP# MEMBERS STATUS SEQUENCE# ARC MEMBER
---------- ---------- ---------------- ---------- --- ------------------------------------------------
1 2 CURRENT 37 NO /u01/app/oracle/oradata/orcl/redo01.log
1 2 CURRENT 37 NO /u01/app/oracle/oradata/orcl/redo01b.log
2 2 ACTIVE 36 YES /u01/app/oracle/oradata/orcl/redo02b.log
2 2 ACTIVE 36 YES /u01/app/oracle/oradata/orcl/redo02.log
3번 그룹이 삭제 되었음을 확인
SQL> alter database add logfile group 3
('/u01/app/oracle/oradata/orcl/redo03.log',
'/u01/app/oracle/oradata/orcl/redo03_b.log') size 50m
reuse;
Database altered.
SQL> alter system switch logfile; ---> 정상적으로 로그스위치 발생
System altered.
SQL> /
System altered.
SQL> /
System altered.
<alert_log>
Thread 1 advanced to log sequence 38
Current log# 3 seq# 38 mem# 0: /u01/app/oracle/oradata/orcl/redo03.log
Current log# 3 seq# 38 mem# 1: /u01/app/oracle/oradata/orcl/redo03_b.log
Thread 1 advanced to log sequence 39
Current log# 2 seq# 39 mem# 0: /u01/app/oracle/oradata/orcl/redo02.log
Current log# 2 seq# 39 mem# 1: /u01/app/oracle/oradata/orcl/redo02b.log
Thread 1 cannot allocate new log, sequence 40
Checkpoint not complete
Current log# 2 seq# 39 mem# 0: /u01/app/oracle/oradata/orcl/redo02.log
Current log# 2 seq# 39 mem# 1: /u01/app/oracle/oradata/orcl/redo02b.log
Thread 1 advanced to log sequence 40
Current log# 1 seq# 40 mem# 0: /u01/app/oracle/oradata/orcl/redo01.log
Current log# 1 seq# 40 mem# 1: /u01/app/oracle/oradata/orcl/redo01b.log
※ 이 후에 또 다시 장애가 발생하여 복구하게 되면 위에서 clear 한 부분의 archive가 존재하지 않기 때문에 완전 복구가
불가능 할 수 있다. 그러므로 이 시점에서 whole backup이 필요하다고 할 수 있겠다.
RMAN> rman target / catalog=rcvcat/rcvcat@//localhost:1521/prod
RMAN> backup database;
아카이브를 확인해보면 빠져있는 부분이 있을 것이다. 직접 확인해보기 바란다.
'Oracle > AdminⅠ,Ⅱ' 카테고리의 다른 글
오라클 10g 함수 매뉴얼 (한글판) (0) | 2011.08.03 |
---|---|
Oracle Data Guard : 개요 (0) | 2011.07.25 |
Recovery 관련 명령어 (0) | 2011.03.21 |
Oracle Database 10g R2 Parameter (0) | 2011.03.15 |
비트맵(Bitmap) 인덱스 (0) | 2011.03.11 |