Redo Log File Recovery (리두 로그 파일 복구)

Posted by

리두 로그 파일 복구가 필요한 상황은 다음과 같다.

1. 리두 로그 파일 멤버가 손상된 경우

2. 리두 로그 파일 그룹이 손상된 경우 (INACTIVE 상태)

3. 리두 로그 파일 그룹이 손상된 경우 (ACTIVE / CURRENT 상태)


멤버가 손상된 경우에는 손상되지 않은 리두 로그 멤버 파일을 손상된 리두 로그 멤버 파일에

덮어씌어 교체해주면 되지만, 그룹이 손상된 경우에는 그룹 삭제 후 재생성 해주어야 한다.

또한 필히 Whole Database Backup을 수행해 주어야 한다.


 

1. 리두 로그 파일 멤버가 손상된 경우

기존 리두 로그 파일의 파일명을 수정(또는 삭제) 하여 손상된 상황을 만든다.

 mv $ORACLE_BASE/oradata/orcl/temp1/redo02_1.log $ORACLE_BASE/oradata/orcl/temp1/redo02_1.log_  데이터베이스를 재기동 한다. shutdown immediate;  Database closed.Database dismounted.ORACLE instance shut down. startup 

ORACLE instance started.

Total System Global Area 285212672 bytes
Fixed Size 1218968 bytes
Variable Size 92276328 bytes
Database Buffers 184549376 bytes
Redo Buffers 7168000 bytes
Database mounted.
Database opened.

  리두 로그 파일이 다중화 되어 있기에 재기동시 문제가 발생하지는 않는다. 하지만 v$logfile 과 alert log file을 확인해 보면 문제가 존재한다.

show parameter background_dump_dest 명령어로 alert log 파일 경로를 확인할 수 있다.
 SELECT * FROM v$logfile; 

GROUP# STATUS TYPE MEMBER IS_RECOVE
——————————————————————————————————————————————————————-
2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO
2 INVALID ONLINE /u01/app/oracle/oradata/orcl/temp1/redo02_1.log NO
1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO
3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO
3 ONLINE /u01/app/oracle/oradata/orcl/temp1/redo03_1.log NO vi $ORACLE_BASE/admin/orcl/bdump/alert_orcl.log 

ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: ‘/u01/app/oracle/oradata/orcl/temp1/redo02_1.log’
ORA-27037: unable to obtain file status 데이터베이스 운영에 있어 당장 문제가 발생하지 않더라도 후에 치명적인 문제가

될 수 있기에 복구하기를 권장한다. 컨트롤 파일 복구 때와 마찬가지로 손상되지 않은 리두 로그 파일을 손상된 파일에 덮어씌워 준다. 주의할 점은 같은 그룹 내 멤버 파일로 덮어씌워야 한다는 점이다. cp $ORACLE_BASE/oradata/orcl/redo02.log $ORACLE_BASE/oradata/orcl/temp1/redo02_1.log  정상적인 리두 로그 파일로 교체해 준 후 수동으로 log switch 를 발생시킨다. alter system switch logfile; System altered. 

alter system switch logfile; System altered. alter system switch logfile;

System altered.  다시 v$logfile 과 alert log file을 확인해 본다. SELECT * FROM v$logfile; GROUP# STATUS TYPE MEMBER IS_RECOVE——————————————————————————————————————————————————————-2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO2 ONLINE /u01/app/oracle/oradata/orcl/temp1/redo02_1.log NO1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO3 ONLINE /u01/app/oracle/oradata/orcl/temp1/redo03_1.log NO vi $ORACLE_BASE/admin/orcl/bdump/alert Thread 1 advanced to log sequence 63
Current log# 2 seq# 63 mem# 0: /u01/app/oracle/oradata/orcl/redo02.log
Current log# 2 seq# 63 mem# 1: /u01/app/oracle/oradata/orcl/temp1/redo02_1.log
 redo02_1.log 파일이 정상적으로 복구되었다.

2. 리두 로그 파일 그룹이 손상된 경우 (INACTIVE 상태)

리두 로그 파일 그룹이 손상된 경우를 만들도록 한다. 참고로 INACTIVE 상태인 그룹을 손상시켜야 한다. select * from v$log; 

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS FIRST_CHANGE# FIRST_TIME——————————————————————————————————————————————————————-

1 1 62 52428800 1 YES INACTIVE 1186437 22-JAN-13
2 1 63 52428800 2 NO CURRENT 1186442 22-JAN-13
3 1 61 52428800 2 YES INACTIVE 1186422 22-JAN-13 mv $ORACLE_BASE/oradata/orcl/redo03.log $ORACLE_BASE/oradata/orcl/redo03_1.log_ mv $ORACLE_BASE/oradata/orcl/temp1/redo03_1.log $ORACLE_BASE/oradata/orcl/temp1/redo03_1.log_  데이터베이스를 재기동한다. shutdown immediate;  Database closed.Database dismounted.ORACLE instance shut down. startup  ORACLE instance started. Total System Global Area 285212672 bytesFixed Size 1218968 bytesVariable Size 92276328 bytesDatabase Buffers 184549376 bytesRedo Buffers 7168000 bytesDatabase mounted.


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.log’
ORA-00312: online log 3 thread 1: ‘/u01/app/oracle/oradata/orcl/temp1/redo03_1.log’ 리두 로그 그룹3 전체가 손상되었기에 mount 까지만 시작되고 오류가 발생하였다. 이를 해결하기 위해서는 해당 그룹을 삭제한 후 재생성 해주어야 한다. 우선 그룹3을 삭제한 후 데이터베이스 상태를 open으로 변경해준다. ALTER DATABASE DROP LOGFILE GROUP 3; Database altered. alter database open; Database altered.  이제 삭제했던 그룹 3을 재생성 해주도록 한다. ALTER DATABASE
ADD LOGFILE GROUP 3 (‘$ORACLE_BASE/oradata/orcl/redo03.log’,
‘$ORACLE_BASE/oradata/orcl/temp1/redo03_1.log’)
SIZE 50M;Database altered.  정상적으로 생성되었는지 확인한다. SELECT * FROM v$log;

 GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS FIRST_CHANGE# FIRST_TIME——————————————————————————————————————————————————————-1 1 64 52428800 1 NO CURRENT 1187354 22-JAN-13
2 1 63 52428800 2 YES INACTIVE 1186442 22-JAN-13
3 1 0 52428800 2 YES UNUSED 0 SELECT * FROM v$logfile;  GROUP# STATUS TYPE MEMBER IS_RECOVE——————————————————————————————————————————————————————-2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO2 ONLINE /u01/app/oracle/oradata/orcl/temp1/redo02_1.log NO1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO3 ONLINE /u01/app/oracle/oradata/orcl/temp1/redo03_1.log NO  리두 로그 그룹3이 정상적으로 생성되었다.

하지만 반드시 Whole Database Backup을 수행해 주어야 한다.

그렇지 않으면 추후 데이터 복구시 현 시점부터 추가된 데이터는 전부 잃어버리게 된다.

 shutdown immediate;  Database closed.Database dismounted.ORACLE instance shut down.cp $ORACLE_BASE/oradata/orcl/* $ORACLE_BASE/oradata/orcl_offline_backup startup ORACLE instance started.
Total System Global Area 285212672 bytesFixed Size 1218968 bytesVariable Size 92276328 bytesDatabase Buffers 184549376 bytesRedo Buffers 7168000 bytesDatabase mounted.Database opened. 리두 로그 파일 그룹이 손상된 경우도 복구되었다.

3. 리두 로그 파일 그룹이 손상된 경우 (ACTIVE / CURRENT 상태)

※ 우선적으로 Whole Database Backup을 진행하도록 한다.

ACTIVE (CURRENT) 상태인 리두 로그 그룹이 손상된 상황을 만들도록 한다.

SELECT * FROM v$log;

 GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS FIRST_CHANGE# FIRST_TIME——————————————————————————————————————————————————————-1 1 64 52428800 1 YES INACTIVE 1187354 22-JAN-13
2 1 63 52428800 2 YES INACTIVE 1186442 22-JAN-13
3 1 65 52428800 2 NO CURRENT 1192168 23-JAN-13

현재 그룹3이 CURRENT 상태이기에 이 그룹에 해당하는 파일을 손상시킨다.

cp $ORACLE_BASE/oradata/orcl/redo03.log $ORACLE_BASE/oradata/orcl/redo03.log_

cp $ORACLE_BASE/oradata/orcl/temp1/redo03_1.log $ORACLE_BASE/oradata/orcl/temp1/redo03_1.log_

데이터베이스를 재기동 한다.

 shutdown immediate;  Database closed.Database dismounted.ORACLE instance shut down. startup  ORACLE instance started. Total System Global Area 285212672 bytesFixed Size 1218968 bytesVariable Size 92276328 bytesDatabase Buffers 184549376 bytesRedo Buffers 7168000 bytesDatabase mounted.
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.log’
ORA-00312: online log 3 thread 1: ‘/u01/app/oracle/oradata/orcl/temp1/redo03_1.log’  이번에도 mount 까지만 시작되고 오류가 발생하였다.

INACTIVE 상태에서 처럼 손상된 리두 로그 그룹을 삭제하여 재생성을 하기로 한다.

ALTER DATABASE DROP LOGFILE GROUP 3;

ERROR at line 1:
ORA-01623: log 3 is current log for instance orcl (thread 1) – cannot drop
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/temp1/redo03_1.log’

삭제를 시도하면 위와 같이 ORA-01623 오류가 발생한다.

현재 삭제하려는 리두 로그 그룹이 CURRENT 상태이기에 삭제할 수 없는 것이다.

또한 백업한 리두 로그 파일을 현재 사용중인 리두 로그 파일에 덮어씌우면

ORA-00314: log 3 of thread 1, expected sequence# doesn’t match

시퀀스 번호가 일치하지 않는다는 오류까지 발생한다.

재생성도 안되고 기존 백업파일로 교체도 안되는 상황인 것이다.

이와 같은 상황에선 Cancel-Based Incomplete Recovery를 수행하여야 한다.

우선 데이터베이스를 종료한다.

 shutdown immediate; ORA-01109: database not open

Database dismounted.
ORACLE instance shut down. 
Whole Database Backup으로 백업한 데이터 파일들을 현재 데이터 파일에 덮어씌운다.

cp $ORACLE_BASE/oradata/orcl_online_backup/*.dbf $ORACLE_BASE/oradata/orcl

덮어씌운 후 데이터베이스를 mount 까지만 시작한다.

startup mount;

ORACLE instance started.

Total System Global Area 285212672 bytes
Fixed Size 1218968 bytes
Variable Size 92276328 bytes
Database Buffers 184549376 bytes
Redo Buffers 7168000 bytes
Database mounted.

데이터베이스 복구를 시도한다.

recover database;

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

auto 입력

ORA-00283: recovery session canceled due to errors
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/temp1/redo03_1.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
Linux Error: 2: No such file or directory
Additional information: 3 
일반적인 복구 방법으로는 진행되지 않기에 Cancel-Based Incomplete Recovery를 수행한다.

recover database until cancel;

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

cancel 입력

Media recovery cancelled. 
복구가 되면 데이터베이스를 open 으로 시작하여야 한다.

하지만 아직 그룹 3에 해당하는 손상된 리두 로그 파일들이 존재하지 않는 상황이다.

ls $ORACLE_BASE/oradata/orcl

control01.ctl control03.ctl redo01.log redo03.log_ system01.dbf temp01.dbf undotbs01.dbf
control02.ctl php01.dbf redo02.log sysaux01.dbf temp temp1 users01.dbf

이를 해결하기 위해 데이터베이스를 open으로 기동 시 로그 시퀀스를 초기화 해주면 된다.

로그 시퀀스 초기화 옵션은 다음과 같다.

alter database open resetlogs;

Database altered.

이제 정상적으로 복구 되었는지 확인한다.

SELECT status FROM v$instance;

STATUS
———————————————————————————————————————————
OPEN

SELECT * FROM v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIVED STATUS FIRST_CHANGE# FIRST_TIME——————————————————————————————————————————————————————-1 1 0 52428800 1 YES UNUSED 0 22-JAN-13
2 1 0 52428800 2 YES UNUSED 0 22-JAN-13
3 1 1 52428800 2 NO CURRENT 1192168 23-JAN-13 ls $ORACLE_BASE/oradata/orcl control01.ctl control03.ctl redo01.log redo03.log sysaux01.dbf temp temp1 users01.dbfcontrol02.ctl php01.dbf redo02.log redo03.log_ system01.dbf temp01.dbf undotbs01.dbf 


확인결과 데이터베이스도 정상적으로 구동중이며 resetlogs 옵션으로 데이터베이스를

시작하였기에 시퀀스가 초기화되면서 문제가 되었던 리두 로그 그룹3의 파일들을

재생성한 것이 확인되었다.

하지만 Incomplete Recovery를 수행 하였기에 일부 데이터가 손실된 상태이다.

출처 : http://stylegoths.blogspot.kr/2013/01/redo-log-file-recovery.html

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다