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/openSQL> alter tablespace test end backup;Tablespace altered.SQL> --장애발생SQL> !rm -fr /oradata/EHR/test01.dbfSQL> 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----------12SQL> --장애확인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 fileORA-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----------12
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.dbfSQL> --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 necessarySQL> 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 bytesFixed Size 2096632 bytesVariable Size 385876488 bytesDatabase Buffers 1207959552 bytesRedo Buffers 14680064 bytesDatabase mounted.ORA-01113: file 1 needs media recovery if it was restored from backup, or END BACKUP if it was notORA-01110: data file 1: '/oradata/EHR/system01.dbf'SQL> select status from v$instance;STATUS--------------------------------------------------MOUNTEDSQL> 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.dbfSQL> 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 fileORA-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----------12
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'로 가짜 엔트리 생성
- data/control/redolog 파일의 checkpoint SCN이 맞지 않은 상태에서 db Open을 하기위해 각 파일에 resetlogs정보를 기록하며, 아래와 같기 때문에 복구완료시 다시 백업을 받는 것이 좋음
조치 방법
- 방법 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.statusfrom v$logfile a, v$log bwhere a.group#=b.group#order by 1,2;GROUP# MEMBER MB ARC STATUS---------- -------------------------------------------------- ---------- --- --------------------------------------1 /oradata/EHR/redo01_a.log 5 NO CURRENT1 /oradata/EHR/redo01_b.log 5 NO CURRENT2 /oradata/EHR/redo02_a.log 5 YES INACTIVE2 /oradata/EHR/redo02_b.log 5 YES INACTIVE3 /oradata/EHR/redo03_a.log 5 YES ACTIVE3 /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 1ORA-00289: suggestion : /data/arc1/1_1_1072647549.arcORA-00280: change 8892 for thread 1 is in sequence #3Specify log: {<RET>=suggested | filename | AUTO | CANCEL}--Specify log 입력창에 current redolog정보 입력($path/redofile명)/oradata/EHR/redo03_a.log <-(입력)ORA-00283: recovery session canceled due to errorsORA-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.statusfrom v$tablespace a, v$datafile bwhere a.ts#=b.ts# and a.name='UNDOTBS1';TS_NAME FILE_NAME STATUS--- -------------------------------------------------- --------------------------------------------------UNDOTBS1 /oradata/EHR/undotbs01.dbf ONLINESQL> --undo 설정 체크SQL>show parameter undo;NAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_management string AUTOundo_retention integer 900undo_tablespace string UNDOTBS1SQL> --사용중인 롤백세그먼트 확인SQL> select s.sid,s.serial#,s.username,r.name "ROLLBACK SEG"from v$session s,v$transaction t,v$rollname rwhere s.taddr=t.addr and t.xidusn=r.usn;no rows selectedSQL> --사용중인 롤백세그먼트 확인 (타 계정으로 insert문 실행 후)SQL> select s.sid,s.serial#,s.username,r.name "ROLLBACK SEG"from v$session s,v$transaction t,v$rollname rwhere 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.dbfSQL> -- 신규 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 useSQL> --shutdown (immediate 불가)SQL> shutdown abort;ORACLE instance shut down.SQL> !SQL> --Mount ( undo_management 변경 & pfile 생성)SQL> startup mountORACLE instance started.Total System Global Area 1610612736 bytesFixed Size 2096632 bytesVariable Size 385876488 bytesDatabase Buffers 1207959552 bytesRedo Buffers 14680064 bytesDatabase 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 openDatabase 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]exitexitSQL> startupORACLE instance started.Total System Global Area 1610612736 bytesFixed Size 2096632 bytesVariable Size 385876488 bytesDatabase Buffers 1207959552 bytesRedo Buffers 14680064 bytesDatabase mounted.ORA-01157: cannot identify/lock data file 2 - see DBWR trace fileORA-01110: data file 2: '/oradata/EHR/undotbs01.dbf'SQL> show parameter undo;NAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_management string AUTOundo_retention integer 900undo_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]exitexitSQL> startupORACLE instance started.Total System Global Area 1610612736 bytesFixed Size 2096632 bytesVariable Size 385876488 bytesDatabase Buffers 1207959552 bytesRedo Buffers 14680064 bytesDatabase mounted.Database opened.
'Oracle > 백업과 복구' 카테고리의 다른 글
[논리적 백업/복구] IMPORT/EXPORT & DATAPUMP (0) | 2022.03.23 |
---|---|
[논리적 백업/복구] Flashback (0) | 2022.03.23 |
[물리적 백업/복구] 복구 redo log file (0) | 2022.03.23 |
[물리적 백업/복구] 백업 (0) | 2022.03.23 |
[물리적 백업/복구] RMAN (0) | 2022.03.23 |