Oracle/백업&복구

백업&복구 13번째(Flashback) ; Row level Flashback

에몽이ㅋ 2012. 2. 19. 20:42
Flashback
백업파일복사 이런거 등등등 이용하나도 안하고, undo에 들어가 있는 놈을 이용해서
빛처럼 빠르게 원하는 table만 or 원하는 행만 or  데이터베이스도 가능, 과거로 돌리는 기능입니다.

단점 : 9i이후 사용가능하고, 만약에 undo data가 덮어쓰였으면 flashback 기능을 사용하지 못합니다.
   --> 개선 : 11g에서 undo data가 덮어쓰여질때를 대비해서, undo archive기능이 생깁니다.(Flashback Data Archive)

Flashback 의 3가지 level
1. Row level : 행단위 flashback
2. Table level : 테이블단위 flashback
3. Database level : 데이터베이스단위 flashback


1. Row level Flashback
  : Flashback Version Query를 사용해서 변경내용을 조회가능합니다.
이 후 변경내용을 토대로 update하던지, insert, delete하면됩니다.

첫번째방법 : 
select versions_startscn st_scn,  versions_endscn endscn,  versions_xid txid,
versions_operation opt, 테이블의컬럼이름(P.K.로 찾는게 찾기 쉽습니다)
from 테이블이름 versions between scn minvalue and maxvalue;
## 위 쿼리를 이용해서 변경내역을 찾을 수 있습니다.

두번째방법 : (어떤 특정시간대의 자료를 보고 싶을 때)
select 컬럼이름
from 테이블이름
as of timestamp( to_date('RRRR-MM-DD:HH24:MI:SS') ) 
    << as of timestamp(systimpstamp - interval '1' minute) 도 가능합니다.(1분전의 자료)
where 컬럼이름='조건'; (where절은 생략가능)


실행예제
SQL> update sample set rep='Tomas' where rep='Thompson';

2 rows updated.

SQL> select versions_startscn st_scn,  versions_endscn endscn,  versions_xid txid,
  2  versions_operation opt, REP, ITEM
  3  from sample versions between scn minvalue and maxvalue;

    ST_SCN     ENDSCN TXID             O REP             ITEM
---------- ---------- ---------------- - --------------- ---------------
   1068916            08001200DA020000 U Tomas           Binder
   1068916            08001200DA020000 U Tomas           Pencil
                                         Jones           Pencil
  ....생략....
                                         Jardine         Pencil
              1068916                    Thompson        Pencil
                                         Jones           Binder
                                         Morgan          Pencil
                                         Howard          Binder
   ....생략....
                                         Gill            Pencil
                                         Sorvino         Pen
              1068916                    Thompson        Binder
                                         Andrews         Pencil
                                         Jardine         Binder
                                         Jardine         Binder
                                         Andrews         Binder

45 rows selected.

위 결과를 보면, REP가 Thompson인 행들이 Tomas로 업데이트 된 내역을 확인할 수 있습니다.
다시 돌리고 싶으면, 원래대로 update해주면 됩니다.
SQL> update sample set rep='Thompson' where rep='Tomas';

2 rows updated.

** 참고
위 결과에서 나오는 SCN의 timpstamp를 조사하기
(원하는 시점으로 돌리기 위해서 조사할 필요가 있습니다.)

select scn_to_timestamp(scn_number) from dual;

역으로는
select timestamp_to_scn(to_date('2012-04-12:14:20')) from dual;