논리적 장애 복구 : 시간기반 불완전 복구

                 : drop update delete trunc 관련 장애 다 고칠수 있다.
 


○ 상황
a.dbf 테이블 스페이스의 abc테이블을 3일 11:59:59 시점으로 복구 하고자 한다.
 



1. DB끄고, 장애나기 이전에 백업해 놓은 모든 DATAFILE들을 restore (SCN100)
 
2. Mount상태에서 복구명령
SQL> recover database until time '복구원하는시간YYYY-MM-DD:HH24:MI:SS';
 
  3일 11:59:59으로 복구해놓고 DB open 하려하니 올라오지 않는다.
  (이유 : DATAFILE(104번), redo(108번), control(108번) )

 
3. SCN을 동기화 시켜줘야 한다.
SQL> alter database open resetlogs;
 
※ resetlogs 오픈은 redo log와 control file에 영향을 준다.
  - control file : 현재 정보 지워버리고 DATAFILE과 동기화 시켜준다.
  - redo log : 로그파일이 있을 경우 초기화 시켜서 0 0 1(Current)로 만든다.
               로그파일이 없을 경우 재생성
 

  
!!문제점 : 한번에 못 맞추면 복구 불가 (이미 redo log 초기화 → archive log 안쓰는 상태)
           성공하더라도 복구시점 이후 데이터 날림
           → 쓰면 안되는 방법
 
 


!!대안 : 새로운 경로에 DATAFILE, redo log, control file 가지고 와서 작업한다.
         절대 원본 건드리면 안된다.

         ex) 복구 하다가 정 안되면 원래대로 해달라고 요구하는 경우도 있ㄷ.
 
 
!!관건 : 시간 알아 내는 것
          (시간이 들어있는 파일 - redo log file)
 



실습가정 : 복구할 시간을 정확히 알고 있다고 가정한다.
           차후 redo log file 분석하는법 배우기.
 



=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-개인실습1
 
drop table 명령으로 삭제된 table 복구하기
 
 
백업 및 장애과정---->>>>>>>>>>>>>>
 
1. 현재 상태 확인
SQL> select tablespace_name, bytes/1024/1024 MB, file_name
  2  from dba_data_files;
 
SQL> select a.group#, a.member, b.status
  2  from v$logfile a, v$log b
  3  where a.group#=b.group#
  4  order by 1;
 
SQL> select name from v$controlfile;
 
 
 
2. 현재 상태 DATAFILE 백업
 
SQL> shutdown immediate;
 
SQL> !
$ cp /home/oracle/oradata/testdb/*.dbf /data/backup/close/
 
SQL> startup
 
 
 
3. 테이블 생성
 
SQL> create table scott.test01 (no number, hdate date) tablespace test;
SQL> insert into scott.test01 values (1,sysdate);
SQL> insert into scott.test01 values (2,sysdate);
SQL> insert into scott.test01 values (3,sysdate);
SQL> commit;
SQL> select * from scott.test01
        NO HDATE
---------- ------------
         1 02-FEB-12
         2 02-FEB-12
         3 02-FEB-12
 
 
4. 현재시간 조회 (복구할 시점)
SQL> select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') from dual;
SQL> save tt.sql
 
TO_CHAR(SYSDATE,'YYYY-MM-DD:HH24:MI:SS
--------------------------------------
2012-02-02:15:38:39
 
 
SQL> insert into scott.test01 values (4,sysdate);
SQL> commit;
SQL> select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') from dual;
 
TO_CHAR(SYSDATE,'YYYY-MM-DD:HH24:MI:SS
--------------------------------------
2012-02-02:15:41:51
 
 
SQL> insert into scott.test01 values (5,sysdate);
SQL> commit;
SQL> select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') from dual;
 
TO_CHAR(SYSDATE,'YYYY-MM-DD:HH24:MI:SS
--------------------------------------
2012-02-02:15:43:08
 
 
 
SQL> select no, to_char(hdate, 'YYYY-MM-DD:HH24:MI:SS') time
  2  from scott.test01;
 
        NO TIME
---------- --------------------------------------
         1 2012-02-02:15:35:30
         2 2012-02-02:15:36:26
         3 2012-02-02:15:36:34
         4 2012-02-02:15:41:45
         5 2012-02-02:15:43:03
 
 
 
 
5. scott.test01 table이 지워지는 장애 발생
 
SQL> drop table scott.test01 purge;
 
SQL> @tt
 
TO_CHAR(SYSDATE,'YYYY-MM-DD:HH24:MI:SS
--------------------------------------
2012-02-02:15:46:14
 
SQL> select * from scott.test01;
조회안됨
 
 
 
 
복구과정---->>>>>>>>>>>>>>
원본 파일은 그대로 두고 임시경로를 복구 경로로 지정해서 복구
 → 실무에서 Table이 삭제된 시점을 정확히 알고 있지 못하기 때문
   : 원본으로 작업했다가 시점이 잘못되어 실패되면 redo log가 초기화 된 상태이기 때문에 복원못하게 된다.
실습임시경로 : /home/oracle/temp/
 
 
1. 복구에 필요한 파일들 임시 경로에 복원
 
①백업된 데이터파일
②현재 컨트롤파일
③현재 Redo log 파일
 
SQL> shutdown immediate;
 
①백업된 데이터파일
$ cp /data/backup/close/*.dbf /home/oracle/temp/
 
②현재 컨트롤파일
$ cp /home/oracle/oradata/testdb/*.ctl /home/oracle/temp/
 
③현재 Redo log 파일
$ cp /home/oracle/oradata/testdb/*.log /home/oracle/temp/
 
 
2. 컨트롤파일, DATAFILE, Redo log 파일 위치 변경하기
- 컨트롤파일
$ vi /home/oarcle/product/10g/dbs/inittestdb.ora
control_files='/home/oracle/temp/control01.ctl','/home/oracle/temp/control02.ctl','/home/oracle/temp/control03.ctl'
 
- DATAFILE
SQL> startup mount;
 
SQL> select name from v$controlfile;
SQL> select name from v$datafile;
 
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/undotbs01.dbf' to '/home/oracle/temp/undotbs01.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/users01.dbf' to '/home/oracle/temp/users01.dbf';
SQL> alter database rename file '/home/oracle/oradata/testdb/example01.dbf' to '/home/oracle/temp/example01.dbf';
SQL> alter database rename file '/home/oracle/oradata/testdb/test01.dbf' to '/home/oracle/temp/test01.dbf';
 
 
- Redo log
SQL> select member from v$logfile;
SQL> alter database rename file '/home/oracle/oradata/testdb/redo03_a.log' to '/home/oracle/temp/redo03_a.log';
SQL> alter database rename file '/home/oracle/oradata/testdb/redo03_b.log' to '/home/oracle/temp/redo03_b.log';
SQL> alter database rename file '/home/oracle/oradata/testdb/redo02_a.log' to '/home/oracle/temp/redo02_a.log';
SQL> alter database rename file '/home/oracle/oradata/testdb/redo02_b.log' to '/home/oracle/temp/redo02_b.log';
SQL> alter database rename file '/home/oracle/oradata/testdb/redo01_a.log' to '/home/oracle/temp/redo01_a.log';
SQL> alter database rename file '/home/oracle/oradata/testdb/redo01_b.log' to '/home/oracle/temp/redo01_b.log';
 
 
 
3. 복구하기
앞에 조회해 놓았던, scott.test01 Table이 drop 직전의 시간으로 복구하기
2012-02-02:15:43:08
 
 
SQL> recover database until time '2012-02-02:15:43:07';
 
switch log가 많아서 log가 Archive log file에 저장된경우 선택물음이 뜬다.
AUTO 입력후 엔터
 
SQL> alter database open;
에러 : 복구된DATAFILE의 SCN(과거시점), 복사해온 redo log,control file의 SCN(사용되었던 시점)이 다르기 때문에 open이 안된다.
 
SQL> alter database open resetlogs;
리두로그넘버를 초기화 한다.
 
 
복구 되었나 조회해 보기
SQL> select no, to_char(hdate, 'YYYY-MM-DD:HH24:MI:SS') time
  2  from scott.test01;
 
 
        NO TIME
---------- --------------------------------------
         1 2012-02-02:15:35:30
         2 2012-02-02:15:36:26
         3 2012-02-02:15:36:34
         4 2012-02-02:15:41:45
         5 2012-02-02:15:43:03
복구완료
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-개인실습1 끝
 
 
 
 
 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-개인실습2
 
drop table 명령으로 삭제된 table 복구하기
(일부 파일만 복원)

 

백업 및 장애과정---->>>>>>>>>>>>>> 
1. 현재 상태 확인
 
SQL> select name from v$datafile;
SQL> select name from v$controlfile;
SQL> select member from v$logfile;
 
 
2. 현재 상태 DATAFILE 백업
 
SQL> shutdown immediate;
SQL> !
$ cp /home/oracle/temp/*.dbf /data/backup/close/
$ cp /home/oracle/temp/*.log /data/backup/close/
$ cp /home/oracle/temp/*.ctl /data/backup/close/
$ exit
 
SQL> startup
 
 
3. 테이블 생성
SQL> create table scott.tt400 (no number) tablespace example;
SQL> insert into scott.tt400 values (1);
SQL> commit;
SQL> insert into scott.tt400 values (2);
SQL> commit;
SQL> insert into scott.tt400 values (3);
SQL> commit;
 
SQL> select * from scott.tt400;
 
 
 
4. 현재시간 조회 (복구할 시점)
SQL> select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') from dual;
 
 
TO_CHAR(SYSDATE,'YYYY-MM-DD:HH24:MI:SS
--------------------------------------
2012-02-02:17:20:08
 
 
5. scott.test01 table이 지워지는 장애 발생
SQL> drop table scott.tt400 purge;
SQL> select * from scott.tt400;
 
 
 
복구과정---->>>>>>>>>>>>>>
원본 파일은 그대로 두고 임시경로를 복구 경로로 지정해서 복구
- 필요테이블스페이스 : system01.dbf, sysaux01.dbf, undotbs01.dbf, example01.dbf(복구하고싶은 테이블들어있음)
실습임시경로 : /data/imsy/
 
 
1. 복구에 필요한 파일들 임시 경로에 복원
 
SQL> shutdown immediate;
 
①백업된 데이터파일(필요한 파일만)
 
SQL> !
$ mkdir /data/imsy
$ cp /data/backup/close/system01.dbf /data/imsy/
$ cp /data/backup/close/sysaux01.dbf /data/imsy/
$ cp /data/backup/close/undotbs01.dbf /data/imsy/
$ cp /data/backup/close/example01.dbf /data/imsy/
 
 
②현재 컨트롤파일
 
$ cp /home/oracle/temp/*.ctl /data/imsy/
 
③현재 Redo log 파일
 
$ cp /home/oracle/temp/*.log /data/imsy/
 
 
 
2. 컨트롤파일, DATAFILE, Redo log 파일 위치 변경하기
- 컨트롤파일
$ vi /home/oracle/product/10g/dbs/inittestdb.ora
*.control_files='/data/imsy/control03.ctl'
 
 
- DATAFILE
SQL> startup mount;
 
SQL> select name from v$controlfile;
SQL> select name from v$datafile;
 
SQL> alter database rename file '/home/oracle/oradata/testdb/system01.dbf' to '/data/imsy/system01.dbf';
SQL> alter database rename file '/home/oracle/oradata/testdb/sysaux01.dbf' to '/data/imsy/sysaux01.dbf';
SQL> alter database rename file '/home/oracle/oradata/testdb/undotbs01.dbf' to '/data/imsy/undotbs01.dbf';
SQL> alter database rename file '/home/oracle/oradata/testdb/example01.dbf' to '/data/imsy/example01.dbf';
 
SQL> alter database datafile '/home/oracle/oradata/testdb/users01.dbf' offline drop;
SQL> alter database datafile '/home/oracle/oradata/testdb/test01.dbf' offline drop;
 
SQL> select name,status from v$datafile;
 
 
- Redo log
SQL> alter database rename file '/home/oracle/oradata/testdb/redo03_a.log' to '/data/imsy/redo03_a.log';
SQL> alter database rename file '/home/oracle/oradata/testdb/redo03_b.log' to '/data/imsy/redo03_b.log';
SQL> alter database rename file '/home/oracle/oradata/testdb/redo02_a.log' to '/data/imsy/redo02_a.log';
SQL> alter database rename file '/home/oracle/oradata/testdb/redo02_b.log' to '/data/imsy/redo02_b.log';
SQL> alter database rename file '/home/oracle/oradata/testdb/redo01_a.log' to '/data/imsy/redo01_a.log';
SQL> alter database rename file '/home/oracle/oradata/testdb/redo01_b.log' to '/data/imsy/redo01_b.log';
 
SQL> select member from v$logfile;
 
 
3. 복구하기
앞에 조회해 놓았던, scott.test01 Table이 drop 직전의 시간으로 복구하기
2012-02-02:17:20:08
 
SQL> recover database until time '2012-02-02:17:20:07';
 
SQL> alter database open resetlogs;
 
SQL> select *from scott.tt400;
 
 
정리 : 특정 테이블만 복구하고 싶을때, 필요한 파일만 복사해 오고
       나머지 파일들은 mount 상태에서 offline drop 으로 복구에 사용 안하게 만든다.
 
 
 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-개인실습2 끝
 
Posted by 딩구르
,