본문 바로가기
DB/ORACLE

Oracle FLASHBACK 에 대해 알아보자(데이터복원)

by 애플 로그 2023. 2. 6.
반응형

Oracle FLASHBACK 에 대해 알아보자(데이터복원)

DB 조작중 데이터를 실수로 삭제하거나 데이터값을 잘못 변경하는 실수가 가끔 발생을 한다
이러한 오류를 바로 인식할 경우는 rollback이라는 명령으로 복구하지만,
commit을 한 이후 시점이나, 한참시간이 지난후에 알았다면 아주 난감할수 있다.ㅠ_ㅠ
이러한 경우 특정한 시간 또는 시점으로 되돌릴수 있는 기능이 Oracle Flashback 입니다.

 

FLASHBACK 을 사용하기위한 요구조건

SHOW PARAMETER UNDO; 
UNDO_MANAGEMENT = AUTO 로 설정되어있으야 합니다.
SELECT * FROM V$VERSION; -- oracle enterprise 버전만 가능 express 버전 X
-- flashback 사용시 --  ORA-00439: feature not enabled: Flashback Table 에러 발생

 

 

 

1. DELETE 데이터 복원 시나리오 / ROW LEVEL FLASHBACK

 

1) commit SCN 넘버 확인 하기 
  select versions_startscn st_scn, versions_endscn endscn, versions_xid txid, versions_operation opt
  , YNKIM.T_A.*
  from YNKIM.T_A
  versions between scn minvalue and maxvalue; -- opt 에서 D 값 이전 st_scn번호를 확인한다.


조회결과


    ST_SCN     ENDSCN TXID             Opt  A          B        
---------- ---------- ---------------- - ---------- ----------
3815692055            370017008F1E0000 D 222        222     
3815692055            370017008F1E0000 D 111        111      
3815682739            41001500BC160000 I 222        222     
3815682739            41001500BC160000 I 111        111      


조회내용에서 opt컬럼을 보면 INSERT, DELETE를 한것을 확인할수 있다.
INSERT 당시의 데이터로 복원을 할 경우 st_scn 을 확인 한다.. 




2) 시점으로 확인하기


SELECT * FROM  YNKIM.T_A AS OF TIMESTAMP ( SYSTIMESTAMP - INTERVAL '10' MINUTE); -- 10분전 테이블 데이터 조회


SELECT * FROM TEST_TABLE AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY); -- 1일전 테이블 데이터 조회

 select * from  EER_YNKIM.T_A
       as of timestamp to_timestamp('20170117163000','yyyyMMdd hh24:mi:ss'); 
 -- 1월 17일 16시30분 데이터 조회

위 단계에서 적은 데이터 또는 ROW 단위의 복원이라면, 
데이터 확인후 수동으로 update, insert 쿼리를 작성하여 원복이 가능하겠다. 

 

 

TABLE FLASHBACK 실행

1) commit SCN 넘버 기준으로 되돌리기
flashback table  YNKIM.T_A to scn '3815569377'; 
-- delete 이전 st_scn 확인하여 flashback 실행




ALTER TABLE  YNKIM.T_A ENABLE ROW MOVEMENT;  -- 에러 발생시조치 :  ORA-08189: 행 이동이 사용으로 설정되지 않았으므로 테이블을 플래시백할 할수없음. 




2) 시점으로 되돌리기
FLASHBACK TABLE  YNKIM.T_A TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE); -- 10분전으로 되돌리기


3) backup table 생성을 통한 복구


       create table [신규테이블명] as
       select * from  [테이블명]
       as of timestamp to_timestamp('[삭제 및 수정 시간]','yyyyMMdd hh24:mi:ss')

 

2. DROP 테이블 복원 시나리오 - 사용자계정에서 가능

create table t_table
(
  aa varchar2(20),
  bb varchar2(20)
);

declare
i_cnt number := 0;
begin
for i_cnt in 1 .. 5000 loop
  insert into t_table(aa,bb)  values('테스트'||i_cnt,'안녕'||i_cnt);
end loop;
end;

commit;

drop table t_table; -- 앗, 테이블 지우면 안되는데..

show recyclebin; -- 휴지통 확인


ORIGINAL NAME RECYCLEBIN NAME                OBJECT TYPE DROP TIME           
------------- ------------------------------ ----------- ------------------- 
T_TABLE       BIN$RkW5eyI7OrrgUAB/AQAozg==$0 TABLE       2017-01-17:15:55:34 


select * from t_table;
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다.

망했다..

 

테이블 복원

-- 기존 테이블명으로 복원 
flashback table YNKIM.T_TABLE to before drop; -- 기존 테이블명 t_table 이름으로 복원


flashback table "BIN$RkW5eyI8OrrgUAB/AQAozg==$0" to before drop; -- 기존 테이블명 t_table 이름으로 복원 / RECYCLEBIN NAME으로 복원 시


-- 테이블명을 변경하여 복원
flashback table T_TABLE to before drop rename to T_RENAME;  -- t_rename으로 복원


flashback table "BIN$RkW5eyI8OrrgUAB/AQAozg==$0" to before drop rename to T_RENAME;

 

 

Recyblebin 삭제 

drop table t_table; -- recyblebin에 남기지 않고 삭제


purge table "[recyble name]"; -- recyclebin에서 삭제

댓글