Site icon DBA의 정석

오라클 DB 장애 케이스 별 복구 방법 – 사례 중심

Oracle Technical Service

오라클 DB 장애 케이스 복구 방법 사례

 

 

복구 절차/방법 기술서

 

여기에서는 오라클에서의 여러 가지 장애유형별로 복구절차에 대한 내용을 기술한다.

 

  1. Noarchivelog mode로 운영 중 datafile의 손실

 

  1. 사용자의 data를 포함하고 있는 경우
    1. 가장 최근의 offline full backup으로 부터 complete database – control files, data files, online redo log files– 를 restore한다.
    2. Startup database.
  2. Temporary 테이블스페이스의 경우

 

ORA-00202 : CONTROL FILE : ‘file name’ < – 손상된 file이름

ORA-00302 : limit of %s logs exceeded

ORA-00447 : fatal error in background process

 

 

  1. Shutdown abort
  2. Backup 컨트롤파일을 restore한다.
  3. Startup mount
  4. Recover database using backup controlfile;
  5. Alter database open resetlogs;

 

  1. Shutdown abort
  2. Background process를 기동한다.

SVRMGR> startup nomount;

  1. 이전에 생성된 create control file script를 이용하여 CREATE CONTROLFILE 명령어를 수행한다.
  2. Media recovery를 수행한다.

SVRMGR> recover database ;

  1. DB를 Open한다.

SVRMGR> alter database open;

 

 

 

ORA-00312 : online log 1 thread 1: ‘file name’

ORA-00316 : log 1 of thread 1, type %s in header is not log file

ORA-00321 : log 1 of thread 1, cannot update log file header

V$LOG의 status가 ‘STALE’ 혹은 ‘INVALID’인지를 확인해야 한다.

  1. Invalid 이거나 Stale 상태인 redo log member를 drop한다.

SVRMGR> alter database drop logfile member ‘file name’;

  1. Log member를 재 생성한다.

    SVRMGR> alter database add logfile member ‘file name’ to group 1;

 

  1. 손실된 log group을 drop하고 재 생성한다.

SVRMGR> alter database drop logfile group 1;

SVRMGR> alter database add logfile group 1 ‘log1RECO.dbf’ size 500k;

  1. 만약 성공하지 못하면, 다음의 과정을 수행한다.

Shutdown abort

Startup mount

손실된 redo log group을 삭제한다.

SVRMGR> alter database drop logfile group 1;

Alter database open ( Crash recovery )

  1. Shutdown abort
  2. Startup mount
  3. Alter database NoArchivelog
  4. 손실된 redo log를 삭제한다.

SVRMGR> alter database drop logfile group 1;

  1. Alter database Open ( Crash recovery )
  2. Shutdown normal
  3. Startup mount
  4. Alter database Archivelog
  5. Alter database Open

 

ORA-00312: online log 1 thread 1: ‘/users2/chey/RECO/oradata/log1RECO.dbf’

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

V$LOG와 V$LOGFILE을 통해 current log인지를 확인할 수 있다.

  1. Full database backup restore
  2. Startup mount
  3. Recover database until cancel
  4. Alter database open resetlogs
  5. Full database 백업을 한다.
예제)

$ cp backup/*.dbf /users2/chey/RECO/oradata/ <— Full database backup restore

SVRMGR> startup <– Database가 mount된 상태 ( startup mount )

ORACLE instance started.

Total System Global Area 16963012 bytes

Fixed Size 38868 bytes

Variable Size 16506352 bytes

Database Buffers 409600 bytes

Redo Buffers 8192 bytes

Database mounted.

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

ORA-00312: online log 1 thread 1: ‘/users2/chey/RECO/oradata/log1RECO.dbf’

ORA-01109: database not open

SVRMGR> recover database until cancel ; <– Incomplete recovery

Media recovery complete.

SVRMGR> alter database open ;

alter database open

*

ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

SVRMGR> alter database open resetlogs; <– RESETLOGS 를 사용하여 Open

Statement processed.

 

ORA-01157: cannot identify data file 1 – file not found

ORA-01110: data file 1: ‘/users2/chey/RECO/oradata/systRECO.dbf’

ORA-01578 : ORACLE data block corrupted (file # %s, block # %s)
  1. 손상된 Datafile restore
  2. Startup mount
  3. Alter database datafile ‘system01.dbf’ online;

    <– V$DATAFILE VIEW를 통해 file이 Online상태인지를 확인한다.

  4. Recover Database
  5. Alter database open

 

 

  1. 현재의 Temporary 테이블스페이스를 drop한다.

    SVRMGR> Drop tablespace TEMP including contents;

  2. 다른 Temporary 테이블스페이스를 생성한다.

    SVRMGR> Create tablespace TEMP datafile ‘temp01.dbf’ size 100m;

  3. 사용자에게 Temp 테이블스페이스 할당

SVRMGR> Alter user scott temporary tablespace TEMP;

 

  1. Index 테이블스페이스를 drop한다.
  2. 다른 Index 테이블스페이스를 생성한다.
  3. 테이블스페이스내의 모든 Index를 재 생성한다.

 

  1. 테이블을 재생성.
    1. Table의 export를 import한다.

    $ imp userid=system/manager tables=table_name file=exp

  2. 백업으로 부터 restore한 후 recover.
    1. 테이블스페이스를 Offline한다.
    2. Hot backup으로부터 restore한다.
    3. Autorecovery를 on으로 set.
    4. Recovery process를 수행한다.

      recover automatic tablespace APPL01.

      Alter tablespace APPL01 online.

예제 )

Alert.log에 다음과 같은 Error가 발생한다.

Errors in file /users2/chey/RECO/dump/dbwr_5757.trc:

ORA-01157: cannot identify data file 4 – file not found

ORA-01110: data file 4: ‘/users2/chey/RECO/oradata/usrRECO01.dbf’

ORA-07360: sfifi: stat error, unable to obtain information about file.

HP-UX Error: 2: No such file or directory

SVRMGR> select status,name from v$datafile where status != ‘ONLINE’ ;

STATUS NAME

———- —————————————————————

SYSTEM /users2/chey/RECO/oradata/systRECO.dbf

RECOVER /users2/chey/RECO/oradata/usrRECO01.dbf

    <- V$DATAFILE의 STATUS를 확인한다.

SVRMGR> alter tablespace USERS offline;

alter tablespace users offline

*

ORA-01191: file 4 is already offline – cannot do a normal offline

ORA-01110: data file 4: ‘/users2/chey/RECO/oradata/usrRECO01.dbf’

$ cp usrRECO01.bak /users2/chey/RECO/oradata/usrRECO01.dbf

    <— Hotbackup으로부터 USERS 테이블스페이스 datafile restore

SVRMGR> set autorecovery on

    <– Automatic recovery를 위해서 arhcive log는

     Init.ora의 LOG_ARCHIVE_DEST에 지정된 위치에 있어야 한다.

Autorecovery ON

SVRMGR> Recover tablespace USERS;

Statement processed.

SVRMGR> alter tablespace USERS online;

Statement processed.

 

 

 

 

 

(ㄱ) timestamp를 이용한 방법

 

사용 가능 여부 조회(undo_management = auto)

 

SQL> show parameter undo

NAME TYPE VALUE

———————————— ———– ——————————

undo_management string AUTO

undo_retention integer 1800

undo_tablespace string UNDOTBS1

 

권한 부여

SQL> grant execute on dbms_flashback to scott;

Grant succeeded.

 

현재 시간 조회

SQL> select systimestamp from dual ;

SYSTIMESTAMP

—————————————-

04-NOV-13 05.55.51.524776 PM +09:00

 

delete 작업

SQL> delete emp where deptno=20 ;

5 rows deleted.

 

commit

SQL> commit ;

Commit complete.

 

삭제 되었는지 조회

SQL> select empno from emp where deptno=20 ;

no rows selected

 

as of timestamp를 이용한 조회

SQL> select empno from emp as of timestamp(to_timestamp(’04-NOV-13 05.55.51′,’DD-MON-YY:HH24:MI:SS’)) where deptno=20 ;

 

EMPNO

———-

7369

7566

7788

7876

7902

 

현재 테이블에 있는지 다시 조회

SQL> select empno from emp where deptno=20 ;

no rows selected

 

as of timestamp를 이용해 insert

SQL> insert into emp select * from emp as of timestamp(to_timestamp(’04-NOV-13 05.55.51′,’DD-MON-YY:HH24:MI:SS’)) where deptno=20 ;

5 rows created.

 

commit

SQL> commit ;

Commit complete.

 

insert 작업 조회

SQL> select empno from emp where deptno=20 ;

 

EMPNO

———-

7369

7566

7788

7876

7902

 

 

SQL> conn scott/tiger

Connected.

SQL>

SQL>

SQL> select * from emp ;

14 rows selected.

 

SQL>

SQL> drop table emp ;

Table dropped.

 

SQL> commit ;

Commit complete.

 

SQL> select * from emp ;

select * from emp

*

ERROR at line 1:

ORA-00942: table or view does not exist

 

SQL> flashback table emp to before drop ;

Flashback complete.

 

SQL> select * from emp ;

14 rows selected

 

  1. 운영 DB 의 control file trace backup 하여 컨트롤 파일 생성 스크립작성
    1. alter database backup controlfile to trace ; => udump 에 가서 trace file 을 아래와 같이 수정한다.

      예)

      CREATE CONTROLFILE REUSE DATABASE “TECHDATA” RESETLOGS ARCHIVELOG

      MAXLOGFILES 192

      MAXLOGMEMBERS 3

      MAXDATAFILES 1024

      MAXINSTANCES 32

      MAXLOGHISTORY 4672

      LOGFILE

      GROUP 1 (

      ‘/dev/rredolog01’,

      ‘/dev/rredolog11’

      ) SIZE 1000M,

      GROUP 2 (

      ‘/dev/rredolog02’,

      ‘/dev/rredolog12’

      ) SIZE 1000M,

      GROUP 3 (

      ‘/dev/rredolog03’,

      ‘/dev/rredolog13’

      ) SIZE 1000M,

      GROUP 4 (

      ‘/dev/rredolog04’,

      ‘/dev/rredolog14’

      ) SIZE 1000M,

      GROUP 5 (

      ‘/dev/rredolog05’,

      ‘/dev/rredolog15’

      ) SIZE 1000M,

      GROUP 6 (

      ‘/dev/rredolog06’,

      ‘/dev/rredolog16’

      ) SIZE 1000M,

      GROUP 7 (

      ‘/dev/rredolog07’,

      ‘/dev/rredolog17’

      ) SIZE 1000M,

      GROUP 8 (

      ‘/dev/rredolog08’,

      ‘/dev/rredolog18’

      ) SIZE 1000M,

      GROUP 9 (

      ‘/dev/rredolog09’,

      ‘/dev/rredolog19’

      ) SIZE 1000M,

      GROUP 10 (

      ‘/dev/rredolog10’,

      ‘/dev/rredolog20’

      ) SIZE 1000M

      — STANDBY LOGFILE

      DATAFILE

      ‘/dev/rtd_vg01_rlvol30’

      ,’/dev/rtd_vg07_rlvol35′

      ,’/dev/rdata08_36′

      ,’/dev/rtd_vg01_rlvol31′

      ,’/dev/rtd_vg22_rlvol17′

      ,’/dev/rtd_vg16_rlvol2 ‘

      ,’/dev/rtd_vg07_rlvol7 ‘

      ,’/dev/rtd_vg07_rlvol32′

      ,’/dev/rtd_vg07_rlvol10′

      ,’/dev/rdata08_06′

      ,’/dev/rdata16_22′

      ,’/dev/rdata08_65′

      ,’/dev/rdata08_94′

      ,’/dev/rti_vg23_rlvol13′

      ,’/dev/rti_vg21_rlvol18′

      ,’/dev/rti_vg15_rlvol3 ‘

      ,’/dev/rti_vg15_rlvol7 ‘

      ,’/dev/rti_vg08_rlvol5 ‘

      ,’/dev/rti_vg08_rlvol1 ‘

      ,’/dev/rindex08_04′

      ,’/dev/rindex08_10′

      ,’/dev/rindex08_11′

      ,’/dev/rindex04_13′

      ,’/dev/rindex04_19′

      ,’/dev/rindex08_54′

      ,’/dev/rtd_vg17_rlvol11′

      ,’/dev/rtd_vg16_rlvol1 ‘

      ,’/dev/rtd_vg14_rlvol1 ‘

      ,’/dev/rtd_vg16_rlvol3 ‘

      ,’/dev/rtd_vg17_rlvol10′

      ,’/dev/rdata08_15′

      ,’/dev/rdata08_35′

      ,’/dev/rdata04_22′

      ,’/dev/rdata16_26′

      ,’/dev/rtd_vg01_rlvol35′

      ,’/dev/rtd_vg07_rlvol8 ‘

      ,’/dev/rtd_vg15_rlvol1 ‘

      ,’/dev/rtd_vg14_rlvol7 ‘

      ,’/dev/rtd_vg17_rlvol4 ‘

      ,’/dev/rtd_vg20_rlvol9 ‘

      ,’/dev/rdata04_15′

      ,’/dev/rdata04_19′

      ,’/dev/rdata16_30′

      CHARACTER SET KO16KSC5601

      ;

RAC => Single

컨트롤 파일 작성시는 테이블이 속한 TABLE, INDEX tablespace ,SYSTEM

Undo, redo, SYSAUX tablespace 포함한 datafile 을 위의 예처럼 열거한다

  1. 다른 DB 에서 init 파라미터를 만들어 startup nomount 한다.

    startup nomount pfile=’해당 경로명’ ;

    위의 컨트롤 파일 예처럼 control file 을 만든다. 컨트롤 파일을 만들면 자동으로 DB 는 Open 상태가 된다.

 

  1. 해당 시간 시점으로 복구

    SQL>Recover database until time ‘2009-11-09:15:41:11’ using backup controlfile ;

    RAC => single로 복구 하기 위해선 해당 archive 파일을 처음 명시하여 입력해야 한다.

    ( 주의 auto 하면 자동으로 아카이브 파일을 못 찾는다 RAC 일 때)

    해당 아카이브 모두 적용하고 데이터 베이스를 open 한다.

    alter database open resetlogs ;

    open 이후 alert log 를 보면 이상한 메시지들이 많이 떨어진다.

    무시하고 다음 hidden parameter 적용하고 DB 를 재 기동 하여 mount까지 하고 다시

    _no_recovery_through_resetlogs=TRUE

    alter database open resetlogs ; 하여 open 한다.

    < 참고 사항 >

    아카이브 파일이 많아 파일시스템이 부족할 경우 nfs 에 마운트 하여 아카이브를 restore 할 때는 마운트 옵션을 알맞게 줘야 한다. 또한 AIX 에서나 다른 UNIX 시스템에

    /etc/filesystems 에 nfs 마운트에 대한 정의를 해야 한다.

    예) /etc/filesystems

/oraarch:

dev = ‘172.18…….

vfs = jfs2

log = /dev/hd8

mount = true

options = rw

account = false

 

Exit mobile version