행위

Flashback row level

DB CAFE

thumb_up 추천메뉴 바로가기


1 Row Level FlashBack[편집]

1.1 개요[편집]

android # 테이블에 전체적인 영향을 주지 않고 특정 row 만 복구가 가능하다

  1. UNDO 를 이용한다.
  2. commit 된 데이터만 복구한다.
  3. 용도별로 Flashback Version Query, Falshback Transaction Query 으로 나눌 수 있다.
    • Flashback Version Query
    - 과거의 변경 이력을 조회한다.
    • Falshback Transaction Query
    - 변경 작업을 취소하며, 궁극적으로 복구를 목적으로 한다.


1.1.1 주의사항[편집]

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

1.2 실습 시나리오[편집]

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

1.2.1 테이블 생성[편집]

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

1.2.2 데이터 입력[편집]

SQL> insert into map values ('동물', '강아지');
SQL> insert into map values ('바다','배');
SQL> insert into map values ('하늘','비행기');
SQL> commit;

1.2.3 데이터 변경[편집]

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

1.2.4 변경 이력 조회[편집]

  1. 이력조회를 위해 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 : 조건 컬럼의 값

1.2.5 변경 이력 확인[편집]

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')  -- 위 결과에서 나온  SCN 으로 시간 조회 
      from dual;

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

1.2.6 복구[편집]

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
1.2.6.1 권한 오류 발생시 권한부여[편집]
  1. 현재 유저에게 flashback_transction_query 에 대해 권한이 없다.
  2. sys 사용자로 접속하여 " select any transaction " 권한을 부여 한다.
grant select any transaction to scott;

1.2.7 재시도[편집]

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

-------------------------------------------------------
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';