불완전복구 (Incomplete Revocery) :
주의사항
1. 불완전복구 후 DB를 open하기 위해서는 resetlogs를 사용해야하므로, 한번 open하게 되면, 이전의 Archive log file들을 이용할 수 없습니다.
---> 복구 시 한번에 자기가 딱 원하는 시점으로 되돌리려면, 신내림을 받아야 합니다. 자기가 원하는 시점을 모르는 경우가 대부분이기 때문에, 원본 DB에서 하게 되면 복구시도를 한번밖에 할 수 없습니다.
--> 그래서 임시경로에 복사를 하고, DB셋팅을 다시 한 후(alter database rename), 원본파일들은 그대로 놔두고, 그 경로에서 복구를 시도합니다.
2. 불완전복구를 시도할 시 restore할 때, 예전 backup된 datafile과 현재 redolog file을 복사해서 사용해야합니다.
** ALTER DATABASE OPEN RESETLOGS; 를 실행하는 이유
; 복구시도 후 SCN#를 보게 되면, datafile의 SCN#와 redo log, control file SCN#가 다른 경우가 생깁니다.( 복구중에 SCN#를 고치지는 않으므로 restore할때, 어떤 파일들을 restore하느냐에 따라 다른 경우가 생김. )
이 SCN#들을 통일하기 위하여, alter database open resetlogs; 으로 DB를 OPEN하게 됩니다.
** RESETLOGS 하게 되면 일어나는 일들
; 요약하면, control file, redo log file(Archive log file들도) 들이 영향을 받습니다.
1. CONTROL FILE 의 SCN#를 DATAFILE SCN#기준으로 변경합니다.
2. Redo log file이 존재하면, file들을 초기화합니다.(존재하지 않으면, 새로 만듭니다.)
(resetlogs 한 시점 이전의 archive log file, redo log file은 없어도 되는 자료가 되어버립니다.)
*** 위와같은 특징들 때문에 위에서 설명한 주의사항대로 임시경로를 사용해서 복구를 시도해야 여러번 복구를 시도할 수 있습니다.
불완전복구 명령어
불완전복구 데모시나리오 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 후 자료가 살아났나확인하기
9. 원래 DB로 자료복구하기(export, import 이용, 파라미터파일도 변경)
불완전복구 데모시나리오 2 : 잘못된 tbs삭제를 복구하기
너무 길어서 새로 포스팅합니다. : http://gyh214.tistory.com/94
1. 장애가 난 시점까지가 아닌, 과거의 원하는 시점까지 데이터를 복구하는 것
2. 데이터 복구 후 DB Open 시에는 resetlogs 옵션을 반드시 사용하여야 한다.
3. 장애가 발생한 데이터파일만 과거시점으로 되돌리는 것이 아니라, 전체 데이터베이스를 과거 시점으로 되돌리는 작업이다.
4. resetlogs 옵션 사용 시 redolog file은 재생성 되거나 초기화 된다.
1. 불완전복구 후 DB를 open하기 위해서는 resetlogs를 사용해야하므로, 한번 open하게 되면, 이전의 Archive log file들을 이용할 수 없습니다.
---> 복구 시 한번에 자기가 딱 원하는 시점으로 되돌리려면, 신내림을 받아야 합니다. 자기가 원하는 시점을 모르는 경우가 대부분이기 때문에, 원본 DB에서 하게 되면 복구시도를 한번밖에 할 수 없습니다.
--> 그래서 임시경로에 복사를 하고, DB셋팅을 다시 한 후(alter database rename), 원본파일들은 그대로 놔두고, 그 경로에서 복구를 시도합니다.
2. 불완전복구를 시도할 시 restore할 때, 예전 backup된 datafile과 현재 redolog file을 복사해서 사용해야합니다.
** ALTER DATABASE OPEN RESETLOGS; 를 실행하는 이유
; 복구시도 후 SCN#를 보게 되면, datafile의 SCN#와 redo log, control file SCN#가 다른 경우가 생깁니다.( 복구중에 SCN#를 고치지는 않으므로 restore할때, 어떤 파일들을 restore하느냐에 따라 다른 경우가 생김. )
이 SCN#들을 통일하기 위하여, alter database open resetlogs; 으로 DB를 OPEN하게 됩니다.
** RESETLOGS 하게 되면 일어나는 일들
; 요약하면, control file, redo log file(Archive log file들도) 들이 영향을 받습니다.
1. CONTROL FILE 의 SCN#를 DATAFILE SCN#기준으로 변경합니다.
2. Redo log file이 존재하면, file들을 초기화합니다.(존재하지 않으면, 새로 만듭니다.)
(resetlogs 한 시점 이전의 archive log file, redo log file은 없어도 되는 자료가 되어버립니다.)
*** 위와같은 특징들 때문에 위에서 설명한 주의사항대로 임시경로를 사용해서 복구를 시도해야 여러번 복구를 시도할 수 있습니다.
불완전복구 명령어
SQL> alter database until time '2012-02-03:07:09:23'; <--- 시간기반 불완전 복구 SQL> alter database until cancel; <--- CANCEL기반 불완전복구(using backup controlfile옵션과 자주 쓰입니다.) ** USING BACKUP CONTROLFILE참고 : http://gyh214.tistory.com/93
불완전복구 데모시나리오 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 후 자료가 살아났나확인하기
9. 원래 DB로 자료복구하기(export, import 이용, 파라미터파일도 변경)
1. 백업 SQL> !sh ~/main_backup.sh set begin backup mode~~ real 0m1.863s user 0m0.122s sys 0m0.357s end begin backup mode-- start file copy.… real 1m7.170s user 0m0.127s sys 0m33.623s end file copy~ set end backup mode~~ real 0m1.967s user 0m0.030s sys 0m0.063s complete hot backup~!! ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ 2. 자료입력 후 commit한 후 시간확인 SQL> create table scott.t01(no number); Table created. SQL> insert into scott.t01 values(1); 1 row created. SQL> insert into scott.t01 values(2); 1 row created. SQL> commit; Commit complete. SQL> select to_char(sysdate,'rrrr-mm-dd:hh24:mi:ss') from dual; SYSDATE ------------------- 2012-02-06:16:46:59 ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ 3. log switch 몇번 후 DELETE(delete후 commit하고 자료가 없는지 확인) SQL> alter system switch logfile; System altered. SQL> / System altered. SQL> / System altered. SQL> // System altered. SQL> / System altered. SQL> / System altered. SQL> / System altered. SQL> select * from scott.t01; NO ---------- 1 2 SQL> delete from scott.t01; 2 rows deleted. SQL> commit; Commit complete. SQL> alter system switch logfile; System altered. SQL> / System altered. SQL> / System altered. SQL> / System altered. SQL> select * from scott.t01; no rows selected <---- 실수로 인한 삭제확인 ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ 4. 현재 DB의 파일 경로들을 살펴보기 SQL> select TABLE_NAME, TABLESPACE_NAME from dba_tables 2 where table_name ='T01'; <---- 어떤 파일을 복구해야 되나 확인 TABLE_NAME TABLESPACE_NAME ------------------------------ ------------------------------ T01 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 /home/oracle/oradata/testdb/example01.dbf 2 SYSAUX /home/oracle/oradata/testdb/sysaux01.dbf 0 SYSTEM /home/oracle/oradata/testdb/system01.dbf 1 UNDOTBS1 /home/oracle/oradata/testdb/undotbs01.dbf 4 USERS /home/oracle/oradata/testdb/users01.dbf SQL> select member from v$logfile; MEMBER ---------------------------------------------------------------- /home/oracle/oradata/testdb/redo03.log /home/oracle/oradata/testdb/redo02.log /home/oracle/oradata/testdb/redo01.log SQL> select name from v$controlfile; NAME -------------------------------------------------- /home/oracle/oradata/testdb/control01.ctl ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ 5. shutdown 한 후 필요한 자료들을 임시경로에 restore하기(백업된 데이터파일, 현재 redolog, 현재 controlfile) SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> !mkdir ~/temp SQL> !ls /backup/open/2012-02-06-16-22-04 2012-02-06-16-22-04.ctl example01.dbf sysaux01.dbf system01.dbf undotbs01.dbf users01.dbf SQL> !cp -av /backup/open/2012-02-06-16-22-04/sys* ~/temp/ `/backup/open/2012-02-06-16-22-04/sysaux01.dbf' -> `/home/oracle/temp/sysaux01.dbf' `/backup/open/2012-02-06-16-22-04/system01.dbf' -> `/home/oracle/temp/system01.dbf' SQL> !cp -av /backup/open/2012-02-06-16-22-04/undo* ~/temp/ `/backup/open/2012-02-06-16-22-04/undotbs01.dbf' -> `/home/oracle/temp/undotbs01.dbf' SQL> !cp -av /backup/open/2012-02-06-16-22-04/users* ~/temp/ `/backup/open/2012-02-06-16-22-04/users01.dbf' -> `/home/oracle/temp/users01.dbf' SQL> !cp -av ~/oradata/testdb/control* ~/temp/ `/home/oracle/oradata/testdb/control01.ctl' -> `/home/oracle/temp/control01.ctl' SQL> !cp -av ~/oradata/testdb/*.log ~/temp/ `/home/oracle/oradata/testdb/redo01.log' -> `/home/oracle/temp/redo01.log' `/home/oracle/oradata/testdb/redo02.log' -> `/home/oracle/temp/redo02.log' `/home/oracle/oradata/testdb/redo03.log' -> `/home/oracle/temp/redo03.log' ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ 6. parameter에서 controlfile의 경로를 새로 지정하고 mount단계로 가서 alter database rename하기(복사하지 않는 자료들은 offline drop) SQL> !vi $ORACLE_HOME/dbs/inittestdb.ora *.control_files='/home/oracle/temp/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 '/home/oracle/oradata/testdb/system01.dbf' to '/home/oracle/temp/system01.dbf'; SQL> alter database rename file '/home/oracle/oradata/testdb/sysaux01.dbf' to '/home/oracle/temp/sysaux01.dbf'; SQL> alter database rename file '/home/oracle/oradata/testdb/undotbs01.dbf' to '/home/oracle/temp/undotbs01.dbf'; SQL> alter database rename file '/home/oracle/oradata/testdb/users01.dbf' to '/home/oracle/temp/users01.dbf'; Database altered. SQL> alter database datafile '/home/oracle/oradata/testdb/example01.dbf' offline drop; Database altered. (복사하지 않은 데이터파일 사용안함 으로 바꿔주기, 실제 DB는 너무 방대하므로 전체 DB를 다 복사하지 못하고, 필요한 파일만 복사하기 때문에 위와 같은 방법을 사용합니다.) SQL> alter database rename file '/home/oracle/oradata/testdb/redo01.log' to '/home/oracle/temp/redo01.log'; SQL> alter database rename file '/home/oracle/oradata/testdb/redo01.log' to '/home/oracle/temp/redo02.log'; SQL> alter database rename file '/home/oracle/oradata/testdb/redo01.log' to '/home/oracle/temp/redo03.log'; Database altered. ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ 7. 6번적용되었는지 확인하기 SQL> select name from v$controlfile; NAME ------------------------------------------------------------ /home/oracle/temp/control01.ctl SQL> select member from v$logfile; MEMBER ----------------------------------------------------- /home/oracle/temp/redo03.log /home/oracle/temp/redo02.log /home/oracle/temp/redo01.log SQL> l 1* select name, status from v$datafile SQL> / NAME STATUS --------------------------------------------- ------- /home/oracle/temp/system01.dbf SYSTEM /home/oracle/temp/undotbs01.dbf ONLINE /home/oracle/temp/sysaux01.dbf ONLINE /home/oracle/temp/users01.dbf ONLINE /home/oracle/oradata/testdb/example01.dbf OFFLINE <-- 필요없는 파일(복사하지 않은 파일) ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ 8. 복구시도 후 복구가 되었으면, open 후 자료가 살아났나확인하기 SQL> recover database until time '2012-02-06:16:46:59'; ORA-00279: change 739128 generated at 02/06/2012 16:22:02 needed for thread 1 ORA-00289: suggestion : /backup/arc/1_1_774410678.dbf ORA-00280: change 739128 for thread 1 is in sequence #1 Specify log: {=suggested | filename | AUTO | CANCEL} auto Log applied. Media recovery complete. SQL> alter database open resetlogs; Database altered. SQL> select * from scott.t01; NO ---------- 1 2 ******* 임시경로에 자료복구확인 ******** ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ 9. 원래 DB로 자료복구하기(export, import 이용, http://gyh214.tistory.com/92 참조) (파라미터파일을 원래 controlfile이 있는 곳으로 지정) SQL> !exp scott/tiger file='/home/oracle/temp/t01_table.dmp' tables=T01; Export: Release 10.2.0.5.0 - Production on Mon Feb 6 17:21:40 2012 Copyright (c) 1982, 2007, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options Export done in KO16MSWIN949 character set and AL16UTF16 NCHAR character set About to export specified tables via Conventional Path ... . . exporting table T01 2 rows exported Export terminated successfully without warnings. (EXPORT 완료) SQL> shutdown abort; ORACLE instance shut down. (이제는 더이상 필요가 없으므로, 어떤 방법으로들 shutdown하면 됩니다.) SQL> !vi $ORACLE_HOME/dbs/inittestdb.ora *.control_files='/home/oracle/oradata/testdb/control01.ctl' SQL> startup 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. Database opened. SQL> select name from v$controlfile; NAME --------------------------------------------- /home/oracle/oradata/testdb/control01.ctl SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /home/oracle/oradata/testdb/system01.dbf /home/oracle/oradata/testdb/undotbs01.dbf /home/oracle/oradata/testdb/sysaux01.dbf /home/oracle/oradata/testdb/users01.dbf /home/oracle/oradata/testdb/example01.dbf (원래 DB임을 확인) SQL> select * from scott.t01; no rows selected SQL> !imp scott/tiger file=/home/oracle/temp/t01_table.dmp ignore=y full=y; Import: Release 10.2.0.5.0 - Production on Mon Feb 6 17:30:54 2012 Copyright (c) 1982, 2007, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options Export file created by EXPORT:V10.02.01 via conventional path import done in KO16MSWIN949 character set and AL16UTF16 NCHAR character set . importing SCOTT's objects into SCOTT . importing SCOTT's objects into SCOTT . . importing table "T01" 2 rows imported Import terminated successfully with warnings. SQL> select * from scott.t01; NO ---------- 1 2 ******* 원래 DB에 자료복구확인 ******** (ignore=y : 이미 존재하는 테이블인 경우에도 에러무시하고 자료들을 다 넣어줌)
불완전복구 데모시나리오 2 : 잘못된 tbs삭제를 복구하기
너무 길어서 새로 포스팅합니다. : http://gyh214.tistory.com/94