<시나리오>

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 directory
Additional 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
Posted by 나른한스누피