불완전복구 (Incomplete Revocery) 

  1. 장애가 난 시점까지가 아닌, 과거의 원하는 시점까지 데이터를 복구하는 것
  2. 데이터 복구 후 DB Open 시에는 resetlogs 옵션을 반드시 사용
  3. 장애가 발생한 데이터파일만 과거시점으로 되돌리는 것이 아니라, 전체 데이터베이스를 과거 시점으로 되돌리는 작업
     -> datafile은 백업본을 사용하지만 log file들은 현재 것들을 사용해야함
  4. resetlogs 옵션 사용 시 redolog file은 재생성 되거나 초기화 됨
     -> 임시경로에 백업본을 복사하고 control file 위치 및 데이터파일 위치, 리두로그 위치 변경 (alter database rename ) 후 복구 시도
 
 

** ALTER DATABASE OPEN RESETLOGS 를 실행하는 이유

 복구시도 후 SCN#를 보게 되면 datafile의 SCN#와 redo log, control file SCN#가 다른 경우가 생김.
 이 SCN#들을 통일하기 위함
 

** RESETLOGS로 DB open 하면

1. CONTROL FILE 의 SCN#를 DATAFILE SCN#기준으로 변경
2. Redo log file 초기화
--> 임시경로에 복사 후 복구 시도 필수 
 

불완전복구 명령어

SQL> alter database until time '2017-02-12:07:09:23';   <--- 시간기반 불완전 복구
SQL> alter database until cancel;   <--- CANCEL기반 불완전복구(using backup controlfile옵션과 자주 쓰임)
 

 

불완전복구 데모시나리오 1 : 잘못된 delete를 복구하기

시나리오 순서
 
1. 백업
2. 자료입력 후 commit한 후 시간확인
3. log switch 몇번 후 DELETE(delete후 commit하고 자료가 없는지 확인)
4. 현재 DB의 파일 경로들을 살펴보기
5. shutdown 한 후 필요한 자료들을 임시경로에 restore하기(백업된 데이터파일, 현재 redolog, 현재 controlfile)
6. parameter에서 controlfile의 경로를 새로 지정하고 mount단계로 가서 alter database rename하기(복사하지 않는 자료들은 offline drop)
7. 6번적용되었는지 확인하기
8. 복구시도 후 복구가 되었으면, open 후 자료가 살아났나확인하기
 
 
 
1. 백업
SQL> !sh ~/hot_backup.sh
 
2. 자료입력 후 commit한 후 시간확인
 
SQL> create table dohee.test(no number);
 
Table created.
 
SQL> insert into dohee.test values(1);
 
1 row created.
 
SQL> insert into dohee.test values(2);
 
1 row created.
 
SQL> commit;
 
Commit complete.
 
SQL> select to_char(sysdate,'rrrr-mm-dd:hh24:mi:ss') from dual;
 
SYSDATE
-------------------
2017-02-12:08:33:16
 
 
 
3. log switch  후 DELETE 
 
SQL> alter system switch logfile;
 
System altered.
 
SQL> /
 
System altered.
 
 
 
SQL> select * from dohee.test;
 
        NO
----------
         1
         2
 
SQL> delete from dohee.test;     --> 실수로 데이터 삭제
2 rows deleted.
 
SQL> commit;
 
Commit complete.
 
SQL> alter system switch logfile;
 
System altered.
 
SQL> /
 
System altered.
 
SQL> select * from dohee.test;
 
no rows selected       <---- 실수로 인한 삭제확인
 
------------------------------------------------------------
 
4. 현재 DB의 파일 경로들을 살펴보기
 
SQL> select TABLE_NAME, TABLESPACE_NAME from dba_tables
  2  where table_name ='TEST';       <---- 어떤 파일을 복구해야 되나 확인
 
TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TEST                            USERS
 
 
  1  select a.TS#, b.NAME tbs_name, a.NAME file_name
  2  from v$datafile a, v$tablespace b
  3  where a.ts#=b.ts#
  4* order by 2,3
 
SQL> /
 
       TS# TBS_NAME                       FILE_NAME
---------- ------------------------------ ---------------------------------------------
         6 EXAMPLE                        /engn001/db79552/data001/TESTDB2/example01.dbf
         2 SYSAUX                         /engn001/db79552/data001/TESTDB2/sysaux01.dbf
         0 SYSTEM                         /engn001/db79552/data001/TESTDB2/system01.dbf
         1 UNDOTBS1                       /engn001/db79552/data001/TESTDB2/undotbs01.dbf
         4 USERS                          /engn001/db79552/data001/TESTDB2/users01.dbf
 
 
 
SQL> select member from v$logfile;
 
MEMBER
----------------------------------------------------------------
/engn001/db79552/data001/TESTDB2/redo03.log
/engn001/db79552/data001/TESTDB2/redo02.log
/engn001/db79552/data001/TESTDB2/redo01.log
 
 
 
SQL> select name from v$controlfile;
 
NAME
--------------------------------------------------
/engn001/db79552/data001/TESTDB2/control01.ctl
 
 
5. shutdown 한 후 필요한 자료들을 임시경로에 restore하기(백업된 데이터파일, 현재 redolog, 현재 controlfile)
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
 
SQL> !mkdir ~/temp
 
SQL> !ls /engn001/db79552/backup/
 example01.dbf  sysaux01.dbf  system01.dbf  undotbs01.dbf  users01.dbf
 
SQL> !cp  /engn001/db79552/backup/*.dbf /engn001/db79552/imsy/
 
SQL> !cp /engn001/db79552/data001/testdb2/control*  /engn001/db79552/imsy/
 
SQL> !cp /engn001/db79552/testdb/*.log   ~/temp/
 
------------------------------------------------------------
------------------------------------------------------------
 
6. parameter에서 controlfile의 경로를 새로 지정하고
mount단계로 가서 alter database rename하기 (복사하지 않는 자료들은 offline drop)
 
SQL> !vi $ORACLE_HOME/dbs/inittestdb2.ora
*.control_files='/engn001/db79552/imsy/control01.ctl'
 
 
SQL> startup mount
ORACLE instance started.
 
Total System Global Area  167772160 bytes
Fixed Size                  1272600 bytes
Variable Size              96470248 bytes
Database Buffers           67108864 bytes
Redo Buffers                2920448 bytes
Database mounted.
 
SQL> alter database rename file '/engn001/db79552/data001/TESTDB2/system01.dbf' to '/engn001/db79552/imsy/system01.dbf';
SQL> alter database rename file '/engn001/db79552/data001/TESTDB2/sysaux01.dbf' to '/engn001/db79552/imsy/sysaux01.dbf';
SQL> alter database rename file '/engn001/db79552/data001/TESTDB2/undotbs01.dbf' to '/engn001/db79552/imsy/undotbs01.dbf';
SQL> alter database rename file '/engn001/db79552/data001/TESTDB2/users01.dbf' to '/engn001/db79552/imsy/users01.dbf';
 
Database altered.
 
SQL> alter database datafile '/engn001/db79552/data001/TESTDB2/example01.dbf' offline drop;
 
Database altered.
 
*복사하지 않은 데이터파일 사용안함 으로 바꿈. 
실제 DB는 매우 크므로 필요한 파일만 복사하기 때문에 위와 같은 방법을 사용
 
SQL> alter database rename file '/engn001/db79552/data001/TESTDB2/redo01.log' to '/engn001/db79552/imsy/redo01.log';
SQL> alter database rename file '/engn001/db79552/data001/TESTDB2/redo01.log' to '/engn001/db79552/imsy/redo02.log';
SQL> alter database rename file '/engn001/db79552/data001/TESTDB2/redo01.log' to '/engn001/db79552/imsy/redo03.log';
 
Database altered.
 
------------------------------------------------------------
------------------------------------------------------------
------------------------------------------------------------
 
7. 6번적용되었는지 확인하기
SQL> select name from v$controlfile;
 
NAME
------------------------------------------------------------
/engn001/db79552/imsy/control01.ctl
 
SQL> select member from v$logfile;
 
MEMBER
-----------------------------------------------------
/engn001/db79552/imsy/redo03.log
/engn001/db79552/imsy/redo02.log
/engn001/db79552/imsy/redo01.log
 
SQL> l
  1* select name, status from v$datafile
SQL> /
 
NAME                                          STATUS
--------------------------------------------- -------
/engn001/db79552/imsy/system01.dbf                SYSTEM
/engn001/db79552/imsy/undotbs01.dbf               ONLINE
/engn001/db79552/imsy/sysaux01.dbf                ONLINE
/engn001/db79552/imsy/users01.dbf                 ONLINE
/engn001/db79552/data001/TESTDB2/example01.dbf     OFFLINE  <-- 필요없는 파일(복사하지 않은 파일)
 
 
8. 복구시도 후 확인
 
SQL> recover database until time '2017-02-12:08:33:16';
ORA-00279: change 739128 generated at 02/12/2017 08:33:16 needed for thread 1
ORA-00289: suggestion : /engn001/db79552/logs/archive/1_1_774410678.dbf
ORA-00280: change 739128 for thread 1 is in sequence #1
 
 
Specify log: {<ret>=suggested | filename | AUTO | CANCEL}
auto
Log applied.
Media recovery complete.
SQL> alter database open resetlogs;
 
Database altered.
 
SQL> select * from dohee.test;
 
        NO
----------
         1
         2
 
******* 임시경로에 자료복구확인 ********