Flashback row level
DB CAFE
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
목차
1 Row Level FlashBack[편집]
1.1 개요[편집]
- 테이블에 전체적인 영향을 주지 않고 특정 row 만 복구가 가능하다
- UNDO 를 이용한다.
- commit 된 데이터만 복구한다.
- 용도별로 Flashback Version Query, Falshback Transaction Query 으로 나눌 수 있다.
- 용도별 구분
- Flashback Version Query
- - 과거의 변경 이력을 조회한다.
- Falshback Transaction Query
- - 변경 작업을 취소하며, 궁극적으로 복구를 목적으로 한다.
- 용도별 구분
1.1.1 주의사항[편집]
- Row Level Flashback 은 Undo Data를 사용하므로 해당 rollback Segment 가 다른 트렌젝션 작업으로 덮어 써지는 경우에는 사용할 수 없다.
- 트렌젝션이 자주 일어나는 시스템이거나, 많은 시간이 흘러버린다면 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 변경 이력 조회[편집]
- 이력조회를 위해 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 권한 오류 발생시 권한부여[편집]
- 현재 유저에게 flashback_transction_query 에 대해 권한이 없다.
- 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';