hot backup 중 대량의 DML 작업, 추후 해당 파일 깨졌을 시 어떻게 될까?

2012. 9. 23. 16:08Oracle/Oracle Recovery

반응형

제목과 같이 갑자기 의문이 들었다.

파일은 복사하는 중인데, 인서트는 계속 되고 있는 상황이 발생하였다.

이론적으로 생각하였을 때는 아카이브 파일을 불러와 복구가 되겠다는 생각은 들어지만..정말 그렇게 될까?ㅎㅎ


테스트를 해보자.

session 을 sys 와 scott 계정 2개를 열었다.


users 테이블스페이스를 제외한 나머지 테이블스페이스에 대해서는 미리 hotbackup을 진행 완료.

users 테이블스페이스를 남겨놓기 위해 alter database begin backup; 명령어를 사용하지 않고,

alter tablespace system begin backup; 명령어를 사용하였다.(참고로 작업환경은 윈도우에서 하였음.)


SQL> select * from v$backup;


     FILE# STATUS                CHANGE# TIME

---------- ------------------ ---------- --------

         1 NOT ACTIVE             175887 12/09/23

         2 NOT ACTIVE             175909 12/09/23

         3 NOT ACTIVE             175923 12/09/23

         4 NOT ACTIVE                  0                       <-- users 테이블스페이스

         5 NOT ACTIVE             175940 12/09/23


파일 용량이 적어 미리 잽싸게 scott 계정에서 dml 작업을 하기 위해 스크립트를 만들어주었다.

* sequence 생성

SQL> create sequence seq_hot

  2  start with 1

  3  increment by 1

  4  nomaxvalue

  5  nocycle

  6  ;


* scott_insert.sql

insert into temp_hot_table select seq_hot.nextval,'AA',sysdate from dual connect by level <= 100000;

commit;

select count(*) cnt,max(id) max_id from temp_hot_table;


불완전 복구가 되었을 시 어느 단계까지 복구가 되는지 확인을 하기 위해, 단계별로 insert를 수행함.


 순서

 sys

scott 

 1

  

 @scott_insert.sql
 cnt : 100000, max_id : 100000

 2

 alter tablespace users begin backup;


 3

 

 @scott_insert.sql
 cnt : 200000, max_id : 200000

 4

$copy D:\PROD\DATA2\ORADATA\USERS01.DBF D:\PROD\BACKUP\USERS01.DBF

 @scott_insert.sql
 cnt : 300000, max_id : 300000

 5

 alter tablespace users end backup;

 

 6

 

 @scott_insert.sql
 cnt : 400000, max_id : 400000

 7

 alter database backup controlfile to 'D:\PROD\BACKUP\control.bak';

 


SQL> select * from v$backup;


     FILE# STATUS                CHANGE# TIME

---------- ------------------ ---------- --------

         1 NOT ACTIVE             175887 12/09/23

         2 NOT ACTIVE             175909 12/09/23

         3 NOT ACTIVE             175923 12/09/23

         4 NOT ACTIVE             175961 12/09/23   <-- 백업이 완료 되었음.

         5 NOT ACTIVE             175940 12/09/23


백업은 완료가 되고, 해당 데이터 파일이 깨졌을 때의 상황을 만들자.


SQL> shutdown immediate;

데이터베이스가 닫혔습니다.

데이터베이스가 마운트 해제되었습니다.

ORACLE 인스턴스가 종료되었습니다.

SQL> $del D:\PROD\DATA2\ORADATA\USERS01.DBF


SQL> startup

ORACLE 인스턴스가 시작되었습니다.


Total System Global Area  612368384 bytes

Fixed Size                  1250428 bytes

Variable Size             171969412 bytes

Database Buffers          432013312 bytes

Redo Buffers                7135232 bytes

데이터베이스가 마운트되었습니다.

ORA-01157: 데이터 4 파일을 식별 또는 잠금 할 수 없습니다- DBWR 추적 파일을 보십시오

ORA-01110: 4 데이터 파일: 'D:\PROD\DATA2\ORADATA\USERS01.DBF'


데이터 파일이 깨져 복구를 해야하는 단계이다.


SQL> alter database datafile 4 offline;


데이타베이스가 변경되었습니다.


SQL> alter database open;


데이타베이스가 변경되었습니다.


SQL> $copy d:\PROD\backup\users01.dbf d:\PROD\data2\oradata\users01.dbf  : hotbackup 한 파일로 복원하자.

        1개 파일이 복사되었습니다.


SQL> recover datafile 4

매체 복구가 완료되었습니다.    <-- 데이터가 적다보니 아카이브 파일을 만들어 지지 않아 필요가 없나보다. 바로 복구가 된다.

SQL> alter database datafile 4 online;


데이타베이스가 변경되었습니다.


SQL> conn scott/tiger

연결되었습니다.

SQL> select count(*), max(id) from temp_hot_table;


  COUNT(*)    MAX(ID)

---------- ----------

    400000     400000


완전 복구가 되었다...훌륭하네!ㅎㅎ

반응형