개발은 너무해

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

Oracle/Oracle Recovery

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

까칠 평생초보 2012.09.23 16:08

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

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

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


테스트를 해보자.

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


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

0 Comments
댓글쓰기 폼