FLASHBACK - 2 - [ Table Level Flashback ]

Table Level Flashback

앞서 올렸던 Row Level Flashback에 이어 Table Level의 Flashback 이다. 이 Table Level 은 다른 테이블에 영향을 주지 않고 대상이 되는 테이블만 복구하는 기술이다.

이 Table Level Flashback 은 두가지 방법으로 나눌 수 있다.
- SCN 기반 Flashback
- 시간 기반 Flashback

주의사항
테이블의 Alter 명령어로 변경되면 변경전으로 Flashback을 사용하지 못한다
 


SCN 기반 Flashback

이벤트가 발생하기 전의 SCN 을 이용한 Flashback 기능을 사용하는 방법이다.
 이 방법은 이벤트를 발생시키기 전에 미리 SCN을 기록해 두거나 
 앞선 포스팅에서 봤던 (4. 변경 이력 조회) 방법등으로 알아낸SCN 을 이용하여 Table Level 의 Flashback 방법이다. 

전제 조건
Flashback을 사용하는 테이블은 row movement 가 활성화되어 있어야 한다. 자세한 내용은 아래 시나리오를 보자.



시나리오
앞선 포스팅에서 만든 테이블을 가지고 SCN 기반 Flashback 을 하도록 한다.

테이블 생성, 입력, 변경, 변경이력 조회는 아래 링크를 통해 살펴보자.
1. 테이블 생성

2. 데이터 입력



SQL> show user
USER is "SCOTT"

SQL> flashback table map to scn '604359'

ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled

SQL> ALTER table map enable row movement;

Table altered.

 SQL> flashback table map to scn '604359';

Flashback complete.
-
highlight 설명
1 line : 현재 작업하는 유저는 scott이다.
4 line : 테이블 레벨에서 SCN 604359 으로 Flashback 을 시도한다. 
 - 이 값은 앞선 포스팅에서( 4. 변경 이력 조회 ) 조회된 값이다.
 - 삭제전에 현재 SCN 조회를 하여 기록해 놨던 SCN 으로 사용해도 된다. 
7 line : 테이블에 row movement 가 설정되어 있지 않아서 메시지가 표시된다.
9 line : 테이블에 row movement 를 활성화한다.
13 line : flashback 을 재시도 한다.


현재 scn 조회
select current_scn from v$database;

CURRENT_SCN
-----------
     611387
-- 




시간 기반 Flashback

위의 SCN 과 마찬가지로 undo 를 사용하며 시간을 기반으로 Flashback 기능을 사용한다.

실습

대상 테이블 조회

SQL> select * from map;


KEY                  NAME

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

동물                 강아지

바다                 배

하늘                 비행기




장애 발생

SQL> delete from map;


3 rows deleted.



복구
--
SQL> flashback table map to timestamp(systimestamp - interval '2' minute);

Flashback complete.
--  

위의 문법중 systimestamp - intervla '2' minute 의 자세한 설명은 Literal( http://tawool-oracle.tistory.com/252 ) 을 참고한다.


관련 에러

데이터를 조회할 수 없음

ORA-01466: unable to read data - table definition has changed


시간을 너무 뒤로 돌려서 해당 테이블이 존재하지 않은 시간대를 선택했거나, alter 명령어로 테이블을 수정시 수정 전 시간으로 Flashback 을 시도하면 위와같은 에러 발생


UNDO Data가 없을때

ORA-00604 : error occurred at recusive SQL...
ORA-12801 error signaled in parallel...
ORA-01555 : snapshot too old : rollback segment number ... 





Recycle Bin

이 기능은 윈도우의 휴지통같은 기능이다. 테이블을 drop 할때 purge 옵션을 주지 않으면 완전히 삭제되지 않고 복구가 가능한 상태로 바뀌게 되는데. 삭제되어 복구가 가능한 테이블들은 조회 할 수 있으며 복구 할 수 있다.

주의사항
- 테이블이 삭제되면 다른영역으로 이동하는것이 아니라 상태만 변경된다. 그래서 테이블스페이스에 공간이 부족하게되면 우선적으로 recycle bin 이 차지하고 있는 영역을 사용하게 되는데 그러면 recycle bin 을 이용하여 복구가 불가능하다.

- 인덱스가 존재하는 테이블을 삭제하고 flashback 을 사용하여 복구하면 인덱스도 같이 복구 된다. 하지만 인덱스 명이 BIN$. 으로 시작하므로 이름을 변경시켜 주던지 아니면 삭제하고 다시 생성한다.

인덱스 조회
--
select table_name, column_name,, index_name
fromuser_ind_columns
where table_name='&tableName'
--

조회

아래에서 간단하게 두가지 예를 들어 설명한다.

SQL> drop table map;


Table dropped.


SQL> select * from tab;


TNAME                          TABTYPE  CLUSTERID

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

DEPT                           TABLE

EMP                            TABLE

BONUS                          TABLE

SALGRADE                       TABLE

BIN$vL0lpMaYHDDgQAB/AQA0Tw==$0 TABLE

SYS_TEMP_FBT                   TABLE



SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
MAP              BIN$vM4c+mQ5ZZ/gQAB/AQBU0Q==$0 TABLE        2012-04-04:06:37:26


select * from tab; 명령을 통한 조회에서는 이름만 표시되고 있으며 show recyclebin 명령은 원본 명과 recycle 명 타입 삭제된 시간 등을 알 수 있다.

복구
--
-- drop 한 테이블 명으로 복구
flashback table map to before drop;

-- recycle bin name 으로 복구
flashback table "BIN$vM4c+mQ5ZZ/gQAB/AQBU0Q==$0" to before drop;

-- ORA-38312: original name is used by an existing object 이미 존재하는 경우 새이름으로 복구
flashback table "BIN$vM4c+mQ5ZZ/gQAB/AQBU0Q==$0" to before drop rename to map2;

--

purge recycle bin 

-- 특정 테이블 purge
purge table map;

-- recyclebin 전체 purge
purge recyclebin;

-- 테이블 삭제시 purge
- drop table map purge;
--












'Oracle > 백업 & 복구 & 장애' 카테고리의 다른 글

RMAN ( Recovery Manager )  (2) 2012.04.06
FLASHBACK - 3 - [ Database Level Flashback ]  (0) 2012.04.06
FLASHBACK - 1 - [ Row Level Flashback ]  (0) 2012.04.05
datapump &  (0) 2012.04.04
EM Agent Connection to Instance 오류  (0) 2012.03.29