오라클/백업/복구

Redo log flle 장애 처리방법

김포춘 2014. 11. 5. 14:32
반응형

< Redo Log File 장애 처리 순서도 >




Case 1. 1개의 member 가 삭제되는 장애가 발생하는 경우

(에러코드 : ORA-00313: open failed for members of log group....)


SQL> !rm -f /data/temp3/redo01.log               <-- 멤버 삭제


SQL> !ls /data/temp3/redo01.log

ls: /data/temp3/redo01.log: 그런 파일이나 디렉토리가 없음


SQL> alter system switch logfile;                      <-- 로그스위치를 일으켜도 이상 없음

 

System altered.


SQL> /


System altered.


SQL> /


System altered.


SQL> /


System altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- -----

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO             <-- 파일을 삭제했는데 조회가능

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                           5         24 INACTIVE YES

     3 /data/temp3/redo03_b.log                         5         24 INACTIVE YES


6 rows selected.


장애 내역을 보려면 alert log file 을 봐야 확인 할 수 있음


SQL> !

v[oracle@localhost ~]$ vi /app/oracle/diag/rdbms/testdb/testdb/trace/alert_testdb.log


Errors in file /app/oracle/diag/rdbms/testdb/testdb/trace/testdb_arc3_1063.trc:

ORA-00313: open failed for members of log group 1 of thread 1

ORA-00312: online log 1 thread 1: '/data/temp3/redo01.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory


멤버 하나가 지워져도 운영에는 문제가 없어서 alert log 파일에만 장애를 기록하고 운영중인 DB는 정상작동 됨

장애가 확인된 멤버는 삭제 한 후 다시 생성해주면 잘 돌아감


[oracle@localhost ~]$ exit

exit


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ------

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                           5         24 INACTIVE YES

     3 /data/temp3/redo03_b.log                         5         24 INACTIVE YES


6 rows selected.


SQL> alter database drop logfile member

  2  '/data/temp3/redo03_b.log';


Database altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                           5         24 INACTIVE YES


SQL> alter database add logfile member

  2  '/data/temp3/redo03_b.log' t group 3;

'/data/temp3/redo03_b.log' t group 3

                           *

ERROR at line 2:

ORA-00946: missing TO keyword



SQL> ed

Wrote file afiedt.buf


  1  alter database add logfile member

  2* '/data/temp3/redo03_b.log' to group 3

SQL> /

alter database add logfile member

*

ERROR at line 1:

ORA-00301: error in adding log file '/data/temp3/redo03_b.log' - file cannot be created

ORA-27038: created file already exists

Additional information: 1



SQL> ed

Wrote file afiedt.buf


  1  alter database add logfile member

  2* '/data/temp3/redo03_b.log' to group 3

SQL> alter database add logfile member

  2  '/data/temp3/redo03_b.log' to group 3;

alter database add logfile member

*

ERROR at line 1:

ORA-00301: error in adding log file '/data/temp3/redo03_b.log' - file cannot be created

ORA-27038: created file already exists

Additional information: 1



SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                           5         24 INACTIVE YES


삭제된 member 를 생성해주기 전에 해당 디렉토리가서 파일 지워야 함


SQL> !rm /data/temp3/redo03_b.log


SQL> alter database add logfile member '/data/temp3/redo03_b.log'to group 3;


Database altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                           5         24 INACTIVE YES

     3 /data/temp3/redo03_b.log                         5         24 INACTIVE YES


6 rows selected.


Case 2. archive 완료된 그룹이 지워진 후 DB Close 상태

( 에러코드 : ORA-00313: open failed for members of log group....)


current가 아닌 하나의 그룹이 삭제된 후 DB가 종료된 경우

DB를 시작하면 지워진 Redo Log 그룹 때문에 에러가 발생하며 DB가 켜지지 않음

그룹이 삭제전 Archive 에 데이터를 복사해 놓았다면 별 문제 없이 해당 그룹을 삭제하고 재생성 하는것으로 해결가능



step1. 현재 상태 확인


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ------ 

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                           5         24 INACTIVE YES

     3 /data/temp3/redo03_b.log                         5         24 INACTIVE YES


6 rows selected.


step2. redo log file 삭제 후 장애 확인


SQL> !rm /data/temp3/redo03*


SQL> !ls /data/temp3/redo03*

ls: /data/temp3/redo03*: 그런 파일이나 디렉토리가 없음


SQL> shut immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.


Total System Global Area  422670336 bytes

Fixed Size                  1344616 bytes

Variable Size             293604248 bytes

Database Buffers          121634816 bytes

Redo Buffers                6086656 bytes

Database mounted.

ORA-03113: end-of-file on communication channel     <-- 강제로 종료되었다는 뜻

Process ID: 1762

Session ID: 1 Serial number: 5



SQL> !

[oracle@localhost ~]$ vi /app/oracle/diag/rdbms/testdb/testdb/trace/alert_testdb.log

alert log 파일에서 redo03 장애 부분 확인


[oracle@localhost ~]$ exit

exit


step3. 복구 후 OPEN


[oracle@localhost ~]$ sqlplus / as sysdba


SQL*Plus: Release 11.2.0.2.0 Production on Fri Oct 17 16:53:53 2014


Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to an idle instance.


SQL> startup mount

ORACLE instance started.


Total System Global Area  422670336 bytes

Fixed Size                  1344616 bytes

Variable Size             293604248 bytes

Database Buffers          121634816 bytes

Redo Buffers                6086656 bytes

Database mounted.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                           5         24 INACTIVE YES

     3 /data/temp3/redo03_c.log                         5         24 INACTIVE YES


6 rows selected.


삭제된 그룹3 이 archive 의 상태가 YES 이므로 데이터가 들어갔음. 이럴 경우는 해당 그룹삭제후 OPEN 하면됨


SQL> alter database drop logfile group 3;


Database altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES


SQL> alter database open;


Database altered.           <-- 제대로 OPEN 됬음


SQL> alter database add logfile group 3(

  2  '/data/temp3/redo03.log',

  3  '/data/temp3/redo03_b.log') size 50m;


Database altered.            <-- 다시 그룹3 생성해줌 (MOUNT 에서 만들고 OPEN 해도 됨)


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                          50          0 UNUSED   YES

     3 /data/temp3/redo03_b.log                        50          0 UNUSED   YES


6 rows selected.


Case 3. current 아닌 그룹 중 archive 안 된 그룹이 삭제되고 DB가 OPEN 상태일 경우

(에러코드 : ORA-00313: open failed for members of log group ....)


삭제된 그룹이 archive 되지 않은 경우.

서버 운영중 특정 그룹이 지워진 후 계속 log switch 가 발생하게 되면 DB가 archive hang 현상이 발생해 비정상 종료됨


step1. 현재상태 확인


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5         25 INACTIVE YES

     1 /data/temp3/redo01_b.log                         5         25 INACTIVE YES

     2 /data/temp3/redo02.log                           5         27 CURRENT  NO

     2 /data/temp3/redo02_b.log                         5         27 CURRENT  NO

     3 /data/temp3/redo03.log                          50         26 INACTIVE YES

     3 /data/temp3/redo03_b.log                        50         26 INACTIVE YES


6 rows selected.


step2. 그룹 삭제 ( archive 완료된 그룹 3 을 삭제 )


SQL> !rm -f /data/temp3/redo03*


SQL> !ls /data/temp3/redo03*

ls: /data/temp3/redo03*: 그런 파일이나 디렉토리가 없음


SQL> alter system switch logfile;      <-- 로그스위치를 계속 발생시켜 hang 상태를 유발


System altered.


SQL> /


System altered.


SQL> /


System altered.


SQL> /


System altered.


SQL> /                       <-- hang 발생해서 대기상태 됨. ctrl + c  키로 작업 취소시킴

alter system switch logfile

*

ERROR at line 1:

ORA-01013: user requested cancel of current operation


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5         31 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         31 CURRENT  NO

     2 /data/temp3/redo02.log                           5         30 INACTIVE NO

     2 /data/temp3/redo02_b.log                         5         30 INACTIVE NO

     3 /data/temp3/redo03.log                          50         29 INACTIVE NO

     3 /data/temp3/redo03_b.log                        50         29 INACTIVE NO


6 rows selected.


위에서 arc 부분을 보면 전부 NO 상태임을 확인할 수 있다.

3번이 장애가 일어나서 차례로 아카이빙이 되지않았기 때문에 hang 이 일어난것


SQL> !

[oracle@localhost ~]$ vi /app/oracle/diag/rdbms/testdb/testdb/trace/alert_testdb.log


Fri Oct 17 17:14:20 2014

Errors in file /app/oracle/diag/rdbms/testdb/testdb/trace/testdb_arc3_1979.trc:

ORA-00313: open failed for members of log group 3 of thread 1

ORA-00312: online log 3 thread 1: '/data/temp3/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: '/data/temp3/redo03.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3


위 에러처럼 그룹 3이 장애가 난것을 확인할 수 있음

[oracle@localhost ~]$ exit
exit

SQL> alter database clear unarchived logfile group 3;   

Database altered.
위 명령어는 redo log file 을 drop 하고 신규로 add 해주는 역할.
위처럼 운영중 redo log file 이 장애가 발생했을 경우 redo log file 을 초기화시켜 DB 중단없이 사용할 수 있도록 하는 기능
이 명령어로 redo log file 을 재생성하게 되면 반드시 DB 전체를 backup 해줘야 한다. 
향후 장애가 생겼을 경우 archive log file 이 중간에 비어있어서 복구가 안됨

SQL> @log
  6  ;

GROUP# MEMBER                                          MB        seq STATUS   arc
------ --------------------------------------------- ---- ---------- -------- -----
     1 /data/temp3/redo01.log                           5         31 CURRENT  NO
     1 /data/temp3/redo01_b.log                         5         31 CURRENT  NO
     2 /data/temp3/redo02.log                           5         30 INACTIVE YES
     2 /data/temp3/redo02_b.log                         5         30 INACTIVE YES
     3 /data/temp3/redo03.log                          50          0 UNUSED   YES
     3 /data/temp3/redo03_b.log                        50          0 UNUSED   YES

6 rows selected.


Case 4. Current 아닌 그룹 중 archive 안 된 그룹이 지워지고 DB Close 상태인 경우

[관련 에러코드]

ORA-00257 : archiver error. Connect internal only, until freed.

ORA-00313 : open failed for members of log group 2 of thread 1

ORA-00350 : log 2 of instance testdb (thread 1 ) needs to be archived 


step1. 상태 확인


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5         34 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         34 CURRENT  NO

     2 /data/temp3/redo02.log                           5         33 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         33 INACTIVE YES

     3 /data/temp3/redo03.log                          50         32 INACTIVE YES

     3 /data/temp3/redo03_b.log                        50         32 INACTIVE YES


6 rows selected.


step2. 장애 발생시킴


SQL> !rm -f /data/temp3/redo03*


SQL> !ls /data/temp3/redo03*

ls: /data/temp3/redo03*: 그런 파일이나 디렉토리가 없음


SQL> alter system switch logfile;


System altered.


SQL> /


System altered.


SQL> /


System altered.


SQL>/                  <-- hang 발생



[oracle@localhost ~]$ sqlplus scott/tiger            <-- hang 상태로 다른 터미널 열어서 테스트


SQL*Plus: Release 11.2.0.2.0 Production on Fri Oct 17 17:33:32 2014


Copyright (c) 1982, 2010, Oracle.  All rights reserved.


ERROR:

ORA-00257: archiver error. Connect internal only, until freed.   <-- 접속이 안됨



Enter user-name: sys/oracle as sysdba         <-- 관리자 계정으로는 접속이 가능


Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production

With the Partitioning option


SQL> 


관리자 계정으로 에러를 해결해야 하기 때문에 다른 계정은 접속이 안됨


SQL> shutdown abort;

ORACLE instance shut down.


step3. 재시작 시키면 에러 발생하며 중단 됨


SQL> startup

ORACLE instance started.


Total System Global Area  422670336 bytes

Fixed Size                  1344616 bytes

Variable Size             293604248 bytes

Database Buffers          121634816 bytes

Redo Buffers                6086656 bytes

Database mounted.

ORA-03113: end-of-file on communication channel         <-- redo 문제로 강제 종료됨

Process ID: 2763

Session ID: 1 Serial number: 5


step4. 장애 확인후 복구


SQL> !

[oracle@localhost ~]$ vi /app/oracle/diag/rdbms/testdb/testdb/trace/alert_testdb.log    <--alert log 열어서 장애확인

[oracle@localhost ~]$ sqlplus sys/oracle as sysdba


SQL*Plus: Release 11.2.0.2.0 Production on Fri Oct 17 17:35:53 2014


Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to an idle instance.


SQL> startup mount

ORACLE instance started.


Total System Global Area  422670336 bytes

Fixed Size                  1344616 bytes

Variable Size             293604248 bytes

Database Buffers          121634816 bytes

Redo Buffers                6086656 bytes

Database mounted.


SQL> alter database drop logfile group 3;              

alter database drop logfile group 3

*

ERROR at line 1:

ORA-00350: log 3 of instance testdb (thread 1) needs to be archived    <-- 아카이브 안된 그룹은 삭제 할 수 없다함

ORA-00312: online log 3 thread 1: '/data/temp3/redo03.log'

ORA-00312: online log 3 thread 1: '/data/temp3/redo03_b.log'



SQL> alter database clear unarchived logfile group 3;           <-- redo log file 을 drop 하고 재생성


Database altered.


SQL> alter database open;


Database altered.


SQL> !ls /data/temp3/redo03*

/data/temp3/redo03_b.log  /data/temp3/redo03.log


SQL> @log;

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5         37 INACTIVE YES

     1 /data/temp3/redo01_b.log                         5         37 INACTIVE YES

     2 /data/temp3/redo02.log                           5         36 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         36 INACTIVE YES

     3 /data/temp3/redo03.log                          50         38 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50         38 CURRENT  NO


6 rows selected.


SQL>


Case 5. current 그룹이 삭제된 후 DB Open 상태

이 경우는 위에서 살펴본 case 3 과 같은 경우


Case 6. Current 그룹이 삭제된 경우 - Shut immediate 로 종료

[관련 에러 코드]

ORA-00313 : open failed for members of log group .....

ORA-03113 : end-of-file on communication channel.


Current 그룹이 삭제된 후 DB가 종료되었다면 정상 종료인지 비정상 종료인지에 따라 향후 재시작 할 때 문제가  될 수 있음


step1. 현재상태 확인


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5         37 INACTIVE YES

     1 /data/temp3/redo01_b.log                         5         37 INACTIVE YES

     2 /data/temp3/redo02.log                           5         36 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         36 INACTIVE YES

     3 /data/temp3/redo03.log                          50         38 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50         38 CURRENT  NO


6 rows selected.


step2. 데이터 입력 후 장애 발생


SQL> create table scott.tt200 (no number) tablespace users;


Table created.


SQL> insert into scott.tt200 values(1);


1 row created.


SQL> commit;


Commit complete.


테스트용 테이블 scott.tt200 을 생성한 후 1을 입력한 내용이 3번 그룹에 저장됨


step3. current 상태인 3번 그룹을 os 명령어로 삭제 한 후 재부팅


SQL> !rm -f /data/temp3/redo03*


SQL> !ls /data/temp3/redo03*

ls: /data/temp3/redo03*: No such file or directory


SQL> shut immediate;           <-- 정상 종료시킴

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.


Total System Global Area  422670336 bytes

Fixed Size                  1344616 bytes

Variable Size             293604248 bytes

Database Buffers          121634816 bytes

Redo Buffers                6086656 bytes

Database mounted.

ORA-03113: end-of-file on communication channel         <-- 강제로 종료 됨

Process ID: 3300

Session ID: 1 Serial number: 5


step4. alert log로 에러 메시지 확인

SQL> !vi $ORACLE_BASE/diag/rdbms/testdb/testdb/trace/alert_testdb.log


step5. 복구후 open


current 상태의 redo log group 이 삭제된 후 DB가 shutdown immediate로 종료 된 것입니다.

scott.tt200 을 생성후 1을 입력 후 commit 했기 때문에 shutdown immediate 했으면 해당 내용은 데이터 파일로 저장된 상태

그렇기 때문에 데이터는 복구 할 필요가 없고 redo log file 이 없어서 open 안되는 문제만 해결하면 됨

redo log 를 재생성 하는 resetlogs 옵션을 사용하기 위해 불완전 복구를 해야함

그래서 지금과 같은 상황에 불완전 복구 하기 위해 until cancel 옵션을 사용


SQL> startup mount

ORACLE instance started.


Total System Global Area  422670336 bytes

Fixed Size                  1344616 bytes

Variable Size             293604248 bytes

Database Buffers          121634816 bytes

Redo Buffers                6086656 bytes

Database mounted.


SQL> recover database until cancel;

Media recovery complete.


SQL> alter database open resetlogs;


Database altered.


SQL> select * from scott.tt200;


        NO

----------

         1


Case 7. Current 그룹이 삭제된 후 shutdown abort 로 종료 (backup file 이 존재할 경우)

[관련 에러 코드]

ORA-00326: log begins at change ....

ORA-00283: recovery session canceled due to errors


step0. DB 종료후 전체 데이터베이스 백업


step1. Open 후 현재 상태 확인


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          4 INACTIVE YES

     1 /data/temp3/redo01_b.log                         5          4 INACTIVE YES

     2 /data/temp3/redo02.log                           5          5 CURRENT  NO

     2 /data/temp3/redo02_b.log                         5          5 CURRENT  NO

     3 /data/temp3/redo03.log                          50          3 INACTIVE YES

     3 /data/temp3/redo03_b.log                        50          3 INACTIVE YES


6 rows selected.


2번 그룹에 scott.tt600 테이블을 생성해서 데이터 1건을 입력

SQL> create table scott.tt600 (no number);


Table created.


SQL> insert into scott.tt600 values(1);


1 row created.


SQL> commit;


Commit complete.       <-- 여기까지 2번 그룹에 저장


SQL> alter system switch logfile;       <-- 로그 스위치 일으켜서 current 가 3번 그룹으로 바뀜


System altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          4 INACTIVE YES

     1 /data/temp3/redo01_b.log                         5          4 INACTIVE YES

     2 /data/temp3/redo02.log                           5          5 ACTIVE   YES

     2 /data/temp3/redo02_b.log                         5          5 ACTIVE   YES

     3 /data/temp3/redo03.log                          50          6 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50          6 CURRENT  NO


6 rows selected.


3번 그룹에 데이터 입력

SQL> insert into scott.tt600 values(2);


1 row created.


SQL> commit;


Commit complete.      <-- 여기까지 3번 그룹에 저장


SQL> alter system switch logfile;        <-- 로그스위치 일으켜서 1번 그룹이 current


System altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          7 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5          7 CURRENT  NO

     2 /data/temp3/redo02.log                           5          5 ACTIVE   YES

     2 /data/temp3/redo02_b.log                         5          5 ACTIVE   YES

     3 /data/temp3/redo03.log                          50          6 ACTIVE   YES

     3 /data/temp3/redo03_b.log                        50          6 ACTIVE   YES


6 rows selected.


SQL> insert into scott.tt600 values(3);


1 row created.


SQL> commit;


Commit complete.  <-- 1번 그룹에 저장


SQL> select * from scott.tt600;


        NO

----------

         1        <-- 2번 그룹에 저장됨

         2        <-- 3번 그룹에 저장됨

         3        <-- 1번 그룹에 저장됨


현재 current 상태인 1번 그룹 삭제하는 장애 만듬

SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          7 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5          7 CURRENT  NO

     2 /data/temp3/redo02.log                           5          5 ACTIVE   YES

     2 /data/temp3/redo02_b.log                         5          5 ACTIVE   YES

     3 /data/temp3/redo03.log                          50          6 ACTIVE   YES

     3 /data/temp3/redo03_b.log                        50          6 ACTIVE   YES


6 rows selected.


SQL> !rm -f /data/temp3/redo01*


SQL> !ls /data/temp3/redo01*

ls: /data/temp3/redo01*: No such file or directory


SQL> shut abort;

ORACLE instance shut down.

SQL> !cp /data/backup/close/*.dbf /data/temp3/


step3.  복구하기


SQL> startup mount

ORACLE instance started.


Total System Global Area  422670336 bytes

Fixed Size                  1344616 bytes

Variable Size             293604248 bytes

Database Buffers          121634816 bytes

Redo Buffers                6086656 bytes

Database mounted.


SQL> recover database until cancel;


ORA-00279: change 1428687 generated at 10/17/2014 18:26:38 needed for thread 1

ORA-00289: suggestion : /data/arc2/1_1_861213720.arc

ORA-00280: change 1428687 for thread 1 is in sequence #1



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00279: change 1429110 generated at 10/17/2014 18:45:57 needed for thread 1

ORA-00289: suggestion : /data/arc2/2_1_861213720.arc

ORA-00280: change 1429110 for thread 1 is in sequence #2

ORA-00278: log file '/data/arc2/1_1_861213720.arc' no longer needed for this recovery



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00279: change 1429113 generated at 10/17/2014 18:45:57 needed for thread 1

ORA-00289: suggestion : /data/arc2/3_1_861213720.arc

ORA-00280: change 1429113 for thread 1 is in sequence #3

ORA-00278: log file '/data/arc2/2_1_861213720.arc' no longer needed for this recovery



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00279: change 1429117 generated at 10/17/2014 18:46:00 needed for thread 1

ORA-00289: suggestion : /data/arc2/4_1_861213720.arc

ORA-00280: change 1429117 for thread 1 is in sequence #4

ORA-00278: log file '/data/arc2/3_1_861213720.arc' no longer needed for this recovery



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00279: change 1429120 generated at 10/17/2014 18:46:00 needed for thread 1

ORA-00289: suggestion : /data/arc2/5_1_861213720.arc

ORA-00280: change 1429120 for thread 1 is in sequence #5

ORA-00278: log file '/data/arc2/4_1_861213720.arc' no longer needed for this recovery



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00279: change 1429213 generated at 10/17/2014 18:46:51 needed for thread 1

ORA-00289: suggestion : /data/arc2/6_1_861213720.arc

ORA-00280: change 1429213 for thread 1 is in sequence #6

ORA-00278: log file '/data/arc2/5_1_861213720.arc' no longer needed for this recovery



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00279: change 1429232 generated at 10/17/2014 18:47:37 needed for thread 1

ORA-00289: suggestion : /data/arc2/7_1_861213720.arc

ORA-00280: change 1429232 for thread 1 is in sequence #7

ORA-00278: log file '/data/arc2/6_1_861213720.arc' no longer needed for this recovery



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00308: cannot open archived log '/data/arc2/7_1_861213720.arc'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3


SQL> alter database open resetlogs;


Database altered.


SQL> select * from scott.tt600

  2  ;


        NO

----------

         1

         2         

                           <-- 3번그룹은 데이터가 복구 안되었음


Case 8. - Current 그룹이 삭제되고 Shutdown abort 로 종료됨 (backup file 이나 archive log file 이 없을 경우)

[관련 에러 코드]

ORA-01547 : warning:RECOVER succeeded but OPEN RESETLOGS would get error below

ORA-00308 : cannot open archived log ...

ORA-01194 : file 1 needs more recovery to be consistent


상황 1. 데이터를 모두 복구해내는 경우


step 1. no archive log mode 로 변경하기


SQL> shut immediate


SQL> startup mount


SQL> archive log list            <-- archive 모드 확인하고 archive log mode일경우 noarchive log mode 로 변경 


SQL> alter database noarchivelog ;


SQL> alter database open ;


step 2. 데이터 입력


SQL>@log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          4 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5          4 CURRENT  NO

     2 /data/temp3/redo02.log                           5          2 INACTIVE NO

     2 /data/temp3/redo02_b.log                         5          2 INACTIVE NO

     3 /data/temp3/redo03.log                          50          3 INACTIVE NO

     3 /data/temp3/redo03_b.log                        50          3 INACTIVE NO


6 rows selected.


SQL> create table scott.tt650 ( no number ) ;


Table created.


SQL> insert into scott.tt650 values(1);


1 row created.


SQL> commit;


Commit complete.    <--여기까지 1번 그룹에 저장


SQL> alter system switch logfile;


System altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          4 ACTIVE   NO

     1 /data/temp3/redo01_b.log                         5          4 ACTIVE   NO

     2 /data/temp3/redo02.log                           5          5 CURRENT  NO

     2 /data/temp3/redo02_b.log                         5          5 CURRENT  NO

     3 /data/temp3/redo03.log                          50          3 INACTIVE NO

     3 /data/temp3/redo03_b.log                        50          3 INACTIVE NO


6 rows selected.


SQL> insert into scott.tt650 values(2);


1 row created.


SQL> commit;


Commit complete.    <--여기까지 2번 그룹에 저장


SQL> alter system switch logfile;


System altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          4 ACTIVE   NO

     1 /data/temp3/redo01_b.log                         5          4 ACTIVE   NO

     2 /data/temp3/redo02.log                           5          5 ACTIVE   NO

     2 /data/temp3/redo02_b.log                         5          5 ACTIVE   NO

     3 /data/temp3/redo03.log                          50          6 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50          6 CURRENT  NO


6 rows selected.


SQL> insert into scott.tt650 values(3);


1 row created.


SQL> commit;


Commit complete.    <--여기까지 3번 그룹에 저장


SQL> select * from scott.tt650;


        NO

----------

         1    <-- 1번 그룹에 저장

         2    <-- 2번 그룹에 저장

         3    <-- 3번 그룹에 저장


step 3. current 그룹이 삭제되는 장애 발생 후 강제 종료


SQL> alter system switch logfile;


System altered.


SQL> /


System altered.


SQL> /


System altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          7 INACTIVE NO

     1 /data/temp3/redo01_b.log                         5          7 INACTIVE NO

     2 /data/temp3/redo02.log                           5          8 INACTIVE NO

     2 /data/temp3/redo02_b.log                         5          8 INACTIVE NO

     3 /data/temp3/redo03.log                          50          9 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50          9 CURRENT  NO


6 rows selected.


위에서 3번 그룹이 current 임이 확인 됨


SQL> !rm -f data/temp3/redo03*


SQL> !ls /data/temp3/redo03*

/data/temp3/redo03_b.log  /data/temp3/redo03.log


SQL> !rm -f /data/temp3/redo03*


SQL> !ls /data/temp3/redo03*

ls: /data/temp3/redo03*: No such file or directory


SQL> shut abort

ORACLE instance shut down.


step 4. 복구


SQL> !vi $ORACLE_HOME/dbs/inittestdb.ora 

기존 파라 미터 파일에 다음과 같은 파라미터 추가   : _allow_resetlogs_corruption=true   


SQL> startup

ORACLE instance started.


Total System Global Area  422670336 bytes

Fixed Size                  1344616 bytes

Variable Size             293604248 bytes

Database Buffers          121634816 bytes

Redo Buffers                6086656 bytes

Database mounted.

ORA-00313: open failed for members of log group 3 of thread 1

ORA-00312: online log 3 thread 1: '/data/temp3/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: '/data/temp3/redo03.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3


위와 같이 3번 그룹이 없어서 에러가 발생


SQL> recover database until cancel;            

ORA-00279: change 1430366 generated at 10/17/2014 19:05:37 needed for thread 1

ORA-00289: suggestion : /data/arc2/9_1_861216772.arc

ORA-00280: change 1430366 for thread 1 is in sequence #9



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00308: cannot open archived log '/data/arc2/9_1_861216772.arc'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3



ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below

ORA-01194: file 1 needs more recovery to be consistent

ORA-01110: data file 1: '/data/temp3/system01.dbf'



SQL> alter database open resetlogs;


Database altered.


SQL> select * from scott.tt650;


        NO

----------

         1

         2

         3


복구가 된 이유는 로그스위치가 수차례 일어나면서 데이터가 데이터파일에 모두 저장이되어서 완전 복구 된 것


상황 2. current 에 저장된 데이터는 복구 못하는 경우


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          1 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5          1 CURRENT  NO

     2 /data/temp3/redo02.log                           5          0 UNUSED   YES

     2 /data/temp3/redo02_b.log                         5          0 UNUSED   YES

     3 /data/temp3/redo03.log                          50          0 UNUSED   YES

     3 /data/temp3/redo03_b.log                        50          0 UNUSED   YES


6 rows selected.


SQL> create table scott.tt660 ( no number );


Table created.


SQL> insert into scott.tt660 values(1);


1 row created.


SQL> commit;       <-- 여기까지 1번 그룹에 저장


Commit complete.


SQL> alter system switch logfile;


System altered.


SQL> insert into scott.tt660 values(2);


1 row created.


SQL> commit;


Commit complete.       <-- 여기까지 2번 그룹에 저장


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          1 ACTIVE   NO

     1 /data/temp3/redo01_b.log                         5          1 ACTIVE   NO

     2 /data/temp3/redo02.log                           5          2 CURRENT  NO

     2 /data/temp3/redo02_b.log                         5          2 CURRENT  NO

     3 /data/temp3/redo03.log                          50          0 UNUSED   YES

     3 /data/temp3/redo03_b.log                        50          0 UNUSED   YES


6 rows selected.


SQL> alter system switch logfile;


System altered.


SQL> insert into scott.tt660 values(3);


1 row created.


SQL> commit;


Commit complete.       <-- 여기까지 3번 그룹에 저장


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          1 ACTIVE   NO

     1 /data/temp3/redo01_b.log                         5          1 ACTIVE   NO

     2 /data/temp3/redo02.log                           5          2 ACTIVE   NO

     2 /data/temp3/redo02_b.log                         5          2 ACTIVE   NO

     3 /data/temp3/redo03.log                          50          3 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50          3 CURRENT  NO


6 rows selected.


SQL> !rm /data/temp3/redo03*


SQL> !ls /data/temp3/redo03*

ls: /data/temp3/redo03*: No such file or directory


SQL> shut abort

ORACLE instance shut down.


SQL>! vi $ORACLE_HOME/dbs/inittestdb.ora

__allow_resetlogs_corruption=true         파라미터 추가


SQL> startup mount

ORACLE instance started.


Total System Global Area  422670336 bytes

Fixed Size                  1344616 bytes

Variable Size             293604248 bytes

Database Buffers          121634816 bytes

Redo Buffers                6086656 bytes

Database mounted.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          1 ACTIVE   NO

     1 /data/temp3/redo01_b.log                         5          1 ACTIVE   NO

     2 /data/temp3/redo02.log                           5          2 ACTIVE   NO

     2 /data/temp3/redo02_b.log                         5          2 ACTIVE   NO

     3 /data/temp3/redo03.log                          50          3 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50          3 CURRENT  NO


6 rows selected.


1,2 번 그룹은 active 상태이므로 해당 로그 내용은 데이터파일에 저장 안되었음을 알 수 있다.

SQL> recover database until cancel;
ORA-00279: change 1430370 generated at 10/17/2014 19:07:48 needed for thread 1
ORA-00289: suggestion : /data/arc2/1_1_861217667.arc
ORA-00280: change 1430370 for thread 1 is in sequence #1

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/data/temp3/redo01.log                         <-- sequence 1 에 해당하는 로그파일 입력

ORA-00279: change 1430933 generated at 10/17/2014 19:16:41 needed for thread 1
ORA-00289: suggestion : /data/arc2/2_1_861217667.arc
ORA-00280: change 1430933 for thread 1 is in sequence #2
ORA-00278: log file '/data/temp3/redo01.log' no longer needed for this recovery

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/data/temp3/redo02.log                         <-- sequence 2 에 해당하는 로그파일 입력

ORA-00279: change 1430944 generated at 10/17/2014 19:17:05 needed for thread 1
ORA-00289: suggestion : /data/arc2/3_1_861217667.arc
ORA-00280: change 1430944 for thread 1 is in sequence #3
ORA-00278: log file '/data/temp3/redo02.log' no longer needed for this recovery

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel                         <-- sequence 3 에 해당하는 로그파일 삭제되어 cancel 입력

ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/data/temp3/system01.dbf'


ORA-01112: media recovery not started           <-- 리두로그파일3이 없어 제대로 복구되지않아 이렇게 뜸


SQL> alter database open resetlogs;             <-- reset logs 옵션으로 오픈

Database altered.

SQL> select * from scott.tt660;

        NO
----------
         1
         2
resetlogs 와 _allow_resetlogs_corruption

DB가 OPEN 되기 위해서는 운영중인 Data file, Redo Log File , Controlfile 의 체크포인트 정보가 모두 동일해야 한다.
그러나 불완전 복구를 하게되면 3개의 파일의 체크포인트 정보가 달라지게 된다.
resetlogs 옵션은datafile끼리의 체크포인트 정보는 같지만 redo log file 과 controlfile 과의 체크포인트 정보가 다를 경우 사용
데이터 파일들 끼리 체크포인트 정보가 다를경우 사용하는 옵션이 _allow_resetlogs_corruption=true 사용.


Case 9. 전체 Redo log file이 삭제된 경우 DB OPEN 상태 (archive log mode 에서 작업)


step1. 현재 상태 확인


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          1 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5          1 CURRENT  NO

     2 /data/temp3/redo02.log                           5          0 UNUSED   YES

     2 /data/temp3/redo02_b.log                         5          0 UNUSED   YES

     3 /data/temp3/redo03.log                          50          0 UNUSED   YES

     3 /data/temp3/redo03_b.log                        50          0 UNUSED   YES


6 rows selected.


SQL> !rm -f /data/temp3/*.log


SQL> alter system switch logfile;


System altered.


SQL> /


System altered.


SQL> /        <-- hang 발생 ctrl+c 눌러 취소

alter system switch logfile

*

ERROR at line 1:

ORA-01013: user requested cancel of current operation


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          1 INACTIVE NO

     1 /data/temp3/redo01_b.log                         5          1 INACTIVE NO

     2 /data/temp3/redo02.log                           5          2 INACTIVE NO

     2 /data/temp3/redo02_b.log                         5          2 INACTIVE NO

     3 /data/temp3/redo03.log                          50          3 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50          3 CURRENT  NO


6 rows selected.


1번 그룹이 seq 가 가장낮아서 1번 그룹 때문에 이후 모든 로그파일이 아카이빙 안되고 있어서 clear 해줌


SQL> alter database clear unarchived logfile group 1;


Database altered.


SQL> alter system switch logfile;


System altered.


SQL> /        <-- hang 발생 ctrl+c 눌러 취소

alter system switch logfile

*

ERROR at line 1:

ORA-01013: user requested cancel of current operation


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          4 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5          4 CURRENT  NO

     2 /data/temp3/redo02.log                           5          2 INACTIVE NO

     2 /data/temp3/redo02_b.log                         5          2 INACTIVE NO

     3 /data/temp3/redo03.log                          50          3 ACTIVE   NO

     3 /data/temp3/redo03_b.log                        50          3 ACTIVE   NO


6 rows selected.


2번 그룹이 seq 가 가장낮아서 1번 그룹 때문에 이후 모든 로그파일이 아카이빙 안되고 있어서 clear 해줌

SQL> alter database clear unarchived logfile group 2;


Database altered.


SQL> alter system switch logfile;


System altered.


SQL> /        <-- hang 발생 ctrl+c 눌러 취소

alter system switch logfile

*

ERROR at line 1:

ORA-01013: user requested cancel of current operation


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

------ --------------------------------------------- ---- ---------- -------- -----

     1 /data/temp3/redo01.log                           5          4 ACTIVE   NO

     1 /data/temp3/redo01_b.log                         5          4 ACTIVE   NO

     2 /data/temp3/redo02.log                           5          5 CURRENT  NO

     2 /data/temp3/redo02_b.log                         5          5 CURRENT  NO

     3 /data/temp3/redo03.log                          50          3 INACTIVE NO

     3 /data/temp3/redo03_b.log                        50          3 INACTIVE NO


6 rows selected.

3번 그룹이 seq 가 가장낮아서 1번 그룹 때문에 이후 모든 로그파일이 아카이빙 안되고 있어서 clear 해줌

SQL> alter database clear unarchived logfile group 3;


Database altered.


SQL> alter system switch logfile;


System altered.


SQL> /


System altered.


SQL> /


System altered.


SQL> /


System altered.


아무 이상없이 작동 잘됨.


Case 10. 전체 Redo log file 이 삭제된 경우 DB Close 상태 - 백업 있는 상태

DB가 shut immediate 상태로 종료되었을 경우 앞에서 확인한 Case 6 번의 경우와 동일하게 해결하면 된다.

그러나 shut abort 상태로 비정상 종료되었을 경우는 Case 7 번의 경우와 동일하게 복구하면 된다.


Case 11. 전체 Redo log file 이 삭제된 경우 DB Close 상태 - 백업 없는 상태

Case 8 방법과 복구방법이 동일



반응형