본문 바로가기

oracle

[ORACLE] FLASHBACK

728x90

Oracle Flashback

DB data 관리 중 데이터를 삭제(delete)하거나 데이터값을 잘못 변경(update)하는 경우 
commit 이전이라면 rollback 명령어로 변경내용을 원복 할 수 있다. 
하지만 commit 까지 수행한 경우 특정한 시간 또는 특정 시점으로 되돌릴수 있는 기능이 Oracle FlashBack 이다.

 

● dump파일 없이 논리적 장애를 (DML, DDL)을 빠르게 복구

 Oracle Enterprise 버전만 가능 

 row level, table level, database level 3개로 분류

 row level, table level : oracle 에서 기본 권한 사용 가능

 database level :  system 권한 필요, system down 후 진행

 undo_retention 파라미터에 설정된 시간 만큼 undo data를 유지 하겠다는 뜻이며, 결국 flash back query는 undo_retention 범위 안에서 유효


Oracle Flashback 사용벙법

1. row level

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

SQL> SELECT * FROM  SCOTT.EMP AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY); -- 하루 전 EMP 테이블 데이터 조회(undo_retention 시간이 86400(하루 이상 필요)) 

SQL> SELECT * FROM   SCOTT.EMP AS OF  TIMESTAMP TO_TIMESTAMP ('20230117133000','yyyyMMdd hh24:mi:ss'); -- 2023년 1월 17일 13:30 시점 데이터 조회

SQL> INSERT INTO SCOTT.EMP (SELECT * FROM SCOTT.EMP AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE) -- 10분전 EMP 테이블 데이터를 EMP 테이블로 INSERT
);

SQL> select versions_startscn start_scn, versions_endscn end_scn, versions_xid vxid, versions_operation vopt
, scott.emp.*
from scott.emp
versions between scn minvalue and maxvalue; -- opt 에서 D면 delete, I면 insert 

2. table level 

commit 이 발생하게 되면 LGWR에 해당 트랜잭션에 고유 scn(system commit number) 번호를 남기게 됩니다.
이 번호를 이용하여 복구 진행

 scn 이용하여 복구
SQL> select versions_startscn start_scn, versions_endscn end_scn, versions_xid vxid, versions_operation vopt
, scott.emp.*
from scott.emp
versions between scn minvalue and maxvalue; -- 조회한 start_scn 기준으로 롤백진행 준비

SQL> flashback table scott.emp to scn 'start_scn 번호 기입'; -- 변경 이전의 scn 넘버 입력

시점으로 테이블 복구
 
SQL> FLASHBACK TABLE SCOTT.EMP TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE);
-- 10분전으로 되돌리기

SQL> FLASHBACK TABLE SCOTT.EMP  TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
-- 1일전 테이블 데이터 복원

SQL> FLASHBACK TABLE SCOTT.EMP  TO timestamp to_timestamp('20230117133000','yyyyMMdd hh24:mi:ss');

※ ORA-01466: unable to read data - table definition has changed  에러 시 undo 에 원복 시킬 데이터 없을 때 발생

 

3. database 복구

sys 계정으로 수행

SQL> shutdown immediate;

SQL> startup mount; -- 마운트 상태에서 실행

SQL> flashback database to timestamp (systeimstamp - interval '10' minute);

SQL> alter database open resetlogs; 

SQL> select * from scott.emp;

 

728x90