메뉴 건너뛰기

Korea Oracle User Group

Backup & Recovery

비정상적인 복구를 수행하게 되는 경우(Redo log 유실, Archive log 파일 부재, Resetlog open 에러)

 

현업에서 일하다 보면 가끔 메인이 아닌 서서서브 DB나 테스트 DB에서 복구 불가능한 상황을 겪기도 한다.

그럴 경우 아래 복구 시나리오는 유용하게 사용될 수 있다.


하지만 이는 정상적인 복구 상황이 아님을 유의해야한다. 

 

아래 복구 방법을 사용하게 되는 Case

 

   1. 복구시 Redo Log 파일이 필요한데 이 Redo Log 파일의 corruption이 난 경우
   2. 복구를 완료할 Archive Log 파일이 없는 경우
   3. Resetlogs로 Open 하려고 할 때 ORA-01194 에러를 만나서 수행을 완료할 수 없을 경우

 

위와 같은 경우 복구시 아래 히든 파라미터를 사용하게 된다.

_ALLOW_RESETLOGS_CORRUPTION
_CORRUPTED_ROLLBACK_SEGMENTS
_ALLOW_ERROR_SIMULATION
_MINIMUM_GIGA_SCN

 

히든 파라미터에 대한 설정 내용

 
_ALLOW_RESETLOGS_CORRUPTION (TRUE, FALSE 값을 가진다.)

데이터 파일의 헤더에 기록되어 동기화가 필요한 정보(SCN과 같은)가 일치하지 않더라도 데이터베이스를 오픈할 수 있도록 해 준다.

즉, 복구가 필요한 데이터 파일을 resetlogs 옵션으로 open할 수 있게 해 준다. 기존의 동기화 정보는 무시하게 되며 데이터베이스를 resetlogs로 open하자마자 다음 SCN 정보로 데이터파일 헤더 정보를 갱신하고 동기화 시킨다. 그로 인해 복구가 필요한 데이터베이스에 Rolling Forward 과정이 진행되지 않아 데이터베이스가 정합성이 맞지 않은 상태에서 open된다.

 

_CORRUPTED_ROLLBACK_SEGMENTS (rollback segment 이름을 "," 구분해서 나열하게 된다.)

데이터베이스의 open시 Active한 rollback segment를 통해 Rolling Backward 과정을 수행하게 되는데 이 Rolling Backward 과정을 진행하지 않게 한다. 또한 active한 rollback segment와 undo tablespace를 삭제할 수 있도록 해 준다.

 

_ALLOW_ERROR_SIMULATION (TRUE, FALSE 값을 가지고 optional 하게 사용된다.)

오라클 내부 테스트 용도로 사용된다.

 

_MINIMUM_GIGA_SCN (Number 값을 가지고 optional 하게 사용된다.) => 11.2.0.2.5 부터 파라미터가 없어짐

ADJUST_SCN event와 유사한 파라미터이다. SCN의 값을 높은 값으로 점핑시키기위해 사용한다. 복구시 SCN의 값이 맞지 않는 상황에서 DB에서 백업보다 더 높은 SCN을 요구할 경우에 이를 해결하기 위해서 사용할 수 있다. 파라미터를 사용한 DB는 이후에 반드시 새로 DB 구성을 해야한다. 대개 복구시 ORA-600 [2662] 에러가 발생할 경우 사용하게 된다.

 

 

아래는 위 복구 방법을 적용한 사례이다.

 

 

※ 복구 상황

   1) 대량 트랜잭션 중 전원 장애

   2) NOARCHIVE 모드

   3) 백업 존재하지 않음

   4) Online Redo Log Corruption 상태임

 

 

1. 불완전 복구 첫 시도 후 실패하여 다시 진행하게 된 부분이다. 복구 실패하게 됨

 

SQL> startup mount
ORACLE instance started.

Total System Global Area 1610612736 bytes
Fixed Size                  2096632 bytes
Variable Size             989856264 bytes
Database Buffers          603979776 bytes
Redo Buffers               14680064 bytes
Database mounted.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-00314: log 1 of thread 1, expected sequence# 1201 doesn't match 1204
ORA-00312: online log 1 thread 1:
'/data/app/oracle/datafile/ORCL/redo01.log'
SQL> recover database until cancel
ORA-00279: change 18546330 generated at 12/15/2015 10:28:15 needed for thread 1
ORA-00289: suggestion : /data/app/oracle/dbhome_1/dbs/arch1_1201_870572138.dbf
ORA-00280: change 18546330 for thread 1 is in sequence #1201


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/data/app/oracle/datafile/ORCL/redo01.log
ORA-00310: archived log contains sequence 1204; sequence 1201 required
ORA-00334: archived log: '/data/app/oracle/datafile/ORCL/redo01.log'


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/app/oracle/datafile/ORCL/system01.dbf'


SQL> recover database until cancel
ORA-00279: change 18546330 generated at 12/15/2015 10:28:15 needed for thread 1
ORA-00289: suggestion : /data/app/oracle/dbhome_1/dbs/arch1_1201_870572138.dbf
ORA-00280: change 18546330 for thread 1 is in sequence #1201


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/data/app/oracle/datafile/ORCL/redo03.log
ORA-00310: archived log contains sequence 1203; sequence 1201 required
ORA-00334: archived log: '/data/app/oracle/datafile/ORCL/redo03.log'


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/app/oracle/datafile/ORCL/system01.dbf'


SQL> recover database until cancel
ORA-00279: change 18546330 generated at 12/15/2015 10:28:15 needed for thread 1
ORA-00289: suggestion : /data/app/oracle/dbhome_1/dbs/arch1_1201_870572138.dbf
ORA-00280: change 18546330 for thread 1 is in sequence #1201


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/data/app/oracle/datafile/ORCL/redo01.log
ORA-00310: archived log contains sequence 1204; sequence 1201 required
ORA-00334: archived log: '/data/app/oracle/datafile/ORCL/redo01.log'


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/app/oracle/datafile/ORCL/system01.dbf'


SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/data/app/oracle/datafile/ORCL/system01.dbf'

 

 

 

2. 히든 파라미터 적용하여 아래와 같이 변경함

*.undo_management='MANUAL'
*.undo_tablespace='UNDOTBS01'
*.user_dump_dest='/data/app/oracle/admin/ORCL/udump'
_ALLOW_RESETLOGS_CORRUPTION=TRUE
_CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU10_1912826470$,_SYSSMU10_84651485$,
_SYSSMU11_2656753586$,_SYSSMU12_2886358909$,
_SYSSMU1_2986795754$,_SYSSMU13_718924942$,
_SYSSMU1_4289064447$,_SYSSMU14_3114789169$,
_SYSSMU15_996261396$,_SYSSMU16_1415326701$,
_SYSSMU17_2055763971$,_SYSSMU18_3698054671$,
_SYSSMU19_3843065260$,_SYSSMU20_4176760040$,
_SYSSMU2_346913448$,_SYSSMU2_3741593945$,
_SYSSMU3_219912871$,_SYSSMU3_2414309367$,
_SYSSMU4_1372950691$,_SYSSMU4_2796668278$,
_SYSSMU5_1189263717$,_SYSSMU5_3414239920$,
_SYSSMU6_2463593703$,_SYSSMU6_3524683480$,
_SYSSMU7_1565166063$,_SYSSMU7_2494227896$,
_SYSSMU8_2615489449$,_SYSSMU8_625026625$,
_SYSSMU9_3163463872$,_SYSSMU9_4094185854)
_allow_error_simulation=true

 

3. 히든 파라미터를 적용하고 DB startup

SQL> shutdown immediate
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.
SQL> startup 
ORACLE instance started.

Total System Global Area 1610612736 bytes
Fixed Size                  2096632 bytes
Variable Size             989856264 bytes
Database Buffers          603979776 bytes
Redo Buffers               14680064 bytes
Database mounted.
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


SQL> alter database open resetlogs;

 

4. Skip한 언두를 지우고 새로 생성하는 작업을 수행한다.

SQL> create undo tablespace UNDO2 datafile '/data/app/oracle/datafile/ORCL/undotbs02.dbf' size 2g;

Tablespace created.

SQL> alter tablespace UNDOTBS1 offline;

Tablespace altered.

SQL> drop tablespace UNDOTBS1 including contents and datafiles;

Tablespace dropped.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>

파라미터 파일의 내용 중 일부를 아래와 같이 변경한다.
*.undo_management='AUTO'
#*.undo_management='MANUAL'
*.undo_tablespace='UNDO2'
#*.undo_tablespace='UNDOTBS01'
*.user_dump_dest='/data/app/oracle/admin/ORCL/udump'
#_ALLOW_RESETLOGS_CORRUPTION=TRUE
#_CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU10_1912826470$,_SYSSMU10_84651485$,
#_SYSSMU11_2656753586$,_SYSSMU12_2886358909$,
#_SYSSMU1_2986795754$,_SYSSMU13_718924942$,
#_SYSSMU1_4289064447$,_SYSSMU14_3114789169$,
#_SYSSMU15_996261396$,_SYSSMU16_1415326701$,
#_SYSSMU17_2055763971$,_SYSSMU18_3698054671$,
#_SYSSMU19_3843065260$,_SYSSMU20_4176760040$,
#_SYSSMU2_346913448$,_SYSSMU2_3741593945$,
#_SYSSMU3_219912871$,_SYSSMU3_2414309367$,
#_SYSSMU4_1372950691$,_SYSSMU4_2796668278$,
#_SYSSMU5_1189263717$,_SYSSMU5_3414239920$,
#_SYSSMU6_2463593703$,_SYSSMU6_3524683480$,
#_SYSSMU7_1565166063$,_SYSSMU7_2494227896$,
#_SYSSMU8_2615489449$,_SYSSMU8_625026625$,
#_SYSSMU9_3163463872$,_SYSSMU9_4094185854)
#_allow_error_simulation=true

 

P.S 추가적인 히든 파라미터

_OFFLINE_ROLLBACK_SEGMENTS

 

P.S Undo Tablespace를 변경할 경우 SYSTEM Tablespace에 Active 한 Rollback Segment가 남을 수 있다. 이 경우 아래의 방법으로 확인할 수 있다.

strings system01.dbf | grep _SYSSMU | cut -d $ -f 1 | sort -u

 

 

출처 : http://www.acehints.com/2012/02/database-recovery-from-corrupted.html

위로