불완전복구 (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
******* 임시경로에 자료복구확인 ********