FLASHBACK - 1 - [ Row Level Flashback ]

특징 
용도별 구분
 - Flashback Version Query
 - Flashback Transaction Query
주의사항

실습

테이블 생성

데이터 입력

데이터 변경

변경 이력 조회 

복구



flashback 기능은 논리적인 실수를 빠르게 복구 할 수 있다.
단, 물리적인 실수는 장애에는 사용이 불가능하고 또한 모든 논리적인 실수에 대해 방법을 제시하지는 않는다.

예를들어 실수로 테이블을 삭제 한 경우로 비교해보자면 과거에는 시간기반불안전 복구를 사용하여 데이터를 살려내야 했다. 하지만 10g 에서 테이블을 purge 옵션을 사용하지 않고 drop 을 하면 recycle bin (휴지통?) 상태가 된다. 이때 간단한 명령어로 살려낼 수 있다. 

Flashback 은 3개의 Level 에 대해 해결책을 제시해준다.

1. Row Level
2. Table Level
3. Database Level 


Row Level
특징
- 특정 row 에 대해서 복구를 해준다. 이때 다른 row , 즉 테이블에 전체적인 영향을 주지 않고 특정 row 만 복구가 가능하다 
- UNDO 를 이용한다.
- commit 된 데이터만 복구한다.
- 용도별로 Flashback Version Query, Falshback Transaction Query 으로 나눌 수 있다.

용도별 구분
Flashback Version Query
- 과거의 변경 이력을 조회한다.

Falshback Transaction Query  

- 변경 작업을 취소하며, 궁극적으로 복구를 목적으로 한다.


☆☆주의사항☆☆
Row Level Flashback 은 Undo Data를 사용하므로 해당 rollback Segment 가 다른 트렌젝션 작업으로 덮어 써지는 경우에는 사용할 수 없다. 즉 트렌젝션이 자주 일어나는 시스템이거나, 시간이 흘러버린다면 Row Level Flashback 사용이 불가능하며, 이 때는 clone Database 를 이용하여 시간기반으로 데이터를 복구해야 한다.




실습

1. 테이블 생성
2. 데이터 입력
3. 데이터 변경
4. 변경 이력 조회
5. 복구



1. 테이블 생성
 create table map (key varchar2(20), name varchar2(20)) tablespace example;
key 와 name 으로 이루어진 간단한 테이블을 생성한다.

2. 데이터 입력

SQL> insert into map values ('동물', '강아지');

1 row created.

SQL> insert into map values ('바다','배');

1 row created.

SQL> insert into map values ('하늘','비행기');

1 row created.

SQL> commit;

Commit complete.
-
3. 데이터 변경

SQL> update map set name='배' where key='하늘';

1 row updated.

SQL> update map set name='비행기' where key='바다';

1 row updated.

SQL> commit;

Commit complete.
-

4. 변경 이력 조회
이력조회를 위해서는 Flashback Version Query 를 수행한다. 
select
        versions_startscn st_scn
,       versions_endscn endscn
,       versions_xid txid
,       versions_operation opt
,       &targetColumn
from
        &tableName versions between scn minvalue and maxvalue
where &whereColumn = &value
--

변수 설명
targetColumn : 변경이 일어난 컬럼 명 tableName : 변경이 일어난 테이블 명
whereColumn : 변경이 일어난 컬럼을 찾기위해 조건에 들어갈 컬럼
value : 조건 컬럼의 값
 
실행

Enter value for targetcolumn: name

old   6: ,       &targetColumn

new   6: ,       name

Enter value for tablename: map

old   8:         &tableName versions between scn minvalue and maxvalue

new   8:         map versions between scn minvalue and maxvalue

Enter value for wherecolumn: key

Enter value for value: '하늘'

old   9: where &whereColumn = &value

new   9: where key = '하늘'


    ST_SCN     ENDSCN TXID             O NAME

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

    604368            08002A004A010000 U 배

    604359     604368 0700290028010000 I 비행기


 
분석 
위의 결과값을 보면 처음에 '비행기'라는 값을 Insert 했고 '배'로 Update 한 것을 알 수 있다.

발생 시점을 시간으로 보고 싶다면 아래와 같이 scn_to_timestamp(scn) 함수를 사용하면 된다.
	SQL>select to_char(scn_to_timestamp(604368), 'YYYY-MM-DD:HH24:MI:SS') from dual;

TO_CHAR(SCN_TO_TIME
-------------------
2012-04-03:23:16:10

 5. 복구 

	
select
        undo_sql
from
        flashback_transaction_query
where
        table_name='&tableName'
AND     commit_scn between &st_scn and &end_scn
order by
        start_timestamp desc
--

Enter value for tablename: MAP

old   6:        table_name='&tableName'

new   6:        table_name='MAP'

Enter value for st_scn: 604359

Enter value for end_scn: 604368

old   7: AND    commit_scn between &st_scn and &end_scn

new   7: AND    commit_scn between 604359 and 604368

        flashback_transaction_query

        *

ERROR at line 4:

ORA-01031: insufficient privileges


권한부여
현재 유저에게 flashback_transction_query 에 대해 권한이 없다.
sys 사용자로 접속하여 " select any transaction " 권한을 부여 한다.

grant select any transaction to scott;

Grant succeeded.



재시도

UNDO_SQL

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

update "SCOTT"."MAP" set "NAME" = '배' where ROWID = 'AAAM40AAFAAAAQkAAB';

update "SCOTT"."MAP" set "NAME" = '비행기' where ROWID = 'AAAM40AAFAAAAQkAAC';

delete from "SCOTT"."MAP" where ROWID = 'AAAM40AAFAAAAQkAAB';

delete from "SCOTT"."MAP" where ROWID = 'AAAM40AAFAAAAQkAAC';

delete from "SCOTT"."MAP" where ROWID = 'AAAM40AAFAAAAQkAAA';







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

FLASHBACK - 3 - [ Database Level Flashback ]  (0) 2012.04.06
FLASHBACK - 2 - [ Table Level Flashback ]  (0) 2012.04.05
datapump &  (0) 2012.04.04
EM Agent Connection to Instance 오류  (0) 2012.03.29
Block Corruption -작성중-  (0) 2012.03.12