case 1. offline되는 일반 테이블스페이스 복구

설명

  • 백업이후 생성된 테이블 abc도 redo log를 통해 데이터 복구 가능
  • data file 삭제 후에도 테이블 abc에 insert 가능 (파일이 없으나 checkpoint 수행시 에러 미발생)

조치 방법 

  • tablespace offline -> 백업파일이동 -> recover tablespace -> online

스크립트

  • 설정현황 체크
archive log list;
select tablespace_name,bytes/1024/1024 MB,file_name
from   dba_data_files ;
  • 복원 후 복구
!cp /data/backup/open/test01.dbf /oradata/EHR/ recover tablespace test;
alter tablespace test online;

예시

  • 더보기
    SQL> --사전백업
    SQL> alter tablespace test begin backup;
           Tablespace altered. 
    SQL> !cp /oradata/EHR/test01.dbf /data/backup/open
    SQL> alter tablespace test end backup; 
           Tablespace altered.
     
    SQL> --장애발생
    SQL> !rm -fr /oradata/EHR/test01.dbf
    SQL> create table abc (no number) tablespace test; 
         Table created. 
    SQL> insert into abc values (1);
    insert into abc values (2);
           1 row created. 
           1 row created. 
    SQL> commit; 
           Commit complete. 
    SQL> alter system checkpoint; 
           System altered.
    SQL> select * from abc; 
    NO
    ----------
    1
    2
     
    SQL> --장애확인
    SQL> alter tablespace test offline;
           Tablespace altered. 
    SQL> alter tablespace test online;
           alter tablespace test online
           *
           ERROR at line 1:
           ORA-01157: cannot identify/lock data file 5 - see DBWR trace file
           ORA-01110: data file 5: '/oradata/EHR/test01.dbf'
     
     
    SQL> --복원 후 복구
    SQL> !cp /data/backup/open/test01.dbf /oradata/EHR/ 
    SQL> recover tablespace test;
           Media recovery complete.
    SQL> alter tablespace test online; 
           Tablespace altered. 
    SQL> select * from abc; 
    NO
    ----------
    1
    2

case 2. offline 불가 테이블스페이스 장애 복구

설명

  • system/undo tablespace가 장애발생시 Shutdown을통해 복원 및 복구를 진행한다.

조치 방법 

  • Shutdown -> 백업파일이동 -> startup -> Recovery database-> database open

 예시

  • 더보기
    SQL> --테이블스페이스 system 내 테이블생성
    SQL> create table test1(no number) tablespace system;
    insert into test1 values (1);
    commit;
          Table created.
          1 row created. 
          Commit complete.
      
    SQL> --장애 발생 . datafile 소실
    SQL> !rm -fr /oradata/EHR/system01.dbf
     
    SQL> --db중지 -> 복원-> db 시작 ->복구
    SQL> alter tablespace system offline;
          alter tablespace system offline
          *
          ERROR at line 1:
          ORA-01541: system tablespace cannot be brought offline; shut down if necessary 
     
    SQL> shutdown immediate;
          Database closed.
          Database dismounted.
          ORACLE instance shut down.
     
    SQL> !cp /data/backup/close/system01.dbf /oradata/EHR/ 
    SQL> startup;
          ORACLE instance started. 
          Total System Global Area 1610612736 bytes
          Fixed Size 2096632 bytes
          Variable Size 385876488 bytes
          Database Buffers 1207959552 bytes
          Redo Buffers 14680064 bytes
          Database mounted.
          ORA-01113: file 1 needs media recovery if it was restored from backup, or END BACKUP if it was not
          ORA-01110: data file 1: '/oradata/EHR/system01.dbf'
     
    SQL> select status from v$instance;
          STATUS
          --------------------------------------------------
          MOUNTED
     
    SQL> recover database;
          Media recovery complete.
    SQL> alter database open; 
          Database altered.

case 3. 백업파일이 없을 경우

설명

  • 백업파일이 없는 테이블스페이스의 데이터파일이 삭제 되었을 경우 복원 
  • 해당 테이블스페이스의 생성부터 관련된 모든 변경사항이 현재 archivelog에 존재할 경우 

조치 방법 

  • tablespace offline -> 파일  재생성 (alter database create datafile as) ->  recover tablespace  -> online 

스크립트

  • 파일재생성
alter database create datafile '/oradata/EHR/haksa01.dbf' as '/oradata/EHR/haksa01.dbf'

 예시

  • 더보기
    SQL> --테이블스페이스 haksa 생성 및 테이블/데이터 인입
    SQL> create tablespace haksa datafile '/oradata/EHR/haksa01.dbf' size 5M;
           Tablespace created.
    SQL> create table student (no number) tablespace haksa;
           Table created.
    SQL> insert into student values (1);
           1 row created.
    SQL> commit;
           Commit complete.
    SQL> alter system checkpoint;
           System altered.
     
    SQL> --장애발생 (데이터파일 삭제)
    SQL> !rm -fr /oradata/EHR/haksa01.dbf
    SQL> insert into student values (2);
           1 row created.
    SQL> commit;
           Commit complete.
    SQL> alter system checkpoint;
           System altered.
     
    SQL> --장애발생확인
    SQL> alter tablespace haksa offline;
           Tablespace altered.
    SQL> alter tablespace haksa online;
           alter tablespace haksa online
           *
           ERROR at line 1:
           ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
           ORA-01110: data file 6: '/oradata/EHR/haksa01.dbf'
     
    SQL> --haksa 데이터파일을 재생성
    SQL> alter database create datafile '/oradata/EHR/haksa01.dbf' as '/oradata/EHR/haksa01.dbf' 
           Database altered.
    SQL> -- 복구
    SQL> recover tablespace users;
           Media recovery complete.
    SQL> alter tablespace users online; 
           Tablespace altered. 
    SQL> select * from student; 
           NO
           ----------
           1
           2

case 4. 임시경로를 이용한 긴급 복구

 설명

  • datafile 저장 디스크 장애+ 일부파일 백업본 미존재+ redo log/Arcive file 저장 디스크 정상 일 경우

조치 방법 

  • 3과 2의 장애상황 복구방법을 혼합하여 진행
  • Shutdown abort ->임시경로 생성->임시경로로 복원 (백업본 존재시) -> 파일경로 변경(백업본 존재)/파일 재생성(백업본 미존재) -> recover database->database open 

스크립트

  • datafile 경로 변경 (파일별 동일)
alter database rename file '/oradata/EHR/system01.dbf' to '/data/temp/system01.dbf';

case 5. 볼완전복구(시점복구)-update/delete/drop -테이블/데이터/데이터파일 수준

 설명

  • 이슈 (데이터 변경,테이블/유저 삭제 등) 발생 시간을 인지하고 해당 시점으로 임시경로에 복구
  • spfile을 사용중이고 shutdown이 된 상황에서 복구를 진행할 수 있기 때문에 평시 pfile 백업본을 만드는것도 필요함
  • alter database open resetlogs 사용시
    • data/control/redolog 파일의 checkpoint SCN이 맞지 않은 상태에서 db Open을 하기위해  각 파일에 resetlogs정보를 기록하며, 아래와 같기 때문에 복구완료시 다시 백업을 받는 것이 좋음
      • 모든  log의 sequence가 0 초기화되며 이전 생성된 Archive log file 사용 불가.
    • datafile의  checkpoint SCN은 Open시점의  SCN으로 업데이트
    • Dictionary에는 있지만 controlfile에 없는 datafile은  'MISSINGXXX'로 가짜 엔트리 생성

조치 방법 

  • 방법 1. 전체 datafile 복구
    • datafile 전체 복원 후 archive log를 통한 장애시점전까지 복구
    • redo log/control file은 현 시점의 파일을 임시경로로 복사하여 사용 (백업본  X)
    • (spfile사용시 shutdown전 controlfile 경로변경)->Shutdown ->임시경로 생성->임시경로로 복원 (백업본 datafile 복사 / 사용중인 controlfile과 redologfile  복사)->controlfile 경로변경 (pfile 사용시) -> startup mount -> datafile 경로변경 -> redologfile 경로변경 -> 복구 (recover database until time -> database open resetlogs) 
  •  방법 2. 대상 datafile 복구
    • 최소 필요파일 : system/undo/sysaux datafile + 복원필요 대상 datafile
    • 최소 필요파일 복원 후 archive log를 통한 장애시점전까지 복구
    • redo log/control file은 현 시점의 파일로 사용 (백업본  X)  
    • 방법1과 같이 진행하되  start mount ~  recover사이에 복구미대상(불필요파일) datafile offline처리 진행
  • 방법 3. 삭제시간을 모를경우
    • 유틸리티 logminer를 통해   redolog/Arcivelog파일에서 확인하는 방법이 있음 

스크립트

  • 상태조회
select a.file#,a.ts#,b.name,a.status,a.checkpoint_change#
from v$datafile a, v$tablespace b
where a.ts#=b.ts#;

show parameter control_file;
  •  
  • controlfile 경로변경 (sp 파일 사용중)
alter system set control_files = '/data/tmp/control01.ctl','/data/tmp/control02.ctl','/data/tmp/control03.ctl'   scope=spfile;
  • 복구미대상(불필요파일) datafile offline처리
alter database datafile '/oradata/EHR/haksa01.dbf' offline drop;
  • datafile 경로변경 (alter database rename file to)
alter database rename file '/oradata/EHR/system01.dbf' to '/data/temp/system01.dbf';
alter database rename file '/oradata/EHR/test01.dbf' to '/data/temp/system01.dbf';
이하 파일별 동일
  • redologfile 경로변경 (alter database rename file to)
alter database rename file '/oradata/EHR/redo01_a.log' to '/data/temp/redo01_a.log';
이하 파일별 동일
  • 복구 (recover database until time -> database open resetlogs)
recover database until time '2022-02-27:17:52:00';
alter database open resetlogs;

case 6. 볼완전복구(시점복구)- drop tablespace

설명

  • 5와 다르게 tablespace를 드랍할경우, controlfile에서 해당정보 삭제.
  • drop tablespace는 alert_SID.log에 기록되어 확인 가능.
    • tail -100 /app/oracle/product/10.2.0/db_1/rdbms/log/alert_EHR.log
  • 백업된 controlfile의 SCN이 redolog SCN보다 낮기 때문에 controlfile 백업본을 통해 recover하겠다는
    using backup controlfile을 추가
  • 하기 방법은 최소 파일복원( system/undo/sysaux + 복원필요 대상 datafile +controlfile)

조치 방법

  • 방법1. 백업된 controlfile 사용
    • (spfile사용시 shutdown전 controlfile 경로변경)->Shutdown ->임시경로 생성->임시경로로 복원 (백업본 datafile/controlfile)  ->controlfile 경로변경 (pfile 사용시) -> startup mount -> 복구미대상(불필요파일) datafile offline처리->datafile 경로변경 -> redologfile 경로변경 -> 불완전복구 (using backup controlfile-> ->database open resetlogs)
  • 방법2. redo/archive 정보를 통한 강제 복구 (controlfile 백업 미존재시)
    • 방법 1의 경로변경 완료 후,
    • 현재  Current상태 redolog 확인 -> 불완전복구 시도(using backup controlfile)  -> Specify log 입력창에 current redolog정보 입력($path/redofile명) -> datafile확인 ($path/UNNAMEDxxxxx) ->  datafile명변경  -> 불완전복구 시도(using backup controlfile)  -> Specify log 입력창에 current redolog정보 입력($path/redofile명)  -> open resetlogs 

스크립트

  • 불완전복구 (using backup controlfile)
recover database until time '2022-02-27:17:52:00' using backup controlfile;
alter database open resetlogs;

예시(일부 발췌) -방법2. : 현재  Current상태 redolog 확인~datafile명변경 

  • 더보기
    --현재 Current상태 redolog 확인
    SQL> select a.group#,a.member,b.bytes/1024/1024 MB,b.archived,b.status
    from v$logfile a, v$log b
    where a.group#=b.group#
    order by 1,2;
          GROUP# MEMBER MB ARC STATUS
          ---------- -------------------------------------------------- ---------- --- --------------------------------------
          1 /oradata/EHR/redo01_a.log 5 NO CURRENT
          1 /oradata/EHR/redo01_b.log 5 NO CURRENT
          2 /oradata/EHR/redo02_a.log 5 YES INACTIVE
          2 /oradata/EHR/redo02_b.log 5 YES INACTIVE
          3 /oradata/EHR/redo03_a.log 5 YES ACTIVE
          3 /oradata/EHR/redo03_b.log 5 YES ACTIVE
     
    --불완전복구 시도(using backup controlfile)
    SQL> recover database until time '2022-02-27:17:52:00' using backup controlfile;
          ORA-00279: change 8892 generated at 2022-02-27:17:40:32 needed for thread 1
          ORA-00289: suggestion : /data/arc1/1_1_1072647549.arc
          ORA-00280: change 8892 for thread 1 is in sequence #3
     
          Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
    --Specify log 입력창에 current redolog정보 입력($path/redofile명)
    /oradata/EHR/redo03_a.log <-(입력)
          ORA-00283: recovery session canceled due to errors
          ORA-01244:
          ORA-01110: data file 6: '/oradata/EHR/test01.dbf'
     
    --datafile확인 ($path/UNNAMEDxxxxx)
    SQL> select name from v$datafile;
          NAME
          --------------------------------------------------
          /oradata/EHR/system01.dbf
          /oradata/EHR/undotbs01.dbf
          /oradata/EHR/sysaux01.dbf
          /oradata/EHR/users01.dbf
          /oradata/EHR/haksa01.dbf
          /oradata/EHR/UNNAMED00006
     
    --datafile명변경
    SQL> alter database create datafile '/oradata/EHR/UNNAMED00006' as '/oradata/EHR/test01.dbf'

case 7. 운영중인 undo tablepsace 장애 복구

 설명

  • 운영환경에서는 undo tablespace 내 rollback segment가 active로 존재할 수 있기 때문에
    active 정보를 사전 확인 후, 오프라인 처리가 필요함
  • spfile에서는 해당 설정이 되지 않아 (구글링시 못찾음) pfile로 변경하여 편집이 필요

조치 방법

  • 사용중인 롤백세그먼트 확인 (기록필요) -->   신규 undo tablespace 생성--> 신규 undo tablespace 등록->  pfile 생성(spfile사용시)  -> shutdown abort -> spfile 백업 및 삭제 ->  pfile 변경 (undo_management='manual', 롤백세그먼트 offline 추가) ->  startup (실패,mount) -> 삭제된 datafile offline처리 -> database open->기존 테이블스페이스 삭제 -> shutdown immediate->pfile 설정 롤백  -> startup -> spfile 생성  -> shutdown immediate  -> startup

 스크립트

  • 사용중인 롤백세그먼트 확인
select s.sid,s.serial#,s.username,r.name "ROLLBACK SEG"
from v$session s,v$transaction t,v$rollname r
where s.taddr=t.addr and t.xidusn=r.usn;
  • 신규  undo tablespace  맵핑
alter system set undo_tablespace=undo01;
  • parameterfile 수정  (pfile VIedit)
undo_management =auto -- manual -> auto 변경
#_offline_rollback_segments=(_SYSSMU3$) -- 주석처리

 예시

  • 더보기
    SQL> --undo 상태 체크
    SQL> select a.name "TS_NAME",b.name "FILE_NAME",b.status
    from v$tablespace a, v$datafile b
    where a.ts#=b.ts# and a.name='UNDOTBS1'; 
            TS_NAME FILE_NAME STATUS
            --- -------------------------------------------------- --------------------------------------------------
            UNDOTBS1 /oradata/EHR/undotbs01.dbf ONLINE
     
    SQL> --undo 설정 체크
    SQL>show parameter undo; 
            NAME TYPE VALUE
            ------------------------------------ ----------- ------------------------------
            undo_management string AUTO
            undo_retention integer 900
            undo_tablespace string UNDOTBS1
     
    SQL> --사용중인 롤백세그먼트 확인
    SQL> select s.sid,s.serial#,s.username,r.name "ROLLBACK SEG"
    from v$session s,v$transaction t,v$rollname r
    where s.taddr=t.addr and t.xidusn=r.usn;
            no rows selected
     
    SQL> --사용중인 롤백세그먼트 확인 (타 계정으로 insert문 실행 후)
    SQL> select s.sid,s.serial#,s.username,r.name "ROLLBACK SEG"
    from v$session s,v$transaction t,v$rollname r
    where s.taddr=t.addr and t.xidusn=r.usn; 
            SID SERIAL# USERNAME ROLLBACK SEG
            ---------- ---------- ------------------------------ ------------------------------
            158 45 DBA_JYOH _SYSSMU3$
     
    SQL> --장애(undofile삭제)
    SQL> !rm -fr /oradata/EHR/undotbs01.dbf
     
    SQL> -- 신규 undo tablespace 생성
    SQL> create undo tablespace undo01 datafile '/oradata/EHR/undo01.dbf' size 10M; 
            Tablespace created.
     
    SQL> --신규 undo tablespace 등록
    SQL> alter system set undo_tablespace=undo01; 
            System altered.
     
    SQL> --기존 테이블스페이스 삭제 시도 (실패)
    SQL> drop tablespace undotbs1;
            *
            ERROR at line 1:
            ORA-30013: undo tablespace 'UNDOTBS1' is currently in use
     
    SQL> --shutdown (immediate 불가)
    SQL> shutdown abort;
            ORACLE instance shut down.
    SQL> !
     
    SQL> --Mount ( undo_management 변경 & pfile 생성)
    SQL> startup mount
            ORACLE instance started.
     
            Total System Global Area 1610612736 bytes
            Fixed Size 2096632 bytes
            Variable Size 385876488 bytes
            Database Buffers 1207959552 bytes
            Redo Buffers 14680064 bytes
            Database mounted.
     
    SQL> -- undo_management : auto ->manual 변경
    SQL> alter system set undo_management='manual' scope=spfile;
            System altered.
     
    SQL> --pfile생성
    SQL> create pfile ='/app/oracle/product/10.2.0/db_1/dbs/initEHR.ora' from spfile;
            File created.
     
    SQL> shutdown immediate;
            ORA-01109: database not open
            Database dismounted.
            ORACLE instance shut down.
     
    SQL> !
    [localhost.localdomain:] --spfile 백업 및 삭제
    [localhost.localdomain:/app/oracle/product/10.2.0/db_1/dbs]cp spfileEHR.ora spfileEHR.ora_220227
    [localhost.localdomain:/app/oracle/product/10.2.0/db_1/dbs]rm spfileEHR.ora
    [localhost.localdomain:/app/oracle/product/10.2.0/db_1/dbs]vi pfile.ora
    [localhost.localdomain:] --롤백세션 offline 지정 (_offline_rollback_segments=(_SYSSMU3$))
    [localhost.localdomain:/app/oracle/product/10.2.0/db_1/dbs]exit
            exit
     
    SQL> startup
            ORACLE instance started.
            Total System Global Area 1610612736 bytes
            Fixed Size 2096632 bytes
            Variable Size 385876488 bytes
            Database Buffers 1207959552 bytes
            Redo Buffers 14680064 bytes
            Database mounted.
            ORA-01157: cannot identify/lock data file 2 - see DBWR trace file
            ORA-01110: data file 2: '/oradata/EHR/undotbs01.dbf'
     
    SQL> show parameter undo;
            NAME TYPE VALUE
            ------------------------------------ ----------- ------------------------------
            undo_management string AUTO
            undo_retention integer 900
            undo_tablespace string UNDO01
     
    --삭제된 datafile offline처리
    SQL> alter database datafile '/oradata/EHR/undotbs01.dbf' offline drop;
            Database altered.
    SQL> alter database open;
            Database altered.
     
    SQL> --기존 테이블스페이스 삭제 시도
    SQL> drop tablespace undotbs1 including contents and datafiles;
            Tablespace dropped.
     
    SQL> shutdown immediate;
            Database closed.
            Database dismounted.
            ORACLE instance shut down.
     
    SQL> !
    [localhost.localdomain:/app/oracle]vi /app/oracle/product/10.2.0/db_1/dbs/initEHR.ora
    [localhost.localdomain:/app/oracle]-- 주석처리 #_offline_~ 및 manual ->auto 변경
    [localhost.localdomain:/app/oracle]exit
            exit
     
    SQL> startup
            ORACLE instance started.
            Total System Global Area 1610612736 bytes
            Fixed Size 2096632 bytes
            Variable Size 385876488 bytes
            Database Buffers 1207959552 bytes
            Redo Buffers 14680064 bytes
            Database mounted.
            Database opened.
 

+ Recent posts