물리적인 장애 : 디스크 장애나 서버 장애 등으로 인한 파일 손상
논리적인 장애 : 사용자의 실수나 오류로 발생한 장애
Flashback 기능은 사용자의 논리적 오류를 아주 빠르게 복구할 수 있는 방법이다.
물리적인 장애는 복구할 수 없다.
1. Row Level Flashback
2. Table Level Flashback
3. Database Level Flashback
1. Row Level Flashback
실무실습1 Row Level Flashback 실습
특정 Row 만 Flashback 하는 기능
9i 버전에서 Flashback Query 는 특정 시점의 변경 내역만 알 수 있었으나,
10g 부터 Version Query 가 추가되면서 구간 검색을 할 수 있게 되었습니다.
변경 사항을 취소시켜 이전 값으로 돌려주는 쿼리를 찾아주는 쿼리를
Flashback Transaction Query 라고 합니다.
SQL> select versions_startscn st_scn, versions_endscn endscn,
2 versions_xid txid, versions_operation opt, name
3 from h2 versions between scn minvalue and maxvalue
4 where addr=1 ;
ST_SCN ENDSCN TXID O NAME
---------- ---------- ---------------- - ----------
891650 0A00120012020000 U zzz
891602 891650 08001E006B020000 I a
아랫줄부터 먼저 변경된 내역입니다.
a 가 Insert (I) 되었다가 z 로 Update (U) 되었다는 의미입니다.
하나의 row 에 여러 사람이 DML 을 발생시킨 경우 Version Query 수행할 경우
여러 건의 변경 이력이 나올 수 있습니다.
해당 시간으로 추적할 수 있습니다.
SQL> select scn_to_timestamp(876036) from dual ;
SCN_TO_TIMESTAMP(891602)
---------------------------------------------------------------------------
31-DEC-13 03.36.10.000000000 PM
이렇게 변경 사항을 찾은 뒤 Transaction Query 를 수행해서 원래 데이터로 돌리면 됩니다.
Flashback Version Query 는 일반 사용자도 별다른 권한 없이 수행할 수 있지만
Flashback Transaction Query 는 Flashback_transaction_query 라는 뷰를 select 할 수 있는 권한이 있는 사람만 사용할 수 있습니다.
select any transaction 이라는 권한을 할당하고 scott 계정으로 계속 실습하겠습니다.
SQL> conn / as sysdba
SQL> grant select any transaction to scott ;
SQL> conn scott/tiger
SCOTT>select undo_sql from flashback_transaction_query
2 where table_name='h2'
3 and commit_scn between 891602 and 891650
4 order by start_timestamp desc ;
실무실습2 Undo segment 와의 관계 확인
Row Level Flashback 기능은 Undo data의 정보를 이용합니다.
만약 Undo segment 를 다른 트랜잭션에서 재사용하면 이 기능을 이용하여 Flashback 할 수 없게 됩니다.
commit 이 발생한지 오래 지난 데이터나 트랜잭션이 많이 일어나는 경우
undo segment 를 다른 사용자가 재사용할 확률이 높은 경우에는
Flashback Version Query 로 복구가 불가능합니다.
11g 에서는 이러한 사태를 막기 위해
Flashback Data Archive 라는 기능을 제공합니다.
2. Table Level Flashback
dml 에러가 발생했을 때 특정 테이블 전체를 장애 발생 전 상태로 Flashback 하는 방법입니다.
dml 에러 발생, drop table 되었을 때 사용하는 방법이 있으며 복구 방법이 다릅니다.
실무실습3 SCN 으로 DML 복구하기 - undo data 사용
테이블 삭제
SCOTT> delete from i1 ;
SCOTT> commit ;
SCN 보기
SCOTT> select current_scn from v$database ;
이 기능을 사용하려면 row movement 라는 속성이 enable 되어 있어야 한다.
SCOTT> alter table i1 enable row movement ;
scn 으로 복구
SCOTT> flashback table i1 to scn '640524' ;
하지만 실제 dml 작업시 scn 을 기록해두지 않기 때문에 이 방법은 잘 쓰지 않는다.
실무실습4 Row movement 사용시 주의사항
특정 테이블의 row movement 속성을 enable 할 경우 그 테이블과 연관된 다른 기능들이 사용할 수 없게 되는 (invalid) 경우가 발생합니다.
SQL> select object_name, object_type, status
2 from dba_objects
3 where owner='SCOTT'
4 and object_name like 'IBGO%' ;
object 의 상태가 VALID 인 것을 확인
SQL> alter table i1 disable row movement ;
SQL> select object_name, object_type, status
2 from dba_objects
3 where owner='SCOTT'
4 and object_name like 'IBGO%' ;
invalid 상태로 변경됨
Flashback table 을 사용하기 위해 row movement 를 enable 로 변경하였다면 반드시 해당 테이블과 연관되어 있는 view 를 확인하시기 바랍니다.
11g 부터는 이 기능이 개선되어 모두 valid 상태입니다.
실무실습5 시간으로 DML 에러 복구하기 - undo data 사용 (실제로 가장 많이 쓰는 방법임)
분 단위
SCOTT> flashback table i1 to timestamp (systimestamp - interval '5' minute) ;
초 단위
SCOTT> flashback table i1 to timestamp (systimestamp - interval '30' second) ;
이 방법 역시 undo data 를 이용하기 때문에 오래 전 데이터는 Flashback 할 수 없을 가능성도 많다는 것을 기억하세요.
실무실습6 Flashback 으로 복구가 안되는 경우
undo segement 에 해당 내역이 없으면 복구할 수 없습니다.
SCOTT> flashback table i1 to timestamp (systimestamp - interval '70' minute) ;
너무 오래 전 시간으로 돌려서 undo 에러가 발생했습니다.
SCOTT> alter table i1
2 add (price number) ;
SCOTT> update i1 set name='xxx'
잘못된 update 수행
SCOTT> commit ;
SCOTT> alter table i1
2 drop column price ;
SCOTT> flashback table i1 to timestamp (systimestamp - interval '2' minute) ;
테이블 구조가 변경된 후에는 복구할 수 없습니다.
잠시 기다렸다가 다시 수행
SCOTT> flashback table i1 to timestamp (systimestamp - interval '2' minute) ;
Flashback 수행은 되지만 데이터가 돌아가지 않음
실무실습7 drop table 복구하기 - 휴지통 기술 이용
7-1 drop table 복구하기
SCOTT> drop table i1;
SCOTT> select * from tab ;
휴지통으로 옮겨짐 (테이블명이 Bin$... 로 바뀜)
휴지통 확인하기
SCOTT> show recyclebin
테이블 복구
SQL> flashback table i1 to before drop ;
SCOTT> select * from tab ;
복구되었음
7-2 drop table 의 경우 recyclebin 위치 확인
삭제된 테이블은 다른 곳으로 옮겨지지 않고 해당 테이블스페이스에 그대로 남아있다.
테이블이 지워지면 휴지통으로 옮겨지고 모든 데이터도 그대로 남아있다. 그 휴지통은 해당 테이블스페이스에 있다.
drop table 기능은 삭제된 테이블을 영원히 저장하고 있다가 복구시킨다는 의미가 아니라
특정 시간이 지나 테이블이 차지하던 공간이 다른 테이블에 의해 재사용되는 시점이 되면 더이상 복구할 수 없게 된다는 의미다.
휴지통 비우기
SCOTT> show recyclebin ;
test1 테이블만 삭제
SCOTT> purge table test1 ;
SCOTT> show recyclebin ;
휴지통 전체를 비우는 방법
SCOTT> purge recyclebin ;
휴지통에 넣지 않고 완전히 삭제하는 방법
SCOTT> drop table test2 purge ;
SYS> select substr(object_name, 1, 50) as name, object_type, owner
2 from dba_objects
3 where object_name like '%RECYCLEBIN%'
앞에서 보는 바와 같이 recyclebin 의 종류는 9개가 있습니다.
기본적으로 sys 사용자의 table 은 휴지통으로 들어가지 않고 purge 됩니다.
그러나 sys 사용자가 다른 사용자 소유의 테이블을 삭제할 경우는 해당 사용자의 user_recyclebin 에 지워진 테이블이 저장됩니다.
SYS> create table scott.tbl100 (no number) ;
SYS> insert into scott.tbl100 values (1) ;
SYS> commit ;
SYS> drop table scott.tbl100 ;
SYS> select object_name, original_name, type, droptime
2 from dba_recyclebin
3 where original_name='TBL100' ;
SYS> conn scott/tiger
SCOTT> show recyclebin ;
recyclebin 기능을 사용하지 않으려면
SYS> select a.ksppinm, b.ksppstvl, b.ksppstdf
2 from x$ksppi a, x$ksppcv b
3 where a.indx = b.indx
4 and a.ksppinm like '%recyclebin%'
5 order by a.ksppinm
현재 세션에만 off 시킴, 전체를 off 시키려면 alter system set 으로
SYS> alter session set recyclebin=off ;
실무실습 8 테이블 drop 후 다른 object 확인하기
flashback 으로 테이블을 삭제하면 해당 테이블과 관련된 모든 object 들도 함께 삭제됩니다.
그리고 해당 테이블이 flashback 으로 복구되면 다른 object 들도 복구 되는데
이번 실습에서는 과자 테이블에 constraint 와 index, view 를 생성한 후 drop table 해서
다른 object 들이 어떻게 되는지와
flashback 으로 과자 테이블을 복구한 후 다른 object 들이 어떻게 되는지 확인하겠습니다.
STEP1 테이블과 관련된 object 생성
SCOTT>create table g1
2 (no number, name varchar2(20)) ;
SCOTT>insert into g1 values(1,'a') ;
SCOTT>insert into g1 values(2, 'b') ;
SCOTT>insert into g1 values(3, 'c') ;
SCOTT>commit ;
아래는 sys로
SCOTT>create index g1_name_idx on g1(name) ;
SCOTT>create view g1_v as select name from g1 ;
SCOTT>alter table g1 modify name constraint g1_name_nn not null ;
STEP2 테이블 DROP 하고 다른 object 확인
drop table 과자;
show recyclebin ;
@stats
@cons
STEP3 Flashback 으로 삭제된 테이블 복구한 후 다른 object 상태 조회
SCOTT> flashback table 과자 to before drop ;
SCOTT> select * from tab ;
SCOTT> @stats
여전히 사용 불가
SCOTT> @cons
SCOTT> insert into
13.3 Flashback 명령어 사용할 수 없는 경우
(1) 물리적인 장애 - 파일 (data file, redo log file, control file) 이 삭제된 경우
(2) System Tablespace 에 있던 테이블이 삭제되면 flashback table to before drop 안됨
(3) Control File 재생성하면
(4) Tablespace 가 drop 되면
(5) Data file 이 shrunk 되면
(6) Alter table 로 테이블 구조가 변경되면 Version query 로 복구 안됨
(7) System tables 와 통계 정보는 Flashback 명령어로 복구 안됨
(8) Purge 된 테이블은 flashback 명령어로 복구 안됨
(9) 테이블과 별도로 삭제된 인덱스
(10) Mview